📄 lcd.c
字号:
#include <reg52.h>
#include <string.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P3^4;
sbit rw=P3^5;
sbit e=P3^6;
sbit down=P2^1;
sbit up=P2^0;
sbit yes=P2^2;
sbit lb=P2^3;
uint dn=0;
uint un=0;
bit query=0;
unsigned char bdata TA;
sbit ACC0=TA^0;
sbit ACC1=TA^1;
sbit ACC2=TA^2;
sbit ACC3=TA^3;
sbit ACC4=TA^4;
sbit ACC5=TA^5;
sbit ACC6=TA^6;
sbit ACC7=TA^7;
uchar code xy[]={0x80,0x90,0x88,0x98};
void w_i(uchar ch);
void dis_xyascii(uchar ly ,uchar lx , uint ch);
void flg_on();
void delay(uint n);
void xiang()
{
lb=0;
delay(2000);
lb=1;
delay(3000);
lb=0;
delay(2000);
lb=1;
delay(3000);
}
void delay(uint n) //14us
{
uint i;
for(i=0;i<n;i++);
}
void init_lcd()
{
w_i(0x30); //设置8BIT界面,基本指令
delay(100);
w_i(0x30); //设置8BIT界面,基本指令
delay(100);
w_i(0x0c); // 打开显示,关光标,反白显示
delay(100);
w_i(0x01); // 清屏(DDRAM地址计数器归0
delay(100);
w_i(0x06); // DDRAM计数器地址加1
delay(100);
}
void lcd_clr()
{
w_i(0x01);
delay(1000);
}
bit busy()
{
P1=0xff;
rs=0;
rw=1;
e=1;
TA=P1;
e=0;
if(ACC7==1) //忙
{
return(0);
}
else
{
return(1);
}
}
void w_i(uchar ch) //写指令
{
while(busy()==0); //如果忙就等待
rw=0;
P1=ch;
e=1;
e=0;
}
void w_d(uchar dd) //写数据
{
while(busy()==0);
rs=1;
rw=0;
P1=dd;
e=1;
e=0;
}
void flg_on1() //开光标,不闪烁
{
rs=0;
rw=0;
w_i(0x0e);
delay(50);
}
void flg_on2() //开光标,闪烁
{
rs=0;
rw=0;
w_i(0x0f);
delay(50);
}
void flg_off() //关光标
{
rs=0;
rw=0;
w_i(0x0c);
delay(50);
}
void flg_left(uchar k) //光标左移1位
{
uchar i;
for(i=0;i<k;i++)
{
rs=0;
rw=0;
w_i(0x10);
delay(50);
}
}
void flg_right(uchar k) //光标右移一位
{
uchar i;
for(i=0;i<k;i++)
{
rs=0;
rw=0;
w_i(0x14);
delay(50);
}
}
void hua_left(uchar n) //整图右移一位
{
uchar i;
for(i=0;i<n;i++)
{
rs=0;
rw=0;
w_i(0x18);
delay(50);
}
}
void hua_right(uchar n) //整图右移一位
{
uchar i;
for(i=0;i<n;i++)
{
rs=0;
rw=0;
w_i(0x1c);
delay(50);
}
}
void fanbai(uchar k) //反白指定行(注意:每当切换下一行反白时,要把上一次反白的行关闭
{
switch (k)
{
case 0: //1行
{
rs=0;
rw=0;
w_i(0x34); //开启扩展命令方式
delay(50);
w_i(0x04);
delay(50);
w_i(0x30); //恢复正常命令方式
delay(50);
w_i(0x30); //恢复正常命令方式
delay(50);
break;
}
case 1: //2行
{
rs=0;
rw=0;
w_i(0x34); //开启扩展命令方式
delay(50);
w_i(0x05);
delay(50);
w_i(0x30); //恢复正常命令方式
delay(50);
w_i(0x30); //恢复正常命令方式
delay(50);
break;
}
case 2: //3行
{
rs=0;
rw=0;
w_i(0x34); //开启扩展命令方式
delay(50);
w_i(0x06);
delay(50);
w_i(0x30); //恢复正常命令方式
delay(50);
w_i(0x30); //恢复正常命令方式
delay(50);
break;
}
case 3: //4行
{
rs=0;
rw=0;
w_i(0x34); //开启扩展命令方式
delay(50);
w_i(0x07);
delay(50);
w_i(0x30); //恢复正常命令方式
delay(50);
w_i(0x30); //恢复正常命令方式
delay(50);
break;
}
}
}
void dis_xychar(uchar ly ,uchar lx , uchar *str) //一排显示中文(小于8字)
{
uchar temp;
temp=xy[ly]+lx;
rs=0;
rw=0;
w_i(temp);
delay(50);
temp=0;
do{
if(str[temp]==0)
{break;}
w_d(str[temp]);
delay(10);
temp++;
}while(1);
}
void dis_xyascii(uchar ly ,uchar lx , uint ch) //定位显示ASCII符号(2个ASCII字符组成)
{
uchar temp;
uchar temp2;
uchar temp3;
temp2=ch>>8;
temp2=temp2&0xff; //取出高4位
temp3=ch&0xff; //取低4位
temp=xy[ly]+lx;
rs=0;
rw=0;
w_i(temp);
delay(50);
w_d(temp2);
w_d(temp3);
delay(50);
}
void dis_xynum(uchar ly ,uchar lx , uchar ch) //定位显示数字
{
uchar temp;
uchar temp2;
temp2=ch>>4;
temp2=temp2&0x0f; //取出高4位
ch=ch&0x0f; //取低4位
temp=xy[ly]+lx;
rs=0;
rw=0;
w_i(temp);
delay(50);
temp2=temp2+0x30;
w_d(temp2);
delay(50);
ch=ch+0x30;
w_d(ch);
delay(50);
}
void dis_xylongchar(uchar ly ,uchar lx , uchar *str) // 长中文显示(小于32字)
{
uchar temp=0;
uchar temp2=0;
temp2=xy[ly]+lx;
rs=0;
rw=0;
w_i(temp2);
do{
if(str[temp]==0)
{break;}
w_d(str[temp]);
temp++;
if(temp==16-2*lx)
{
temp2=xy[ly+1]; //换行顶格开始
rs=0;
rw=0;
w_i(temp2);
}
if(temp==32-2*lx)
{
temp2=xy[ly+2]; //换行顶格开始
rs=0;
rw=0;
w_i(temp2);
}
if(temp==48-2*lx)
{
temp2=xy[ly+3]; //换行顶格开始
rs=0;
rw=0;
w_i(temp2);
}
}while(1);
}
void dwar(uchar *aa)
{
uint temp=0;
uint temp2=0x80;
uchar i,j;
w_i(0x32); //先打开绘图功能(此时扩展指令允许位为0)
delay(50);
w_i(0x36); //保持刚才打开的绘图功能,在把扩展指令位值1
delay(50);
for(i=0;i<32;i++)
{
w_i(temp2);
temp2++;
delay(50);
w_i(0x80);
delay(50);
for(j=0;j<16;j++)
{
temp++;
w_d(aa[temp]);
delay(50);
}
}
temp2=0x80;
for(i=0;i<32;i++)
{
w_i(temp2);
temp2++;
delay(50);
w_i(0x88);
delay(50);
for(j=0;j<16;j++)
{
temp++;
w_d(aa[temp]);
delay(50);
}
}
w_i(0x30); //画完图就回到普通模式下
delay(50);
w_i(0x30);
delay(50);
}
void clr_xy(uchar ly,uchar lx) //定点清除
{
dis_xyascii(ly,lx,0x2020);
}
void dis_xyflg1(uchar ly ,uchar lx ) //定点显示光标不闪烁
{
uchar temp;
temp=xy[ly]+lx;
rs=0;
rw=0;
w_i(temp);
delay(50);
temp=0;
flg_on1();
}
void dis_xyflg2(uchar ly ,uchar lx ) //定点显示光标闪烁
{
uchar temp;
temp=xy[ly]+lx;
rs=0;
rw=0;
w_i(temp);
delay(50);
temp=0;
flg_on2();
}
/*----------------------------------------
------------------------------------------*/
void main()
{
init_lcd();
do
{
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -