Skip to content

Instantly share code, notes, and snippets.

@weldtype
Created April 23, 2016 23:41
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 weldtype/c7b79965a047b4f058fc60bdcbde16b8 to your computer and use it in GitHub Desktop.
Save weldtype/c7b79965a047b4f058fc60bdcbde16b8 to your computer and use it in GitHub Desktop.
// 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