📄 lcd.c
字号:
#include <reg52.h>
#include <intrins.h>
#include <math.h>
#define LCDLENGTH 18 //定义LCD液晶显示的数字长度
//定义LCD引脚
sbit LCDDATA = P0^7;
sbit LCDWR = P0^6;
sbit LCDCS = P0^4;
//定义字段的引脚
#define za 0x10
#define zb 0x01
#define zc 0x04
#define zdp 0x08
#define zf 0x20
#define zg 0x02
#define ze 0x40
#define zd 0x80
//定义字段
unsigned char code seg0[] = {
za+zb+zc+zd+ze+zf, //0
zb+zc, //1
za+zb+zg+ze+zd, //2
za+zb+zc+zd+zg, //3
zb+zc+zf+zg, //4
za+zf+zg+zc+zd, //5
za+zc+zd+ze+zf+zg, //6
za+zb+zc, //7
za+zb+zc+zd+ze+zf+zg, //8
za+zb+zc+zd+zf+zg, //9
za+zb+zc+ze+zf+zg, //a
ze+zf+zg+zd+zc, //b
za+ze+zf+zd, //c
zb+zc+zg+zd+ze, //d
za+ze+zf+zg+zd, //e
za+ze+zf+zg, //f
za+ze+zf+zd+zc, //g 10
zb+zc+zg+ze+zf, //h 11
zc, //i 12
zb+zc+zd+ze, //j 13
ze+zg+zf, //k 14
ze+zf+zd, //l 15
ze+zg+zc, //n 16
ze+zd+zg+zc, //o 17
za+zb+ze+zf+zg, //p 18
za+zb+zc+zf+zg, //q 19
ze+zg, //r 1a
za+zf+zg+zc+zd, //s 1b
ze+zf+zd+zg, //t 1c
zb+zc+zd+ze+zf, //U 1d
zf+zg+zb+zc+zd, //y 1e
zg, //- 1f
0, //space 20
za+zb+zg+ze+zdp, //? 21
za+zb+zc+zd+ze+zf+zdp, //0. 22
zb+zc+zdp, //1. 23
za+zb+zg+ze+zd+zdp, //2. 24
za+zb+zc+zd+zg+zdp, //3. 25
zb+zc+zf+zg+zdp, //4. 26
za+zf+zg+zc+zd+zdp, //5. 27
za+zc+zd+ze+zf+zg+zdp, //6. 28
za+zb+zc+zdp, //7. 29
za+zb+zc+zd+ze+zf+zg+zdp,//8. 2a
za+zb+zc+zd+zf+zg+zdp, //9. 2b
231, // 2c
za+zg+zd, // 2d
ze+zd+zc, //u 2e
ze+zd+zc+za, //v 2f
ze+zg+zc+za, //m 30
za+zc+zd+ze, //w 31
zb+zc+zg+zd+ze+zdp, //d. 32
ze+zg+zc+za+zdp, //m. 33
zf+zg+zb+zc+zd+zdp //y. 34
};
//data unsigned char data bankbuff[6] _at_ 0x4c; //显示六位数字的缓冲区
unsigned char xdata bankbuff[LCDLENGTH];// _at_ 0x4c //显示六位数字的缓冲区
//data unsigned int data bankbuff1[3];// _at_ 0x4c;
unsigned char data dispbuff[7];// _at_ 0x55;
extern bdata unsigned char cont_1; //显示标志位,包括电池,稳定等
extern bdata unsigned char cont_2;
extern bdata unsigned char cont_3;
extern bdata unsigned char cont_4;
//extern unsigned char data flash;
void DispDigital(signed long int li,unsigned char pos);
void delay(signed long int li)
{
for ( ; li>0; li--) ;
}
//向1621写入8BIT
void outbt_8(unsigned char dat)
{
ACC = dat;
B = 8;
for ( ; ; )
{
CY = ACC & 0x80; //带进位左移
LCDDATA = CY;
_nop_();
LCDWR = 0;
_nop_();
LCDWR = 1;
B--;
if (B==0) break;
}
}
//向1621写入4BIT
void outbt_4(unsigned char da)
{
ACC = da;
B = 4;
for ( ; ; )
{
CY = ACC & 0x80; //带进位左移
LCDDATA = CY;
_nop_();
LCDWR = 0;
_nop_();
LCDWR = 1;
B--;
if (B==0) break;
}
}
//向1621写入13个BIT
void wr1621 (unsigned char da_1,unsigned char da_2)
{
LCDWR = 1;
_nop_();
LCDCS = 0;
_nop_();
outbt_8(da_1);
outbt_4(da_2);
_nop_();
LCDCS = 1;
}
//向LCD写入一串数据,在LCD上显示
void wrlcd(void)
{
unsigned char loop;
LCDWR = 1;
LCDCS = 0;
_nop_();
LCDDATA = 1;
_nop_();
LCDWR = 0;
_nop_();
LCDWR = 1;
outbt_8(0x40);
for (loop=0;loop<16;loop++)
{
outbt_8(bankbuff[loop]);
}
LCDCS = 1;
}
//初始化1621
void InitLcd(void)
{
wr1621(0x85,0x20);
wr1621(0x80,0x20);
wr1621(0x80,0x60);
}
void tran (void)
{
bankbuff[11] = cont_1;
bankbuff[1] = cont_2;
bankbuff[0] = cont_3;
bankbuff[10] = cont_4;
bankbuff[12] = (seg0[dispbuff[0]]&0xf0) | ((seg0[dispbuff[1]]>>4) & 0x0f);
bankbuff[13] = (seg0[dispbuff[1]]&0x0f) | ((seg0[dispbuff[0]]<<4) & 0xf0);
bankbuff[2] = (seg0[dispbuff[2]]&0xf0) | ((seg0[dispbuff[3]]>>4) & 0x0f);
bankbuff[14] = (seg0[dispbuff[3]]&0x0f) | ((seg0[dispbuff[2]]<<4) & 0xf0);
bankbuff[3] = (seg0[dispbuff[4]]&0xf0) | ((seg0[dispbuff[5]]>>4) & 0x0f);
bankbuff[15] = (seg0[dispbuff[5]]&0x0f) | ((seg0[dispbuff[4]]<<4) & 0xf0);
}
//显示一串字符串
void DispStr(unsigned char code *ptr_code)
{
unsigned char loop;
for (loop=0;loop<6;loop++)
{
dispbuff[loop]=*(ptr_code + loop);
}
tran();
wrlcd();
}
//在LCD上显示整数
//输入:待显示的长整数,小数的位数,长整数
void DispDigital(signed long li,signed char pos)
{
signed char loop;
unsigned char ch;
ch = 0;
if (li < 0 ) {li = -li;ch = 1;}
for ( loop = 5; loop>= 0; loop--)
{
dispbuff[loop] = integer % 10;
integer /=10;
}
// conv_int_to_str(li);
// ptr_target=dispbuff;
// dsc(pos); //确定小数点的位置
//确定小数点的位置,首位的零变为空格
if ( (pos > 0) && (pos < 6) )
{
//*(ptr_target+(5-pos)) +=0x22;
dispbuff[5-pos] += 0x22;
}
loop=0;
while (loop<5)
{
/* if (*ptr_target==0)
{
*ptr_target=0x20;
ptr_target++;
loop++;
} else break;*/
if (dispbuff[loop] == 0)
{
dispbuff[loop] = 0x20;
loop++;
}
else break;
}
if (ch==1) dispbuff[0] = 0x1f;
tran(); //在LCD上显示数字
wrlcd();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -