Last active
April 8, 2023 11:15
-
-
Save mamemomonga/9449dfc5386c42060350e8fad4a66a4e to your computer and use it in GitHub Desktop.
74hc165 x2 と 74hc595 x1 のテスト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SPI.h> | |
// DIPスイッチとボタンの状態をUSBシリアル出力で表示する。ボーレートは115200 | |
// DIPスイッチがONになっている数を7セグで表示する。またいずれかのボタンが押されたら小数点を表示する | |
// ビルトインLEDは LED_BUILTIN で定義されているが | |
// SCKと同じなので使わないこと | |
// 秋月電子のサンプルとはバイトオーダが逆なので注意 | |
// これ: MSBFIRST / 秋月: LSBFIRST | |
const byte digits[] = { | |
0b00111111, // 0 | |
0b00000110, // 1 | |
0b01011011, // 2 | |
0b01001111, // 3 | |
0b01100110, // 4 | |
0b01101101, // 5 | |
0b01111101, // 6 | |
0b00000111, // 7 | |
0b01111111, // 8 | |
0b01101111, // 9 | |
}; | |
#define SRR_LD 21 // 74HC165のSH/~LD | |
#define SRW_SS 20 // 74HC595のRCLK | |
uint16_t pv; // スイッチ・キーの前の状態 | |
// SPI,シフトレジスタの初期化 | |
void srInit() { | |
SPI.begin(); | |
SPI.setBitOrder(MSBFIRST); | |
SPI.setClockDivider(SPI_CLOCK_DIV2); | |
SPI.setDataMode(SPI_MODE2); | |
pinMode(SRR_LD, OUTPUT); | |
digitalWrite(SRR_LD, HIGH); | |
pinMode(SRW_SS, OUTPUT); | |
digitalWrite(SRW_SS, HIGH); | |
} | |
// 74HC595(1つ)への書込 | |
void srWrite(uint8_t data) { | |
digitalWrite(SRW_SS, LOW); | |
delayMicroseconds(1); | |
SPI.transfer(data); | |
delayMicroseconds(1); | |
digitalWrite(SRW_SS, HIGH); | |
} | |
// 74HC165(2つ)からの読込 | |
uint16_t srRead() { | |
digitalWrite(SRR_LD,LOW); | |
delayMicroseconds(1); | |
digitalWrite(SRR_LD,HIGH); | |
delayMicroseconds(1); | |
uint8_t rv1=SPI.transfer(0x00); | |
delayMicroseconds(1); | |
uint8_t rv2=SPI.transfer(0x00); | |
delayMicroseconds(1); | |
return ((rv1<<8) | rv2); | |
} | |
// 74HC165に接続されたスイッチの読込 | |
void switchRead() { | |
uint16_t cv=srRead(); | |
if(pv == cv) return; | |
// DIPスイッチでONになっている数を数える | |
uint8_t dipOn=8; | |
for(uint8_t i=0; i<8; i++) { | |
if(1 & (cv>>i)) dipOn--; | |
} | |
// いずれかのキーが押されていたらdpを点灯 | |
if((0xFF & (cv>>7))!=0xFF) dipOn=dipOn+10; | |
nanaSeg(dipOn); | |
Serial.print("\033[2J"); // 画面をクリアする | |
Serial.print("\033[2;0H"); // カーソル移動 | |
Serial.print("NanaSeg:"); | |
Serial.println(dipOn); | |
Serial.print("Value:"); | |
Serial.println(cv); | |
for(uint8_t i=0; i<16; i++) { | |
bool rb = (cv >> i) & 1; | |
if(i<10) Serial.print(" "); | |
Serial.print(i); | |
Serial.print(": "); | |
Serial.println( rb ? " " : " x"); | |
} | |
Serial.println(""); | |
pv=cv; | |
} | |
// 74HC595に接続された7セグ(AE-7SEG-BOARD)への数値の反映 | |
// 0-9: dpなし | |
// 10-19: dpあり1桁 | |
// 上記以外: 消す | |
uint8_t nanaSeg(uint8_t num) { | |
uint8_t di=0x00; | |
if(num >=0 && num <= 9) { | |
di=digits[num]; | |
} else if(num >=10 && num <=19) { | |
di=(1<<7) | digits[num-10]; | |
} | |
srWrite(di); | |
} | |
// 初期化 | |
void setup() { | |
srInit(); | |
Serial.begin(115200); | |
pv=0; | |
for(uint8_t i=0;i<20;i++) { | |
nanaSeg(i); | |
delay(50); | |
} | |
nanaSeg(20); | |
} | |
// ループ | |
void loop() { | |
switchRead(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment