Skip to content

Instantly share code, notes, and snippets.

@weldtype
Created April 22, 2016 18:18
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/4d3519bb9ea6fcdbb0166ed29dc00a32 to your computer and use it in GitHub Desktop.
Save weldtype/4d3519bb9ea6fcdbb0166ed29dc00a32 to your computer and use it in GitHub Desktop.
// 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