Skip to content

Instantly share code, notes, and snippets.

@mamemomonga
Last active April 8, 2023 11:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mamemomonga/9449dfc5386c42060350e8fad4a66a4e to your computer and use it in GitHub Desktop.
Save mamemomonga/9449dfc5386c42060350e8fad4a66a4e to your computer and use it in GitHub Desktop.
74hc165 x2 と 74hc595 x1 のテスト
#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