📄 ht1621.c
字号:
//貼一張我剛剛調試ok的液晶驅動芯片HT1621的c程序:
#include "HT1621.H"
unsigned char idata lcdBuff[8];
//查表函数
//uchar code
//uchar code lcdtab[12] = {0x5f,0x50,0x3d,0x7d,0x72,0x6b,0xbe,0x51,0x7f,0x7b,0x20,0x2f};
uchar code lcdtab[17] = {0xfa,0x0a,0xbc,0x9e,0x4e,0xd6,0xf6,0x8a,0xfe,0xde,0x04,0xf4,
0x36,0xee,0x64,0x0e,0x00};
//char lcdtab[9];
// LD 测距LCD 显示段转换表
//char tab{} = {01011111B};
/* + bit hex
0 0 0101 1111 0x5f
1 1 0101 0000 0x50
2 2 0011 1101 0x3d
3 3 0111 1101 0x7d
4 4 0111 0010 0x72
5 5 0110 1011 0x6b
6 6 0110 1110 0xbe
7 7 0101 0001 0x51
8 8 0111 1111 0x7f
9 9 0111 1011 0x7b
10 - 0010 0000 0x20
11 E 0010 1111 0x2f
12 o
13 R
14 -1
15 1-
16 空
*/
//查表函数
/*
uchar tab{} = {0x5f,0x50,0x3d,0x7d,0x72,
0x6b,0xbe,0x51,0x7f,0x7b,
0x20,0x2f};
*/
void test_ht1621(void)
{
char command,i;
char ch;
//lcdBuff
uchar lb[8];
LCD_INT1621();
lcd_onff(0);
lcd_onff(1);
//S11 测试闪亮标记
Set_glint(0);
DisplayLCD_ht1621(lcdBuff,8);
Set_glint(1);
DisplayLCD_ht1621(lcdBuff,8);
Set_glint(0);
DisplayLCD_ht1621(lcdBuff,8);
//测试显示状态
setFlag_qian(0);
DisplayLCD_ht1621(lcdBuff,8);
setFlag_qian(1);
DisplayLCD_ht1621(lcdBuff,8);
setFlag_qian(2);
DisplayLCD_ht1621(lcdBuff,8);
setFlag_qian(3);
DisplayLCD_ht1621(lcdBuff,8);
setFlag_qian(4);
DisplayLCD_ht1621(lcdBuff,8);
setFlag_qian(5);
DisplayLCD_ht1621(lcdBuff,8);
//测试长整数到BCD码变换
ch = uintTObcd(1234567,lb);
PutLCDBuff(lb);
DisplayLCD_ht1621(lcdBuff,8);
ch = uintTObcd(123456,lb);
PutLCDBuff(lb);
DisplayLCD_ht1621(lcdBuff,8);
ch = uintTObcd(12345,lb);
PutLCDBuff(lb);
DisplayLCD_ht1621(lcdBuff,8);
ch = uintTObcd(1234,lb);
PutLCDBuff(lb);
DisplayLCD_ht1621(lcdBuff,8);
ch = uintTObcd(123,lb);
PutLCDBuff(lb);
DisplayLCD_ht1621(lcdBuff,8);
ch = uintTObcd(12,lb);
PutLCDBuff(lb);
DisplayLCD_ht1621(lcdBuff,8);
//测试错误显示
//Set_error();
Set_testing();
//测试显示段和数字的对应关系
ClrLCDBuff(lcdBuff,8);
DisplayLCD_ht1621(lcdBuff,8);
for(i=0;i<16;i++) {
ch = lcdtab[i];
lcdBuff[i%6] = ch;
DisplayLCD_ht1621(lcdBuff,8);
}
//测试标号点的LCD段显示
SetLCDBuff(lcdBuff,8); //全显
DisplayLCD_ht1621(lcdBuff,8);
set_p(0);
DisplayLCD_ht1621(lcdBuff,8);
set_p(1);
DisplayLCD_ht1621(lcdBuff,8);
set_m(0);
DisplayLCD_ht1621(lcdBuff,8);
set_m(1);
DisplayLCD_ht1621(lcdBuff,8);
set_fast(0);
DisplayLCD_ht1621(lcdBuff,8);
set_fast(1);
DisplayLCD_ht1621(lcdBuff,8);
set_exalt(0);
DisplayLCD_ht1621(lcdBuff,8);
set_exalt(1);
DisplayLCD_ht1621(lcdBuff,8);
set_continuous(0);
DisplayLCD_ht1621(lcdBuff,8);
set_continuous(1);
DisplayLCD_ht1621(lcdBuff,8);
//测试8段,4段显示
ClrLCDBuff(lcdBuff,8); //清除显示缓冲区
DisplayLCD_ht1621(lcdBuff,8); //刷新显示区
for(;;) {
for(i=0;i<8;i++) {
ClrLCDBuff(lcdBuff,8);
lcdBuff[i] = 0xf0;
DisplayLCD_ht1621(lcdBuff,8);
ClrLCDBuff(lcdBuff,8);
lcdBuff[i] = 0x0f;
DisplayLCD_ht1621(lcdBuff,8);
//ht1621_delay(300);
}
}
for(;;)
;
/*
lcd_cs=1;
lcd_rd=1;
lcd_wr=1;
lcd_data=1;
lcd_delay(10);
lcd_cs=0;
lcd_rd=0;
lcd_wr=0;
lcd_data=0;
*/
//LCDSerialPulse(0x55,8);
//LCD_INT1621();
}
void lcdint(void) //写入脉冲初始化HT1621.
{
lcd_cs=0;
lcd_wr=1;
_nop_();
lcd_wr=0;
_nop_();
}
//HT1621的延时脉冲,pn 脉冲数
void lcd_delay(char pn)
{
int i;
for(i=0;i<pn;i++)
_nop_();
}
void WriteClk(void) //写入脉冲
{
//lcd_cs=0;
lcd_wr=0;
lcd_delay(10);
lcd_wr=1;
lcd_delay(10);
}
void LCDSerialPulse(uchar id,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
if(id>=0x80)
lcd_data=1;
else
lcd_data=0;
WriteClk();
id<<=1;
}
}
void lcd_onff(char k)
{
//char ch;
char command;
if(k == 0)
command=0x04; //关闭LCD
else
//LCDsendcom(command);
command=0x06; //開啟LCD
LCDsendcom(command);
}
//发送指令到LCD
void LCDsendcom(uchar command)
{
uchar a=0x80,i=4,d=8;
lcdint();
LCDSerialPulse(a,i);
LCDSerialPulse(command,d);
lcd_wr=1;
lcd_cs=1;
lcd_data=1;
}
void LCD_INT1621(void) //送命令字
{
uchar command;
command=BIAS; // 1/3 bais . 4 duty
LCDsendcom(command);
command=RC256; //啟動內部256KRC 振蕩器
LCDsendcom(command);
command=SYSTEN;
LCDsendcom(command);
command=LCDON; //開啟LCD
LCDsendcom(command);
}
//以上程序使能LCD驅動.
void LCDsend1621data()
{
uchar a=0x01,b=0x80,c=0x40,d=0x08;
uchar j,k;
lcdint();
LCDSerialPulse(b,a);
LCDSerialPulse(c,d); //從display buffer RAM 0x0000 開始
for(j=0;j<16;j++) // 將X1[]數組需要顯示的數据逐個送RAM.
{
//k=X1[j];
LCDSerialPulse(k,d);
}
}
//清除LCD显示缓冲区
void ClrLCDBuff(uchar *spb,char nda)
{
char i;
for(i=0;i<nda;i++) {
spb[i] = 0x00;
}
}
//全显LCD显示缓冲区
void SetLCDBuff(uchar *spb,char nda)
{
char i;
for(i=0;i<nda;i++) {
spb[i] = 0xff;
}
}
//刷新缓冲区显示
void DisplayLCD_ht1621(uchar *sd,char nd)
{
//uchar a=0x01,b=0x80,c=0x40,d=0x08;
uchar j,k,dp;
//lcdint();
//dp = sd[0];
lcd_cs=0;
lcd_delay(10);
LCDSerialPulse(0x0a0,3); //写入命令
LCDSerialPulse(0x00,6);
//LCDSerialPulse(c,d); //從display buffer RAM 0x0000 開始
for(j=0;j<nd;j++) // 將X1[]數組需要顯示的數据逐個送RAM.
{
k = sd[j];
LCDSerialPulse(k,8); //写入数据
}
lcd_cs=1;
lcd_delay(10);
}
//以上是//往HT1621 display buffer RAM送要顯示數据
void LCD_test(void)
{
char i,j;
char ab[8];
for(j=0;j<6;j++) {
for(i=0;i<8;i++)
ab[i] = 0xff;
//reLCDht1621(ab,8);
ht1621_delay(1000);
for(i=0;i<8;i++)
ab[i] = 0x00;
//reLCDht1621(ab,8);
ht1621_delay(1000);
}
}
//延时1ms的程序
void ht1621_delay(int ms)
{
int i,j;
for(i=0;i<ms;i++) {
for(j=0;j<160;j++)
_nop_();
}
}
//设置单个点
// sp-显示段字节位置,dot- 0灭,1-亮
void SetLcd_Dot(char* sp,char dot)
{
char ch;
ch = *sp;
if(dot == 0)
ch &= 0xfe;
else
ch |= 0x01;
*sp = ch;
}
//P的亮灭
void set_p(char dot)
{
char* sp;
sp = &lcdBuff[2];
SetLcd_Dot(sp,dot);
}
//M的亮灭
void set_m(char dot)
{
char* sp;
sp = &lcdBuff[5];
SetLcd_Dot(sp,dot);
}
//t1的亮灭
void set_fast(char dot)
{
char* sp;
sp = &lcdBuff[3];
SetLcd_Dot(sp,dot);
}
//t2的亮灭
void set_exalt(char dot)
{
char* sp;
sp = &lcdBuff[1];
SetLcd_Dot(sp,dot);
}
//t3的亮灭
void set_continuous(char dot)
{
char* sp;
sp = &lcdBuff[0];
SetLcd_Dot(sp,dot);
}
//设置前端标记旗号
// fl-0 全灭, 1-前,2-中,3-后
void setFlag_qian(char nfl)
{
//char *sp;
lcdBuff[6] = 0x00;
lcdBuff[7] = 0x00;
switch(nfl) {
case 0:
lcdBuff[6] = 0x0;
lcdBuff[7] = 0x0;
break;
case 1:
lcdBuff[6] = 0x8c;
lcdBuff[7] = 0xff;
break;
case 2:
lcdBuff[6] = 0xca;
lcdBuff[7] = 0xff;
break;
case 3:
lcdBuff[6] = 0xe9;
lcdBuff[7] = 0xff;
break;
case 4:
lcdBuff[6] = 0xff;
lcdBuff[7] = 0xff;
break;
}
}
//S11 闪亮标记
void Set_glint(char mfl)
{
char ch;
ch = lcdBuff[7];
if(mfl == 0)
ch &= 0x7f;
else
ch |= 0x80;
lcdBuff[7] = ch;
}
//全部点亮和清零
void Set_LCDseg(char mfl)
{
char ch,i;
//char ab[8];
if(mfl == 0)
ch = 0;
else ch = 0xff;
for(i=0;i<8;i++)
lcdBuff[i] = ch;
}
//错误显示 -1
void Set_error(void)
{
ClrLCDBuff(lcdBuff,8);
//DisplayLCD_ht1621(lcdBuff,8);
lcdBuff[0] = lcdtab[11];
lcdBuff[1] = lcdtab[13];
lcdBuff[2] = lcdtab[13];
lcdBuff[3] = lcdtab[12];
lcdBuff[4] = lcdtab[13];
DisplayLCD_ht1621(lcdBuff,8);
}
//显示 正在测试中---
void Set_testing(void)
{
//ClrLCDBuff(lcdBuff,8);
//DisplayLCD_ht1621(lcdBuff,8);
lcdBuff[0] = lcdtab[10];
lcdBuff[1] = lcdtab[10];
lcdBuff[2] = lcdtab[10];
lcdBuff[3] = lcdtab[16];
lcdBuff[4] = lcdtab[16];
lcdBuff[5] = lcdtab[16];
//lcdBuff[4] = lcdtab[13];
DisplayLCD_ht1621(lcdBuff,8);
}
//显示 对准符号|-
void Set_Aiming(void)
{
//ClrLCDBuff(lcdBuff,8);
//DisplayLCD_ht1621(lcdBuff,8);
lcdBuff[0] = lcdtab[14];
lcdBuff[1] = lcdtab[16];
lcdBuff[2] = lcdtab[16];
lcdBuff[3] = lcdtab[16];
lcdBuff[4] = lcdtab[16];
lcdBuff[5] = lcdtab[16];
//lcdBuff[4] = lcdtab[13];
DisplayLCD_ht1621(lcdBuff,8);
}
//将长整数转换成BCD码,放入BCD缓冲区 ,限制6位
char uintTObcd(long in,uchar *sp)
{
long intm,inb;
uchar ch;
char i,j;
char * spa;
spa = sp;
inb = in;
intm = 100000;
j = 6;
for(i=0;i<6;i++) {
ch = inb/intm;
inb = inb%intm;
intm /= 10;
sp[i] = ch;
}
//if(i == 8) ch = 8;
return ch;
}
//将BCD码转换成显示段码放入LCD缓冲区
void PutLCDBuff(uchar* sp)
{
char ch,i;
uchar uch;
char *spp;
spp = sp;
ClrLCDBuff(lcdBuff,8);
for(i=0;i<6;i++) {
ch = spp[i];
//前置0禁止显示
lcdBuff[i] = lcdtab[ch];
if(spp[0] == 0) {
lcdBuff[0] = lcdtab[16];
if(spp[1] == 0)
lcdBuff[1] = lcdtab[16];
}
}
set_p(1); //P的亮灭
set_m(1); //M的亮灭
}
//上电显示符号
void main_start(void)
{
lcdBuff[0] = lcdtab[0];
lcdBuff[1] = lcdtab[0];
lcdBuff[2] = lcdtab[0];
//lcdBuff[3] = 0x01;
//lcdBuff[4] = 0x01;
//lcdBuff[5] = 0x01;
//lcdBuff[6] = 0x01;
set_m(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -