📄 lcd.c
字号:
#include"reg52.h"
#include"intrins.h"
#include"ziku.h"
#include"def.h"
sbit rs = P3^4;
sbit rw = P3^5;
sbit ep = P3^6;
uchar code AD_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, //第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, //第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, //第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, //第四行汉字位置
};
uchar value[];
void delay(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
bit lcd_busy()
{
bit result;
rs=0;
rw=1;
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P1&0x80);
ep=0;
return result;
}
void wcmd(uchar cmd)
{
while(lcd_busy());
rs=0;
rw=0;
ep=0;
_nop_();
_nop_();
P1=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
void wdat(uchar dat)
{
while(lcd_busy());
rs=1;
rw=0;
ep=0;
P1=dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
void lcd_init()
{
delay(10);
wcmd(0x30); //功能设置,一次送8位数据,基本指令集
wcmd(0x0C); //0000,1100 整体显示,游标off,游标位置off
wcmd(0x01); //0000,0001 清DDRAM
wcmd(0x02); //0000,0010 DDRAM地址归位
wcmd(0x80); //1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC//
wcmd(0x04); //点设定,显示字符/光标从左到右移位,DDRAM地址加 一//
wcmd(0x0C); //显示设定,开显示,显示光标,当前显示位反白闪动
}
void cleartext()
{
wcmd(0x30); //8BitMCU,基本指令集合
wcmd(0x01);
}
void putstr(uchar row,uchar col,uchar *puts)
{
wcmd(0x30); //8BitMCU,基本指令集合
wcmd(AD_TABLE[8*row+col]); //起始位置
while(*puts != '\0') //判断字符串是否显示完毕
{
wcmd(AD_TABLE[8*row+col]);
wdat(*puts); //一个汉字要写两次
puts++;
wdat(*puts);
puts++;
col++;
if(col==8) //判断换行
{ //若不判断,则自动从第一行到第三行
col=0;
row++;
}
if(row==4) row=0; //一屏显示完,回到屏左上角
}
}
void hanzi(uchar row,uchar col,uchar *puts)
{
wcmd(0x30); //8BitMCU,基本指令集合
wcmd(AD_TABLE[8*row+col]); //起始位置
wcmd(AD_TABLE[8*row+col]);
wdat(*puts); //一个汉字要写两次
}
void putbmp(uchar *put)
{
uchar x,y;
for(y=0;y<32;y++)
for(x=0;x<8;x++)
{
wcmd(0x80+y);
wcmd(0x80+x);
wdat(*put);
put++;
wdat(*put);
put++;
}
for(y=0;y<32;y++)
for(x=8;x<16;x++)
{
wcmd(0x80+y);
wcmd(0x80+x);
wdat(*put);
put++;
wdat(*put);
put++;
}
}
void clearbmp()
{
uchar x,y;
lcd_init();
wcmd(0x34);
wcmd(0x3e);
for(y=0;y<32;y++)
for(x=0;x<8;x++)
{
wcmd(0x80+y);
wcmd(0x80+x);
wdat(0x00);
wdat(0x00);
}
for(y=0;y<32;y++)
for(x=8;x<16;x++)
{
wcmd(0x80+y);
wcmd(0x80+x);
wdat(0x00);
wdat(0x00);
}
}
void put_5_7(uchar row,uchar col,uchar dat)
{
uchar i;
uint a;
a = 2550/dat-10;
for(i=0;i<4;i++)
{
value[i] = a%10;
a = a/10;
}
if(value[3] != 0) {
for(i=0;i<16;i++)
{
wcmd(0x80+row*16+i);
wcmd(0x80+col);
wdat(ziku[value[3]*16+i]);
wdat(ziku[value[2]*16+i]);
}
for(i=0;i<16;i++)
{
wcmd(0x80+row*16+i);
wcmd(0x80+col+1);
wdat(ziku[value[1]*16+i]);
wdat(ziku[160+i]);
}
for(i=0;i<16;i++)
{
wcmd(0x80+row*16+i);
wcmd(0x80+col+2);
wdat(ziku[value[0]*16+i]);
wdat(ziku[176+i]);
}
}
else
{
if(value[2] != 0)
{
for(i=0;i<16;i++)
{
wcmd(0x80+row*16+i);
wcmd(0x80+col);
wdat(ziku[value[2]*16+i]);
wdat(ziku[value[1]*16+i]);
}
for(i=0;i<16;i++)
{
wcmd(0x80+row*16+i);
wcmd(0x80+col+1);
wdat(ziku[160+i]);
wdat(ziku[value[0]*16+i]);
}
for(i=0;i<16;i++)
{
wcmd(0x80+row*16+i);
wcmd(0x80+col+2);
wdat(ziku[176+i]);
}
}
else
{
for(i=0;i<16;i++)
{
wcmd(0x80+row*16+i);
wcmd(0x80+col);
wdat(ziku[value[1]*16+i]);
wdat(ziku[160+i]);
}
for(i=0;i<16;i++)
{
wcmd(0x80+row*16+i);
wcmd(0x80+col+1);
wdat(ziku[value[0]*16+i]);
wdat(ziku[176+i]);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -