📄 lcd.c
字号:
#include<reg51.h>
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
#define cycle 2000
#define cycle1 200
#define db0_db7 P1
static const uchar code table[]={'v','o','l','t','a','g','e','='};
static const uchar code str[]={"zhouxiao"};
uint data volt[6]={0x30,'.',0x30,0x30,0x30,0x30};
uchar xdata cs0809 _at_ 0xfeff;
sbit RS=P2^1;
sbit RW=P2^2;
sbit E=P2^3;
uint counti;
uchar temp;
unsigned char flag=0;
void init();
void write(uchar tempdata);
void writeddr(uchar tempdata);
void checkbusy();
void delay(uint n);
void display();
void displaya();
void main(void)
{
init();
displaya();
TMOD=0x11;
TH0=(65536-cycle)/256;
TL0=(65536-cycle)%256;
TH1=(65536-cycle1)/256;
TL1=(65536-cycle1)%256;
TCON=0x55;
IE=0x8a;
IP=0x04;
counti=0;
while(1);
display();
}
void display()
{ uint a;
write(0x8a); //显示位置
for(a=0;a<6;a++)
writeddr(volt[a]); //显示数值
}
void displaya()
{
uint b;
for(b=0;b<8;b++)
writeddr(table[b]);
display(); //显示数值
}
void delay(uint n)
{uint i;
for(i=0;i<n;i++)
{i=i;}
}
void init()
{
delay(500);
write(0x38);//显示模式5*7
write(0x01);//光标复位
write(0x06);//光标右移
write(0x0C);
}
void write(uchar tempdata)
{checkbusy();
db0_db7=tempdata;
E=1;
nop;
E=0;
nop;
}
void writeddr(uchar tempdata)
{
checkbusy();
RS=1;
E=1;
db0_db7=tempdata;
nop;
E=0;
nop;
}
void checkbusy()
{
uchar temp;
RS=0;
RW=1;
do
{db0_db7=0xff;
E=1;
delay(50);
nop;
temp=db0_db7;
E=0;
}while((temp&0x80)==0x80);
RW=0;
}
void service_int0() interrupt 1 using 2
{
static uchar s_counter;
if(++s_counter>=8)
{
flag++;
if(flag<=16)
{
for(counti=0;counti<8;counti++)
{
write(0xc0+flag+counti);
writeddr(str[counti]);
temp=0xc0+flag+counti;
}
if(flag>=1)
{
write(0xc0+flag);
writeddr(0);
}
}
else
{
if(flag>=32)
for(counti=8;counti>=0;counti--)
{
write(0xc0+flag+counti-16);
writeddr(str[counti]);
}
else flag=0;
}
}
TH0=(65536-cycle)/256;
TL0=(65536-cycle)%256;
}
void service_int1() interrupt 3 using 3
{uint vod;
P2=0xFE;
P3=0xbf;
P0=0;
P3=0xff;
//cs0809=0;
IT1=1;
EX1=1;
TH1=(65536-cycle1)/256;
TL1=(65536-cycle1)%256;
}
void service_int2() interrupt 2
{uint vod;
P2=0xFE;
P3=0x7f;
P0=0xff;
vod=P0;
P3=0xff;
//vod=cs0809;
vod*=196;
volt[0]=((vod/10000)+0x30);
volt[2]=(((vod%10000)/1000)+0x30);
volt[3]=((vod%1000)/100+0x30);
volt[4]=((vod%100)/10+0x30);
volt[5]=((vod%10)+0x30);
display();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -