Modify an example: HT1621 SPI

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.

Much easier to split your two digits up and send them one at a time. Really that's the only way given the hardware. You could write a function that took a 2 digit number to put out, but that function would still have to split them up to actually put them on the displays.

I used Enrico Formenti's library...

I just brought the lcd display and I made an sketch to simulate a clock with display, maybe is usefull for you: LCD_HT1621/HT1621_test4.ino at master · tehniq3/LCD_HT1621 · GitHub
you can see demo movie with HT1621 and Arduino !