This is a very short example. How to use this LCD to display numbers and some letters such as A, b, F and so on. Aslo the decimal point. Below you have the schematic, code and library taht you need for this example. Read all the comments in the code.
First, you need a 7 segments LCD like this one on this link. This uses serial data to show up to 6 numbers from 0 to 9 and 5 decimal dots. To send data, all we have to do is to send data on the data pin.
Ok, make the serial connection between the Arduino and the LCD as below. In this case, we won't need any library. All we have to do is to shift data on the data pins and control some registers inside of the LCd chip. The rest is done by the LCD driver. Copy the code from below and see the test.
We don't need any library for this example. All we have to do is to send data to the chip by shifting each byte value on the data pin. Read the code to see more. Upload the test code, make the connections and give it a test.
/* 7 segment LCD serial control
Schematic: https://www.electronoobs.com/eng_arduino_tut55_sch1.php
Code: https://www.electronoobs.com/eng_arduino_tut55_code1.php
*/
#define CS 13 //Pin 13 as chip selection output
#define WR 12 //Pin 12 as read clock output
#define DATA 7 //Pin 7 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
//定义HT1621的命令
#define ComMode 0x52 //4COM,1/3bias 1000 010 1001 0
#define RCosc 0x30 //1000 0011 0000
#define LCD_on 0x06 //1000 0000 0 11 0
#define LCD_off 0x04
#define Sys_en 0x02 //1000 0000 0010
#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,};
//0 1 2 3 4 5 6 7 8 9
char dispnum[6]={0x00,0x00,0x00,0x00,0x00,0x00};
int i = 0;
void SendBit_1621(uchar sdata,uchar cnt)
{
//data cnt HT1621
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); //1621
delay(1000);
HT1621_all_off(16); //1621
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]);
//Write_1621(2,num[28]);
//Write_1621(4,num[2]);
//Write_1621(6,num[28]);
//Write_1621(8,num[4]);
//Write_1621(10,num[5]);
*/
}
void loop() {
while (i < 24)
{
Write_1621(0,num[i]);
Write_1621(2,num[i]);
Write_1621(4,num[i]);
Write_1621(6,num[i]);
Write_1621(8,num[i]);
Write_1621(10,num[i]);
delay(300);
i=i+1;
}
i = 0;
}