![](/media/cache/profiles/d8f2cfaf0001e1a2b669a0e0a0b924b1.jpg.50x50_q85.png)
LT-5016M1を74HC595で制御します。文字スクロールなどの参考にどうぞ。
制作の過程はNotebookに書いています。
main.cpp@42:2df76753f8a1, 2017-04-04 (annotated)
- Committer:
- p4ken
- Date:
- Tue Apr 04 08:56:33 2017 +0000
- Revision:
- 42:2df76753f8a1
- Parent:
- 41:7c72eff4279a
?pattern???????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
p4ken | 0:679fb5e8a0b4 | 1 | #include "mbed.h" |
p4ken | 41:7c72eff4279a | 2 | #include "patterns.cpp" |
p4ken | 41:7c72eff4279a | 3 | |
p4ken | 38:97031cb65085 | 4 | DigitalOut RCK(D10);// 74595 |
p4ken | 38:97031cb65085 | 5 | DigitalOut G(D9); // 74595 |
p4ken | 30:7f0f186d2b4a | 6 | DigitalOut SER(D8); // 74164 |
p4ken | 30:7f0f186d2b4a | 7 | DigitalOut CLK(D7); // 74164 |
p4ken | 38:97031cb65085 | 8 | DigitalIn BUTTON(USER_BUTTON); // 点灯・消灯ボタン |
p4ken | 30:7f0f186d2b4a | 9 | //Serial pc(USBTX, USBRX); // USBシリアル通信 |
p4ken | 39:f9a450e32abb | 10 | Timer timer; // 経過時間のカウンター |
p4ken | 38:97031cb65085 | 11 | const unsigned char HI = 0; |
p4ken | 38:97031cb65085 | 12 | const unsigned char LO = 1; |
p4ken | 38:97031cb65085 | 13 | const unsigned char MODE = 2; //SPI |
p4ken | 16:cd36324730ad | 14 | |
p4ken | 1:9f6c6dcdd8d7 | 15 | char scan = 16; // 点灯中の行 |
p4ken | 39:f9a450e32abb | 16 | //int round = 0; // スキャンを何周したか |
p4ken | 39:f9a450e32abb | 17 | //int scroll = 0; // 左スクロールした量 |
p4ken | 40:39e626b5269d | 18 | char speed = 30-29; // スクロール進段ミリ秒 |
p4ken | 40:39e626b5269d | 19 | int t = 0; // 経過時間 |
p4ken | 0:679fb5e8a0b4 | 20 | |
p4ken | 21:bbb751c5d846 | 21 | void receive() { // シリアル受信割り込み |
p4ken | 30:7f0f186d2b4a | 22 | // if(pc.getc() == 0b00000001) pc.printf("received!\r\n"); |
p4ken | 2:75c7836a6ff4 | 23 | // pc.putc(pc.getc() + 1); // echo |
p4ken | 2:75c7836a6ff4 | 24 | } |
p4ken | 2:75c7836a6ff4 | 25 | |
p4ken | 39:f9a450e32abb | 26 | //unsigned char getPattern(char const *p, char x, char y, bool s) { |
p4ken | 39:f9a450e32abb | 27 | // unsigned char r; |
p4ken | 39:f9a450e32abb | 28 | // r = (unsigned char)p[x][4*11-1-y%(4*11)]; |
p4ken | 39:f9a450e32abb | 29 | // return r; |
p4ken | 39:f9a450e32abb | 30 | //} |
p4ken | 39:f9a450e32abb | 31 | |
p4ken | 0:679fb5e8a0b4 | 32 | int main() { |
p4ken | 30:7f0f186d2b4a | 33 | SPI spi(D11, D12, D13); // SPIピン mosi, miso, sclk |
p4ken | 38:97031cb65085 | 34 | spi.format(8, MODE); // 74595へ~ビットずつ送る //立ち下りクロック |
p4ken | 31:d6f78e70bf01 | 35 | spi.frequency(1*1000*1000); // 74595へのクロック周波数 最高96 初期1 |
p4ken | 30:7f0f186d2b4a | 36 | // pc.attach(receive, Serial::RxIrq); // シリアル受信割り込み |
p4ken | 30:7f0f186d2b4a | 37 | // pc.baud(9600); // シリアル通信のクロックレート デフォルト9600 |
p4ken | 39:f9a450e32abb | 38 | timer.start(); // 経過時間のカウントを開始 |
p4ken | 39:f9a450e32abb | 39 | timer.reset(); // 経過時間0秒 |
p4ken | 42:2df76753f8a1 | 40 | |
p4ken | 42:2df76753f8a1 | 41 | spi.write(pattern2[0][0] |
p4ken | 42:2df76753f8a1 | 42 | + pattern5[0][0] |
p4ken | 42:2df76753f8a1 | 43 | + pattern_bus1[0][0] |
p4ken | 42:2df76753f8a1 | 44 | + pattern_bus2[0][0] |
p4ken | 42:2df76753f8a1 | 45 | + pattern_bus3[0][0] |
p4ken | 42:2df76753f8a1 | 46 | + pattern_bus4[0][0] |
p4ken | 42:2df76753f8a1 | 47 | + pattern_bus5[0][0] |
p4ken | 42:2df76753f8a1 | 48 | + pattern_bus6[0][0] |
p4ken | 42:2df76753f8a1 | 49 | + pattern_8k_kaisoku_sho[0][0] |
p4ken | 42:2df76753f8a1 | 50 | + pattern_8k_yayoi_tsugi[0][0] |
p4ken | 42:2df76753f8a1 | 51 | + pattern_8k_yayoi_next[0][0] |
p4ken | 42:2df76753f8a1 | 52 | + pattern_8k_izu_tsugi[0][0] |
p4ken | 42:2df76753f8a1 | 53 | + pattern_8k_izu_next[0][0] |
p4ken | 42:2df76753f8a1 | 54 | + pattern_8k_izuchi_tsugi[0][0] |
p4ken | 42:2df76753f8a1 | 55 | + pattern_8k_izuchi_next[0][0] |
p4ken | 42:2df76753f8a1 | 56 | + pattern_8k_yume_tsugi[0][0] |
p4ken | 42:2df76753f8a1 | 57 | + pattern_8k_yume_next[0][0] |
p4ken | 42:2df76753f8a1 | 58 | + pattern_8k_sho_tsugi[0][0] |
p4ken | 42:2df76753f8a1 | 59 | + pattern_8k_sho_next[0][0] |
p4ken | 42:2df76753f8a1 | 60 | + pattern_8k_shin_ya[0][0] |
p4ken | 42:2df76753f8a1 | 61 | + pattern_8k_green_pocket[0][0] |
p4ken | 42:2df76753f8a1 | 62 | + pattern_8k_yayoi_mamonaku[0][0] |
p4ken | 42:2df76753f8a1 | 63 | + pattern_8k_izu_mamonaku[0][0] |
p4ken | 42:2df76753f8a1 | 64 | + pattern_8k_izuchi_mamonaku[0][0] |
p4ken | 42:2df76753f8a1 | 65 | + pattern_8k_yume_mamonaku[0][0] |
p4ken | 42:2df76753f8a1 | 66 | + pattern_8k_sho_mamonaku[0][0] |
p4ken | 42:2df76753f8a1 | 67 | + pattern_8k_door_this[0][0] |
p4ken | 42:2df76753f8a1 | 68 | + pattern_8k_door_another[0][0] |
p4ken | 42:2df76753f8a1 | 69 | + pattern_8k_door_both[0][0] |
p4ken | 42:2df76753f8a1 | 70 | + pattern_8k_yayoi_jp[0][0] |
p4ken | 42:2df76753f8a1 | 71 | + pattern_8k_yayoi_en[0][0] |
p4ken | 42:2df76753f8a1 | 72 | + pattern_8k_izu_jp[0][0] |
p4ken | 42:2df76753f8a1 | 73 | + pattern_8k_izu_en[0][0] |
p4ken | 42:2df76753f8a1 | 74 | + pattern_8k_izuchi_jp[0][0] |
p4ken | 42:2df76753f8a1 | 75 | + pattern_8k_izuchi_en[0][0] |
p4ken | 42:2df76753f8a1 | 76 | ); |
p4ken | 0:679fb5e8a0b4 | 77 | |
p4ken | 0:679fb5e8a0b4 | 78 | while(1) { |
p4ken | 9:4efad95ffa53 | 79 | // 行選択 |
p4ken | 9:4efad95ffa53 | 80 | scan++; // 一行進む |
p4ken | 31:d6f78e70bf01 | 81 | if(scan == 17+0) { // 16行目の次 |
p4ken | 38:97031cb65085 | 82 | SER = LO; // 点灯 |
p4ken | 9:4efad95ffa53 | 83 | scan = 1; // 1行目に戻る |
p4ken | 39:f9a450e32abb | 84 | // round++; // スキャンが1周した |
p4ken | 40:39e626b5269d | 85 | // t = timer.read_ms(); |
p4ken | 40:39e626b5269d | 86 | t += 1; |
p4ken | 9:4efad95ffa53 | 87 | } else if(scan == 2) { // 2行目 |
p4ken | 38:97031cb65085 | 88 | SER = HI; // 消灯 |
p4ken | 0:679fb5e8a0b4 | 89 | } |
p4ken | 9:4efad95ffa53 | 90 | |
p4ken | 9:4efad95ffa53 | 91 | // 表示パターン送り込み |
p4ken | 39:f9a450e32abb | 92 | // int t = scroll; |
p4ken | 34:e9895343c300 | 93 | for(int i=0; i<4*11; i++){ // iは最大で~*11文字 |
p4ken | 40:39e626b5269d | 94 | if(true) { |
p4ken | 39:f9a450e32abb | 95 | if(t/8/speed*2 < 4*(166+11)) { |
p4ken | 39:f9a450e32abb | 96 | unsigned char p; |
p4ken | 39:f9a450e32abb | 97 | char y = scan-1; |
p4ken | 39:f9a450e32abb | 98 | char x = 4*11-1-i%(4*11); |
p4ken | 39:f9a450e32abb | 99 | if(t/8/speed*2 <= i) { |
p4ken | 39:f9a450e32abb | 100 | p = (unsigned char)~0b00000000 >> ( (t/speed)%8); |
p4ken | 39:f9a450e32abb | 101 | } else if(t/8/speed*2 <= 4*166+i) { |
p4ken | 41:7c72eff4279a | 102 | p = (unsigned char)~pattern_8k_green_pocket[y][x+(t/8/speed*2-4*11)] >> ( (t/speed)%8); |
p4ken | 39:f9a450e32abb | 103 | } else { |
p4ken | 39:f9a450e32abb | 104 | p = (unsigned char)~0b00000000 >> ( (t/speed)%8); |
p4ken | 39:f9a450e32abb | 105 | } |
p4ken | 39:f9a450e32abb | 106 | if(t/8/speed*2 <= i-4) { |
p4ken | 39:f9a450e32abb | 107 | p += (unsigned char)~0b00000000 << (8-(t/speed)%8); |
p4ken | 39:f9a450e32abb | 108 | } else if(t/8/speed*2 <= 4*166+i-4) { |
p4ken | 41:7c72eff4279a | 109 | p += (unsigned char)~pattern_8k_green_pocket[y][x+(t/8/speed*2)+2-4*11] << (8-(t/speed)%8); |
p4ken | 39:f9a450e32abb | 110 | } else { |
p4ken | 39:f9a450e32abb | 111 | p += (unsigned char)~0b00000000 << (8-(t/speed)%8); |
p4ken | 39:f9a450e32abb | 112 | } |
p4ken | 39:f9a450e32abb | 113 | spi.write(p); |
p4ken | 39:f9a450e32abb | 114 | } else { |
p4ken | 40:39e626b5269d | 115 | spi.write((unsigned char)~pattern5[scan-1][4*11-1-i%(4*11)]); |
p4ken | 39:f9a450e32abb | 116 | // spi.write((unsigned char)~0b00000000); //消灯 |
p4ken | 40:39e626b5269d | 117 | } |
p4ken | 40:39e626b5269d | 118 | } |
p4ken | 39:f9a450e32abb | 119 | // spi.write((unsigned char)~pattern2[scan-1][4*11-1-i%(4*11)]); |
p4ken | 38:97031cb65085 | 120 | //spi.write(0); |
p4ken | 40:39e626b5269d | 121 | //spi.write(0b10101010); |
p4ken | 38:97031cb65085 | 122 | //spi.write(0b11111111); |
p4ken | 6:f72e87d03ab0 | 123 | } |
p4ken | 9:4efad95ffa53 | 124 | |
p4ken | 9:4efad95ffa53 | 125 | // スクロール |
p4ken | 39:f9a450e32abb | 126 | // if(round > speed) { // スクロール速度 |
p4ken | 39:f9a450e32abb | 127 | // scroll++; // 1ドットスクロールする |
p4ken | 39:f9a450e32abb | 128 | // round = 0; // スキャン周回カウントリセット |
p4ken | 39:f9a450e32abb | 129 | // } |
p4ken | 39:f9a450e32abb | 130 | // if(scroll > 200) { // スクロール幅 |
p4ken | 39:f9a450e32abb | 131 | // scroll = 0; // スクロール数リセット |
p4ken | 39:f9a450e32abb | 132 | // } |
p4ken | 40:39e626b5269d | 133 | |
p4ken | 40:39e626b5269d | 134 | wait_us(10); |
p4ken | 38:97031cb65085 | 135 | RCK = LO; |
p4ken | 38:97031cb65085 | 136 | CLK = LO; |
p4ken | 40:39e626b5269d | 137 | // G = HI; // 消灯 |
p4ken | 40:39e626b5269d | 138 | wait_us(10); |
p4ken | 38:97031cb65085 | 139 | RCK = HI; |
p4ken | 38:97031cb65085 | 140 | CLK = HI; |
p4ken | 8:496a1ba31a68 | 141 | |
p4ken | 8:496a1ba31a68 | 142 | // ここまでの処理時間が長いほど明るくなる |
p4ken | 27:c49fd2b1279a | 143 | // while(timer.read_us()<0) { // 数字のぶんだけ暗くする |
p4ken | 27:c49fd2b1279a | 144 | // wait_us(10); |
p4ken | 27:c49fd2b1279a | 145 | // } |
p4ken | 30:7f0f186d2b4a | 146 | |
p4ken | 40:39e626b5269d | 147 | if(!BUTTON) G = LO; // ボタン押せば点灯 |
p4ken | 8:496a1ba31a68 | 148 | |
p4ken | 8:496a1ba31a68 | 149 | // ダイナミック点灯のパルス幅を決める |
p4ken | 27:c49fd2b1279a | 150 | // while(timer.read_us()<100) { // 100*2500でゆっくり |
p4ken | 27:c49fd2b1279a | 151 | // wait_us(10); |
p4ken | 27:c49fd2b1279a | 152 | // } |
p4ken | 15:5cec652070ca | 153 | // pc.printf("%d\r\n", timer.read_us()); |
p4ken | 15:5cec652070ca | 154 | // pc.printf("%d\r\n", round/100); |
p4ken | 0:679fb5e8a0b4 | 155 | } |
p4ken | 0:679fb5e8a0b4 | 156 | } |