📄 lcdbase.c
字号:
//#include "define.h"
#include "LcdBase.h"
#include "string.h"
uchar intBuf[16];
void lcdDelay1ms(uint time, uchar freDiv) // 延迟1ms * time,大概值
{
uint i, j, J;
J = DELAY_LOOP / freDiv;
for (i=0; i<time; i++)
{
for (j=0; j<J; j++);
}
}
uchar isLcdBusy(void)
{
uchar result;
uchar lcdIBPage = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
lcd_e = 0;
lcd_rw = 1;
lcd_rs = 0;
P4 = 0xff;
lcd_e = 1;
result = P4&0x80;
lcd_e = 0;
SFRPAGE = lcdIBPage;
return result;
}
void lcdWriteCmd(uchar cmd)
{
uchar lcdWCPage = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
while (isLcdBusy() != 0);
lcd_e = 0;
lcd_rw = 0;
lcd_rs = 0;
P4 = cmd;
lcd_e = 1;
lcd_e = 0;
SFRPAGE = lcdWCPage;
}
/*
void lcdPos(uchar pos)
{
while (isLcdBusy() != 0);
lcdWriteCmd(pos | 0x80);
}*/
uchar lcdReadData()
{
uchar result;
uchar lcdRDPage = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
while (isLcdBusy() != 0);
lcd_e = 0;
P4 = 0xff;
lcd_rw = 1;
lcd_rs = 1;
lcd_e = 1;
result = P4;
lcd_e = 0;
SFRPAGE = lcdRDPage;
return result;
}
void lcdWriteData(uchar dat)
{
uchar lcdWDPage = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
while (isLcdBusy() != 0);
lcd_e = 0;
lcd_rw = 0;
lcd_rs = 1;
P4 = dat;
lcd_e = 1;
lcd_e = 0;
SFRPAGE = lcdWDPage;
}
void lcdInit(void)
{
lcdWriteCmd(0x38); // 8 bits, 2 lines
lcdDelay1ms(2, 2);
lcdWriteCmd(0x08); // display off, cursor off, cursor blink off
lcdDelay1ms(2, 2);
lcdWriteCmd(0x06); // increment mode, no shifting
lcdDelay1ms(2, 2);
lcdWriteCmd(0x01); // clear all
lcdDelay1ms(2, 2);
lcdWriteCmd(0x0c); // display on, cursor off, cursor blink off
lcdDelay1ms(2, 2);
}
// 一些高级函数
void lcdDisplay(char *p)
{
uchar i;
char *pt = p;
lcdWriteCmd(0x01);
lcdWriteCmd(0x80|0x00);
for (i = 0; i < 15; i++)
{
if (*p == '\0')
break;
lcdWriteData(*(p++));
}
lcdWriteCmd(0x80|0x40);
for (i = 0; i < 15; i++)
{
if (*p == '\0')
break;
lcdWriteData(*(p++));
}
}
void putLong(long inum)
{
/*将一个int型数据转化成ascii码字符串,结尾以'\0'结束,并将结果存于intBuf(全局变量数组,可在任何地方被调用)*/
long data t;
uchar data c = 0;
bit flag = 1;
t = 100000000L;
for (; c<16; c++)
intBuf[c] = '\0';
c = 0;
if (inum < 0)
{
intBuf[0] = '-';
c++;
inum = -inum;
}
for (; t>=10; t/=10) //此为将int型转化成字符串算法
{
if (t == 10)
{
intBuf[c] = inum/t+'0';
intBuf[++c] = inum%t+'0';
intBuf[++c] = '\0';
break;
}
if (inum < t&flag)
continue;
else
{
flag = 0;
intBuf[c] = inum/t;
inum -= (long)(intBuf[c]) * t;
intBuf[c] += '0';
c++;
}
}
}
void showString(uchar *str, bit line) //line值为0,显示第一行,line为1,显示第二行
{
uchar idata k;
if (line == 0) //控制显示在第几行是通过k的地址不同来实现的
{
for (k=0x80; k<0x90; k++)
{
if (*str == '\0') //*str的指针不下移,会执行到k=0x8f为止
{
lcdWriteCmd(k);
lcdWriteData(' ');//显示空格清掉上次显示部分
}
else
{
lcdWriteCmd(k);
lcdWriteData(*str);
str++;
}
}
}
if (line == 1)
{
for (k=0xc0; k<0xd0; k++)
{
if(*str == '\0')
{
lcdWriteCmd(k);
lcdWriteData(' ');
}
else
{
lcdWriteCmd(k);
lcdWriteData(*str);
str++;
}
}
}
}
void putDot(uchar fBit)
{
//将intBuf数组由后向前数第fBit位插入小数点'.',在系统避免用浮点数运算场合下,用long型数据的乘除得到运算结果,再在结果中取小数位
//比如,32/456结果的显示处理可以如此:将32乘10000,再除以456,将结果(int型数据)用putLong()处理,此时是整数,再调用putDot(4),保留四位小数即可,这样处理比调用浮点运算+浮点显示要快得多
char idata t0;
char idata pf;
pf = strlen(intBuf) - fBit;
if(intBuf[0] != '-')
{
if(pf > 0)
{
t0 = strlen(intBuf);
for(pf=t0; pf>t0-fBit; pf--)
{
intBuf[pf] = intBuf[pf-1];
}
intBuf[pf] = '.';
}
else
{
pf = strlen(intBuf) - 1;
for (t0=fBit+1; t0>=0; t0--,pf--)
{
if (pf>=0)
intBuf[t0] = intBuf[pf];
else
intBuf[t0] = '0';
}
intBuf[1] = '.';
}
}
else
{
if (pf > 1)
{
t0 = strlen(intBuf);
for (pf=t0; pf>t0-fBit; pf--)
{
intBuf[pf] = intBuf[pf-1];
}
intBuf[pf] = '.';
}
else
{
pf = strlen(intBuf) - 1;
for (t0=fBit+2; t0>=1; t0--,pf--)
{
if (pf >= 1)
intBuf[t0] = intBuf[pf];
else
intBuf[t0] = '0';
}
intBuf[0] = '-';
intBuf[2] = '.';
}
}
}
void showLong(long l, bit line)
{
putLong(l);
showString(intBuf, line);
}
void showFloat(float f, uchar fBit, bit line)
{
int i;
for (i = 0; i < fBit; i++)
{
f *= 10;
}
showFloatL(f, fBit, line);
}
void showFloatL(long l, uchar fBit, bit line)
{
putLong(l);
putDot(fBit);
showString(intBuf, line);
}
void showStringAndLong(uchar *str, long inum, bit line)
{
long data t;
uchar data c = 0;
bit flag = 1;
t = 100000000L;
for (; c<16; c++)
intBuf[c] = '\0';
//字符串数组复制
for (c=0; *str!='\0'; c++)
{
if (*str == ' ')
intBuf[c] = '\0';
else
intBuf[c] = *str;
str++;
}
//int转换成字符串
if (inum < 0)
{
intBuf[c] = '-';
c++;
inum = -inum;
}
for (; t>=10; t/=10) //此为将int型转化成字符串算法
{
if (t == 10)
{
intBuf[c] = inum/t+'0';
intBuf[++c] = inum%t+'0';
intBuf[++c] = '\0';
break;
}
if (inum < t&flag)
continue;
else
{
flag = 0;
intBuf[c] = inum/t;
inum -= (long)(intBuf[c]) * t;
intBuf[c] += '0';
c++;
}
}
showString(intBuf, line);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -