LEDマトリックスユニット 2枚使用 スクロール文字

Dependencies:   mbed

Committer:
takeuchi
Date:
Wed Jun 01 02:29:56 2016 +0000
Revision:
0:6ed0148a017a
LED????2???

Who changed what in which revision?

UserRevisionLine numberNew contents of line
takeuchi 0:6ed0148a017a 1 // LedMatrix 2mai
takeuchi 0:6ed0148a017a 2
takeuchi 0:6ed0148a017a 3 #include "mbed.h"
takeuchi 0:6ed0148a017a 4
takeuchi 0:6ed0148a017a 5 DigitalOut led(dp28);
takeuchi 0:6ed0148a017a 6
takeuchi 0:6ed0148a017a 7 // spi(mosi,miso,sck)
takeuchi 0:6ed0148a017a 8 SPI max72_spi(dp2, NC, dp6);
takeuchi 0:6ed0148a017a 9 DigitalOut load(dp14);//spi load
takeuchi 0:6ed0148a017a 10
takeuchi 0:6ed0148a017a 11 // CPU MT7219
takeuchi 0:6ed0148a017a 12 // dp1 mosi(Master In Salve Out) => DIN
takeuchi 0:6ed0148a017a 13 // dp2 miso(Master OutSlave) => nc
takeuchi 0:6ed0148a017a 14 // dp6 sck (Serial Clock) => clk
takeuchi 0:6ed0148a017a 15 // dp14 =>(Slave Select) load
takeuchi 0:6ed0148a017a 16
takeuchi 0:6ed0148a017a 17 int maxInUse = 2; //change this variable to set how many MAX7219's you'll use
takeuchi 0:6ed0148a017a 18
takeuchi 0:6ed0148a017a 19 // define max7219 registers
takeuchi 0:6ed0148a017a 20 #define max7219_reg_noop 0x00
takeuchi 0:6ed0148a017a 21 #define max7219_reg_digit0 0x01
takeuchi 0:6ed0148a017a 22 #define max7219_reg_digit1 0x02
takeuchi 0:6ed0148a017a 23 #define max7219_reg_digit2 0x03
takeuchi 0:6ed0148a017a 24 #define max7219_reg_digit3 0x04
takeuchi 0:6ed0148a017a 25 #define max7219_reg_digit4 0x05
takeuchi 0:6ed0148a017a 26 #define max7219_reg_digit5 0x06
takeuchi 0:6ed0148a017a 27 #define max7219_reg_digit6 0x07
takeuchi 0:6ed0148a017a 28 #define max7219_reg_digit7 0x08
takeuchi 0:6ed0148a017a 29 #define max7219_reg_decodeMode 0x09
takeuchi 0:6ed0148a017a 30 #define max7219_reg_intensity 0x0a
takeuchi 0:6ed0148a017a 31 #define max7219_reg_scanLimit 0x0b
takeuchi 0:6ed0148a017a 32 #define max7219_reg_shutdown 0x0c
takeuchi 0:6ed0148a017a 33 #define max7219_reg_displayTest 0x0f
takeuchi 0:6ed0148a017a 34
takeuchi 0:6ed0148a017a 35 #define LOW 0
takeuchi 0:6ed0148a017a 36 #define HIGH 1
takeuchi 0:6ed0148a017a 37 #define MHZ 1000000
takeuchi 0:6ed0148a017a 38 #define ON 1
takeuchi 0:6ed0148a017a 39 #define OFF 0
takeuchi 0:6ed0148a017a 40
takeuchi 0:6ed0148a017a 41 void maxSingle( int reg, int col) {
takeuchi 0:6ed0148a017a 42 //maxSingle is the "easy" function to use for a
takeuchi 0:6ed0148a017a 43 //single max7219
takeuchi 0:6ed0148a017a 44 load = LOW; // begin
takeuchi 0:6ed0148a017a 45 max72_spi.write(reg); // specify register
takeuchi 0:6ed0148a017a 46 max72_spi.write(col); // put data
takeuchi 0:6ed0148a017a 47 load = HIGH; // make sure data is loaded (on rising edge of LOAD/CS)
takeuchi 0:6ed0148a017a 48 }
takeuchi 0:6ed0148a017a 49
takeuchi 0:6ed0148a017a 50 void maxAll (int reg, int col) { // initialize all MAX7219's in the system
takeuchi 0:6ed0148a017a 51 load = LOW; // begin
takeuchi 0:6ed0148a017a 52 for ( int c=1; c<= maxInUse; c++) {
takeuchi 0:6ed0148a017a 53 max72_spi.write(reg); // specify register
takeuchi 0:6ed0148a017a 54 max72_spi.write(col); // put data
takeuchi 0:6ed0148a017a 55 }
takeuchi 0:6ed0148a017a 56 load = HIGH;
takeuchi 0:6ed0148a017a 57 }
takeuchi 0:6ed0148a017a 58
takeuchi 0:6ed0148a017a 59 void maxOne(int maxNr, int reg, int col) {
takeuchi 0:6ed0148a017a 60 //maxOne is for adressing different MAX7219's,
takeuchi 0:6ed0148a017a 61 //while having a couple of them cascaded
takeuchi 0:6ed0148a017a 62 int c = 0;
takeuchi 0:6ed0148a017a 63 load = LOW;
takeuchi 0:6ed0148a017a 64
takeuchi 0:6ed0148a017a 65 for ( c = maxInUse; c >= maxNr; c--) {
takeuchi 0:6ed0148a017a 66 max72_spi.write(0); // no-op
takeuchi 0:6ed0148a017a 67 max72_spi.write(0); // no-op
takeuchi 0:6ed0148a017a 68 }
takeuchi 0:6ed0148a017a 69
takeuchi 0:6ed0148a017a 70 max72_spi.write(reg); // specify register
takeuchi 0:6ed0148a017a 71 max72_spi.write(col); // put data
takeuchi 0:6ed0148a017a 72
takeuchi 0:6ed0148a017a 73 for ( c=maxNr-1; c >= 1; c--) {
takeuchi 0:6ed0148a017a 74 max72_spi.write(0); // no-op
takeuchi 0:6ed0148a017a 75 max72_spi.write(0); // no-op
takeuchi 0:6ed0148a017a 76 }
takeuchi 0:6ed0148a017a 77 load = HIGH;
takeuchi 0:6ed0148a017a 78 }
takeuchi 0:6ed0148a017a 79
takeuchi 0:6ed0148a017a 80 void setup () {
takeuchi 0:6ed0148a017a 81 // initiation of the max 7219
takeuchi 0:6ed0148a017a 82 // SPI setup: 8 bits, mode 0
takeuchi 0:6ed0148a017a 83 max72_spi.format(8, 0);
takeuchi 0:6ed0148a017a 84
takeuchi 0:6ed0148a017a 85 // going by the datasheet, min clk is 100ns so theoretically 10MHz should work...
takeuchi 0:6ed0148a017a 86 // max72_spi.frequency(10*MHZ);
takeuchi 0:6ed0148a017a 87
takeuchi 0:6ed0148a017a 88 maxAll(max7219_reg_scanLimit, 0x07);
takeuchi 0:6ed0148a017a 89 maxAll(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits)
takeuchi 0:6ed0148a017a 90 maxAll(max7219_reg_shutdown, 0x01); // not in shutdown mode
takeuchi 0:6ed0148a017a 91 maxAll(max7219_reg_displayTest, 0x00); // no display test
takeuchi 0:6ed0148a017a 92 for (int e=1; e<=8; e++) { // empty registers, turn all LEDs off
takeuchi 0:6ed0148a017a 93 maxAll(e,0);
takeuchi 0:6ed0148a017a 94 }
takeuchi 0:6ed0148a017a 95 maxAll(max7219_reg_intensity, 0x0f & 0x0f); // the first 0x0f is the value you can set
takeuchi 0:6ed0148a017a 96 // range: 0x00 to 0x0f
takeuchi 0:6ed0148a017a 97 }
takeuchi 0:6ed0148a017a 98
takeuchi 0:6ed0148a017a 99 void led_flash(){
takeuchi 0:6ed0148a017a 100 int i;
takeuchi 0:6ed0148a017a 101 for(i=0;i<3;i++){
takeuchi 0:6ed0148a017a 102 led=ON;
takeuchi 0:6ed0148a017a 103 wait(0.1);
takeuchi 0:6ed0148a017a 104 led=OFF;
takeuchi 0:6ed0148a017a 105 wait(0.1);
takeuchi 0:6ed0148a017a 106 }
takeuchi 0:6ed0148a017a 107 }
takeuchi 0:6ed0148a017a 108
takeuchi 0:6ed0148a017a 109 int main(void) {
takeuchi 0:6ed0148a017a 110
takeuchi 0:6ed0148a017a 111 const uint64_t moji_font[] = {// bold font , kagami moji font
takeuchi 0:6ed0148a017a 112 0x3c66666e76663c00,//0~9
takeuchi 0:6ed0148a017a 113 0x7e1818181c181800,
takeuchi 0:6ed0148a017a 114 0x7e060c3060663c00,
takeuchi 0:6ed0148a017a 115 0x3c66603860663c00,
takeuchi 0:6ed0148a017a 116 0x30307e3234383000,
takeuchi 0:6ed0148a017a 117 0x3c6660603e067e00,
takeuchi 0:6ed0148a017a 118 0x3c66663e06663c00,
takeuchi 0:6ed0148a017a 119 0x1818183030667e00,
takeuchi 0:6ed0148a017a 120 0x3c66663c66663c00,
takeuchi 0:6ed0148a017a 121 0x3c66607c66663c00,
takeuchi 0:6ed0148a017a 122 };
takeuchi 0:6ed0148a017a 123
takeuchi 0:6ed0148a017a 124 int i,j,k;
takeuchi 0:6ed0148a017a 125 uint8_t bitsum[1][8],bit1gyou,bitline[80];
takeuchi 0:6ed0148a017a 126 uint64_t moji1;
takeuchi 0:6ed0148a017a 127
takeuchi 0:6ed0148a017a 128 setup();
takeuchi 0:6ed0148a017a 129 led_flash();
takeuchi 0:6ed0148a017a 130 wait(0.1);
takeuchi 0:6ed0148a017a 131
takeuchi 0:6ed0148a017a 132 while(1){
takeuchi 0:6ed0148a017a 133
takeuchi 0:6ed0148a017a 134 for(i=0;i<10;i++){
takeuchi 0:6ed0148a017a 135 moji1=moji_font[i];// 0~9
takeuchi 0:6ed0148a017a 136 for(j=0;j<8;j++){
takeuchi 0:6ed0148a017a 137 bitsum[i][j]=0;
takeuchi 0:6ed0148a017a 138 }
takeuchi 0:6ed0148a017a 139 for(j=0;j<8;j++){
takeuchi 0:6ed0148a017a 140 bit1gyou=moji1 & 0xff;
takeuchi 0:6ed0148a017a 141 for(k=0;k<8;k++){// kagamimoji no font
takeuchi 0:6ed0148a017a 142 //for(k=8;k>=1;k--){ // futuu no font
takeuchi 0:6ed0148a017a 143 bitsum[i][k]=bitsum[i][k]+(bit1gyou & 0x01)*pow((double)2,(double)(j));
takeuchi 0:6ed0148a017a 144 bit1gyou=bit1gyou >> 1;
takeuchi 0:6ed0148a017a 145 }//i
takeuchi 0:6ed0148a017a 146 moji1=moji1 >> 8;
takeuchi 0:6ed0148a017a 147 }//j
takeuchi 0:6ed0148a017a 148 }
takeuchi 0:6ed0148a017a 149
takeuchi 0:6ed0148a017a 150 k=0;
takeuchi 0:6ed0148a017a 151 for(i=0;i<10;i++){// scroll data henkan
takeuchi 0:6ed0148a017a 152 for(j=0;j<8;j++){
takeuchi 0:6ed0148a017a 153 bitline[k]=bitsum[i][j];
takeuchi 0:6ed0148a017a 154 k++;
takeuchi 0:6ed0148a017a 155 }
takeuchi 0:6ed0148a017a 156 }
takeuchi 0:6ed0148a017a 157
takeuchi 0:6ed0148a017a 158 for(i=0;i<80-16;i++){ //scroll hyouji
takeuchi 0:6ed0148a017a 159 maxOne(1,1,bitline[i+0]);
takeuchi 0:6ed0148a017a 160 maxOne(1,2,bitline[i+1]);
takeuchi 0:6ed0148a017a 161 maxOne(1,3,bitline[i+2]);
takeuchi 0:6ed0148a017a 162 maxOne(1,4,bitline[i+3]);
takeuchi 0:6ed0148a017a 163 maxOne(1,5,bitline[i+4]);
takeuchi 0:6ed0148a017a 164 maxOne(1,6,bitline[i+5]);
takeuchi 0:6ed0148a017a 165 maxOne(1,7,bitline[i+6]);
takeuchi 0:6ed0148a017a 166 maxOne(1,8,bitline[i+7]);
takeuchi 0:6ed0148a017a 167 maxOne(2,1,bitline[i+8]);
takeuchi 0:6ed0148a017a 168 maxOne(2,2,bitline[i+9]);
takeuchi 0:6ed0148a017a 169 maxOne(2,3,bitline[i+10]);
takeuchi 0:6ed0148a017a 170 maxOne(2,4,bitline[i+11]);
takeuchi 0:6ed0148a017a 171 maxOne(2,5,bitline[i+12]);
takeuchi 0:6ed0148a017a 172 maxOne(2,6,bitline[i+13]);
takeuchi 0:6ed0148a017a 173 maxOne(2,7,bitline[i+14]);
takeuchi 0:6ed0148a017a 174 maxOne(2,8,bitline[i+15]);
takeuchi 0:6ed0148a017a 175
takeuchi 0:6ed0148a017a 176 wait(0.1);
takeuchi 0:6ed0148a017a 177 }
takeuchi 0:6ed0148a017a 178
takeuchi 0:6ed0148a017a 179 }//while
takeuchi 0:6ed0148a017a 180 }//main
takeuchi 0:6ed0148a017a 181
takeuchi 0:6ed0148a017a 182