Forgive me, brothers, for I have sinned. it has been 35 years since I coded ( a word processor in DEC RT Basic running on a PDP-11 ) I got some catching up to do.
I bought one of these:
The example code that comes with it is beyond useless as an example, but it works. there are not enough notes in the example to explain how it works. the example included in the site above is vastly better, but inadequate for my needs
#define CS 2 //Pin 2 as chip selection output
#define WR 3 //Pin 3 as read clock output
#define DATA 4 //Pin 4 as Serial data output
#define CS1 digitalWrite(CS, HIGH)
#define CS0 digitalWrite(CS, LOW)
#define WR1 digitalWrite(WR, HIGH)
#define WR0 digitalWrite(WR, LOW)
#define DATA1 digitalWrite(DATA, HIGH)
#define DATA0 digitalWrite(DATA, LOW)
#define sbi(x, y) (x |= (1 << y))
#define cbi(x, y) (x &= ~(1 <<y ))
#define uchar unsigned char
#define uint unsigned int
#define ComMode 0x52
#define RCosc 0x30
#define LCD_on 0x06
#define LCD_off 0x04
#define Sys_en 0x02
#define CTRl_cmd 0x80
#define Data_cmd 0xa0
/*0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,H,h,L,n,N,o,P,r,t,U,-, ,*/
const char num[]={0x7D,0x60,0x3E,0x7A,0x63,0x5B,0x5F,0x70,0x7F,0x7B,0x77,0x4F,0x1D,0x0E,0x6E,0x1F,0x17,0x67,0x47,0x0D,0x46,0x75,0x37,0x06,0x0F,0x6D,0x02,0x00,};
char dispnum[6]={0x00,0x00,0x00,0x00,0x00,0x00};
void SendBit_1621(uchar sdata,uchar cnt)
{
uchar i;
for(i=0;i<cnt;i++)
{
WR0;
if(sdata&0x80) DATA1;
else DATA0;
WR1;
sdata<<=1;
}
}
void SendCmd_1621(uchar command)
{
CS0;
SendBit_1621(0x80,4);
SendBit_1621(command,8);
CS1;
}
void Write_1621(uchar addr,uchar sdata)
{
addr<<=2;
CS0;
SendBit_1621(0xa0,3);
SendBit_1621(addr,6);
SendBit_1621(sdata,8);
CS1;
}
void HT1621_all_off(uchar num)
{
uchar i;
uchar addr=0;
for(i=0;i<num;i++)
{
Write_1621(addr,0x00);
addr+=2;
}
}
void HT1621_all_on(uchar num)
{
uchar i;
uchar addr=0;
for(i=0;i<num;i++)
{
Write_1621(addr,0xff);
addr+=2;
}
}
void Init_1621(void)
{
SendCmd_1621(Sys_en);
SendCmd_1621(RCosc);
SendCmd_1621(ComMode);
SendCmd_1621(LCD_on);
}
void displaydata(int p)
{
uchar i=0;
switch(p)
{
case 1:
sbi(dispnum[0],7);
break;
case 2:
sbi(dispnum[1],7);
break;
case 3:
sbi(dispnum[2],7);
break;
default:break;
}
for(i=0;i<=5;i++)
{
Write_1621(i*2,dispnum[i]);
}
}
void setup() {
pinMode(CS, OUTPUT); //
pinMode(WR, OUTPUT); //
pinMode(DATA, OUTPUT); //
CS1;
DATA1;
WR1;
delay(50);
Init_1621();
HT1621_all_on(16);
delay(1000);
HT1621_all_off(16);
delay(1000);
displaydata(1);//light on the first decimal point starting from the right side
dispnum[5]=num[5];
dispnum[4]=num[4];
dispnum[3]=num[3];
dispnum[2]=num[2];
dispnum[1]=num[1];
dispnum[0]=num[0];
sbi(dispnum[5],7);
//cbi(dispnum[5],7);
sbi(dispnum[4],7);
//cbi(dispnum[4],7);
sbi(dispnum[3],7);
//cbi(dispnum[3],7);
Write_1621(0,num[0]); //0
Write_1621(2,num[1]); //1
Write_1621(4,num[2]); //2
Write_1621(6,num[3]); //3
Write_1621(8,num[4]); //4
Write_1621(10,num[5]); //第5
}
void loop() {
// put your main code here, to run repeatedly:
}
I need to make this display show time. I need to either
make it display two digits with one input
or split the time digits coming from the GPS into individual numerals
which method makes more sense?
in this bit of code:
#define CS 2 //Pin 2 as chip selection output
#define WR 3 //Pin 3 as read clock output
#define DATA 4 //Pin 4 as Serial data output
are WR & DATA actually MISO and MOSI?
I have a 12 digit variant of this coming on a slow boat from China. What do I have to do to make this example work with 12 LEDs? I’m pretty sure it’s a cut, paste, append, change some values thing.