Created
April 22, 2016 18:18
-
-
Save weldtype/4d3519bb9ea6fcdbb0166ed29dc00a32 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/16 | |
// edy | |
// | |
// 上から4行目(CS3)のアドレス変換 | |
const int addrCS3[] = {8, 9, 6, 7, 4, 5, 2, 3, 0, 1, 10, 11, 12, 13, 14, 15, | |
16, 17, 18, 19, 20, 21, 30, 31, 28, 29, 26, 27, 24, 25, 22, 23 | |
}; | |
// 上から5行目(CS2)のアドレス変換 | |
const int addrCS2[] = {18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 1, | |
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 | |
}; | |
// 7segmentパターン | |
// 0,1,2,3,4,5,6,7,8,9,,A,b,C,d,E,F, | |
// 空白,-,H,L,n,o,P,u,μ,°,左縦,両縦 | |
const int seg_pattern[] = {235, 96, 199, 229, 108, 173, 175, 232, 239, 237, 238, 47, 7, 103, 143, 142, | |
0, 4, 110, 11, 38, 39, 206, 35, 78, 204,10,106 | |
}; | |
// row to CS | |
const int 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); | |
// 各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); | |
} | |
void loop() { | |
int arraysize = (sizeof(seg_pattern) / sizeof(int)); | |
int j = 0; | |
for (int row = 3; row <= 6; row++) { | |
for (int i = 0; i <= 15; i++) { | |
DispNum(row, i, j % arraysize); | |
j++; | |
if (j >= arraysize) { | |
break; | |
} | |
} | |
if (j >= arraysize) { | |
break; | |
} | |
} | |
} | |
// row 1...6 | |
// digit_pos 1...16 | |
void DispNum(int row, int digit_pos, int num) | |
{ | |
WriteData(row, digit_pos * 2, seg_pattern[num] & 0x0f); | |
WriteData(row, digit_pos * 2 + 1, seg_pattern[num] >> 4); | |
} | |
void WriteData(int row, int addr , int data) | |
{ | |
if (row == 4 ) { | |
addr = addrCS3[addr]; | |
} | |
if (row == 5 ) { | |
addr = addrCS2[addr]; | |
} | |
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