📄 1602.c
字号:
#include<reg52.h>
#include"lcd.h"
#define uchar unsigned char
#define uint unsigned int
uchar finish;//解码标志位
uchar address1,address2,data1,data2;//地址位,反地址位,数据位,反数据位
sbit P32=P3^2;
uchar code tab1[]="the lcd_1602 is ";
uchar code tab2[]="made by xiao yu ";
uchar tab3[]=" jie ma ";
uchar tab4[]=" 0000.0000 ";
uchar code number[]="0123456789abcdef.";
uchar tt[32];//32位码
uchar d[9];//数据缓冲
uchar led[8];//数据缓冲
sbit P10=P1^0;//右灯
sbit P11=P1^1;//前灯
sbit P12=P1^2;//后灯
sbit P13=P1^3;//左灯
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
void display(void);
void count(void);
void add(void);
void main(void)
{
uchar i,j;
/*lcd的初始部分*/
P1=0xff;
P1=0x0f;//停止
init_lcd();//初始化
clear_lcd();//清屏
gotoxy(1,0);//显示第一行
for(i=0;i<16;i++){write_lcd_data(tab1[i]);delay(200);}
//write_lcd_command(0x0e);//光标显示,字符不闪烁
gotoxy(2,0);//显示第二行
for(i=0;i<16;i++){write_lcd_data(tab2[i]);delay(200);}
write_lcd_command(0x0e);//光标显示,字符不闪烁
write_lcd_command(0x02);//光标回到左上角
for(i=0;i<32;i++)
{
if(i==16)
{gotoxy(2,0); //光标到第二行0列
}
write_lcd_command(0x14);//光标移一位
delay(200);
}
gotoxy(2,15);//光标停到15的位置
delay(1000);//延时1s
//write_lcd_command(0x01); //清屏
gotoxy(1,0); //显示第一行
for(i=0;i<16;i++) write_lcd_data(tab3[i]);
gotoxy(2,0); //显示第二行
for(i=0;i<16;i++) write_lcd_data(tab4[i]);
write_lcd_command(0x0c);//关光标
/*解码程序*/
TMOD=0x01;
TH0=0;TL0=0;
EX0=1; //开外部中断0
//ET0=1;
IT0=1;//下降沿产生中断
EA=1;
TR0=0;//定时器0关闭
while(1)
{
if(finish==1)
{
finish=0;
add();
}
count();
display();
gotoxy(2,3);
for(j=0;j<9;j++)
{write_lcd_data(d[j]);}
if((data1==0x00)&&(data2==0xff)){P1=0xfd;} //前
if((data1==0x03)&&(data2==0xfc)){P1=0xd7;}//左 P14可以为任意值
if((data1==0x14)&&(data2==0xeb)){P1=0x7e;}//右 P16可以为任意值
if((data1==0x17)&&(data2==0xe8)){P1=0xab;}//后
if((data1==0x15)&&(data2==0xea)){P1=0x0f;}//停
}
}
void int0(void) interrupt 0 //外部中断0
{
uchar i,t;
EX0=0;//关外部中断0
TR0=1;//定时器0开始记数
while(P32==0);
TR0=0;//定时器0关
t=(TH0*256+TL0)/1000;//低电平9 MS
TH0=0;TL0=0;
if(t==8)
{
TR0=1;
while(P32==1);
TR0=0;
t=(TH0*256+TL0)/1000;//低电平3 MS
TH0=0;TL0=0;
if(t==3)
{
for(i=0;i<32;i++)
{
TR0=1;
while(P32==0);//等待
TR0=0;
t=(TH0*256+TL0)/1000;
TH0=0;TL0=0;
if(t==0) //0跟1的低电平的时间相同
{
TR0=1;//定时器0开
while(P32==1);
TR0=0;//定时器0关
//while(P32==1);//{if(TH0>10) break;}//如果高电平的时间大于2.5ms,跳出while 循环
//TR0=0;//定时器0关
t=(TH0*256+TL0)/1000;
TH0=0;TL0=0;//循环一次重新付初值
tt[i]=t;
}
}
}
}
finish=1;
EX0=1;//外部中断开
}
void add(void) //转换成10进制数子函数
{
uchar i;
address1=0;
address2=0;
data1=0;
data2=0;
for(i=0;i<8;i++) //位
{
address1=(tt[i]<<7)|(address1>>1);
address2=(tt[8+i]<<7)|(address2>>1);
data1=(tt[16+i]<<7)|(data1>>1);
data2=(tt[24+i]<<7)|(data2>>1);
}
}
void count(void)
{
led[7]=(0xf0&address1)>>4;//取高四位
led[6]=0x0f&address1; //低四位
led[5]=(0xf0&address2)>>4;
led[4]=0x0f&address2;
led[3]=(0xf0&data1)>>4;
led[2]=0x0f&data1;
led[1]=(0xf0&data2)>>4;
led[0]=data2&0x0f;
}
void display(void) //显示
{
d[0]=number[led[7]];
d[1]=number[led[6]];
d[2]=number[led[5]];
d[3]=number[led[4]];
d[4]=number[16];
d[5]=number[led[3]];
d[6]=number[led[2]];
d[7]=number[led[1]];
d[8]=number[led[0]];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -