Created
April 23, 2016 23:41
-
-
Save weldtype/c7b79965a047b4f058fc60bdcbde16b8 to your computer and use it in GitHub Desktop.
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
// digit 6行16桁7セグメントLCDを試す。 | |
// セグメント調査用 | |
// 2016/04/22 | |
// edy | |
// | |
//参考にしたサイト | |
//http://forum.arduino.cc/index.php?topic=100429.msg753262#msg753262 | |
String readString, row, addr, data; | |
// row to CS | |
const uint8_t rowToCS[] = {0, 5, 6, 4, 3, 2, 1}; | |
void setup() | |
{ | |
// コマンドのビットデータ: modeID(100)+各コマンドのビットデータ | |
#define SYS_EN 0b100000000010 | |
#define LCD_ON 0b100000000110 | |
#define BIAS2_2 0b100001000000 | |
#define BIAS2_3 0b100001001000 | |
#define BIAS2_4 0b100001010000 | |
#define BIAS3_2 0b100001000010 | |
#define BIAS3_3 0b100001001010 | |
#define BIAS3_4 0b100001010010 | |
#define CS1 2 | |
#define CS2 3 | |
#define CS3 4 | |
#define CS4 5 | |
#define CS5 6 | |
#define CS6 7 | |
#define WR 8 | |
#define DATA 9 | |
pinMode(CS1 , OUTPUT); | |
pinMode(CS2 , OUTPUT); | |
pinMode(CS3 , OUTPUT); | |
pinMode(CS4 , OUTPUT); | |
pinMode(CS5 , OUTPUT); | |
pinMode(CS6 , OUTPUT); | |
pinMode(WR , OUTPUT); | |
pinMode(DATA , OUTPUT); | |
digitalWrite(CS1, HIGH); | |
digitalWrite(CS2, HIGH); | |
digitalWrite(CS3, HIGH); | |
digitalWrite(CS4, HIGH); | |
digitalWrite(CS5, HIGH); | |
digitalWrite(CS6, HIGH); | |
digitalWrite(WR, HIGH); | |
digitalWrite(DATA, HIGH); | |
Serial.begin(9600); | |
Serial.println("segment check"); | |
// 各HT1621を初期化 | |
for (int row = 1 ; row <= 6 ; row++) { | |
WriteCommand(row, SYS_EN); | |
WriteCommand(row, LCD_ON); | |
WriteCommand(row, BIAS3_4); | |
//WriteCommand(row, BIAS2_4); | |
} | |
delay(500); | |
// 全消去 | |
for (int row = 1 ; row <= 6 ; row++) { | |
for (int addr = 0 ; addr < 32 ; addr++) { | |
WriteData(row, addr, 0b0000); | |
} | |
} | |
delay(500); | |
} | |
// -(マイナス)で画面クリア | |
// または | |
// 5桁の数字 | |
// 行1桁(1...6) | |
// アドレス2桁(0...31) | |
// データ2桁(0...15) | |
void loop() { | |
while (Serial.available()) { | |
delay(3); //delay to allow buffer to fill | |
if (Serial.available() > 0) { | |
char c = Serial.read(); //gets one byte from serial buffer | |
readString += c; //makes the string readString | |
} | |
} | |
if (readString.length() > 0) { | |
Serial.println(readString); //see what was received | |
row = readString.substring(0, 1); | |
addr = readString.substring(1, 3); | |
data = readString.substring(3, 5); | |
if (row == "-") { | |
Serial.println("clear"); | |
Serial.println(""); | |
for (int row = 1 ; row <= 6 ; row++) { | |
for (int addr = 0 ; addr < 32 ; addr++) { | |
WriteData(row, addr, 0b0000); | |
} | |
} | |
} | |
else { | |
int n1 = row.toInt(); | |
int n2 = addr.toInt(); | |
int n3 = data.toInt(); | |
WriteData(n1, n2 , n3); | |
Serial.print("row:"); | |
Serial.println(n1); | |
Serial.print("addr:"); | |
Serial.println(n2); | |
Serial.print("data:"); | |
Serial.println(n3); | |
} | |
readString = ""; | |
} | |
} | |
// row 1...6 | |
// digit_pos 1...16 | |
void WriteData(int row, int addr , int data) | |
{ | |
int bitdata = 0x1400 | (addr << 4) | reverse4bit(data) ;// 0x1400: modeID 101 を10ビット左シフト | |
CS_LOW(row); | |
for (int i = 1 ; i <= 13 ; i++) { | |
if ((bitdata & 0x1000) == 0) { | |
digitalWrite(DATA, LOW); | |
} | |
else { | |
digitalWrite(DATA, HIGH); | |
} | |
bitdata <<= 1; | |
digitalWrite(WR, LOW); | |
digitalWrite(WR, HIGH); | |
} | |
CS_HIGH(row); | |
} | |
void WriteCommand(int row, int bitdata) | |
{ | |
CS_LOW(row); | |
for (int i = 1 ; i <= 12 ; i++) { | |
if ((bitdata & 0x0800) == 0) { | |
digitalWrite(DATA, LOW); | |
} | |
else { | |
digitalWrite(DATA, HIGH); | |
} | |
bitdata <<= 1; | |
digitalWrite(WR, LOW); | |
digitalWrite(WR, HIGH); | |
} | |
CS_HIGH(row); | |
} | |
void CS_HIGH(int row) | |
{ | |
switch (rowToCS[row]) { | |
case 1: digitalWrite(CS1, HIGH); | |
break; | |
case 2: digitalWrite(CS2, HIGH); | |
break; | |
case 3: digitalWrite(CS3, HIGH); | |
break; | |
case 4: digitalWrite(CS4, HIGH); | |
break; | |
case 5: digitalWrite(CS5, HIGH); | |
break; | |
case 6: digitalWrite(CS6, HIGH); | |
break; | |
default: break; | |
} | |
} | |
void CS_LOW(int row) | |
{ | |
switch (rowToCS[row]) { | |
case 1: digitalWrite(CS1, LOW); | |
break; | |
case 2: digitalWrite(CS2, LOW); | |
break; | |
case 3: digitalWrite(CS3, LOW); | |
break; | |
case 4: digitalWrite(CS4, LOW); | |
break; | |
case 5: digitalWrite(CS5, LOW); | |
break; | |
case 6: digitalWrite(CS6, LOW); | |
break; | |
default: break; | |
} | |
} | |
// ビット逆順(4ビット) | |
int reverse4bit(int data) | |
{ | |
int rev = 0; | |
rev = data & 1 ; | |
for (int i = 1 ; i <= 3 ; i++) { | |
data >>= 1; | |
rev <<= 1; | |
rev |= data & 1; | |
} | |
return rev; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment