📄 lcdkey03.c
字号:
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
#define lcd_bus P1
#define key_bus P0
sbit rs=P3^0;
sbit rw=P3^1;
sbit e =P3^2;
sbit P2_4=P2^4;
sbit beep=P3^5;
sbit load=P2^0;
sbit sclk=P2^1;
sbit sdata=P2^2;
sbit DQ =P3^5; //定义通信端口
uchar code table[16]={15,0,14,13,7,8,9,12,4,5,6,11,1,2,3,10};
//年月度
uchar code hanzi[]={0x80,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,
0xf,0x9,0xf,0x9,0xf,0x9,0x11,0,
0x1C,0x14,0x1C,0x0,0x0,0x0,0x00,0x00};
uchar code str1[]="I LIKE MCU";
uchar code str2[]="INPUT FREQENCY:";
uchar code str3[]="INPUT PHASE:";
uchar code str4[]="1:FREQENCY"; //频率
uchar code str5[]="2:PHASE"; //相位
uchar code str6[]="3:AMPLITUDE"; //幅度
//uchar code str7[]="4: HELP";
uchar code str8[]="4:TEMPERATURE"; //温度
uchar code str9[]="temperature is:";
uchar code str10[]="5:INPUT TL";
uchar code str11[]="6:INPUT TH";
uchar code he[]=" A:OK B:DEL D:UP";
uchar code am[]="INPUT AMPLITUDE:";
uchar code warn[]="WARNING!!VOLTAGE < 5V";
uchar state=0;
uchar fre[20];
uchar TL[3];
uchar TH[3];
uchar TLL;
uchar THH;
void lcd_wrcmd(uchar cmd);
void lcd_wrdata( uchar lcddata);
delay(int d)
{
while(--d);
}
/*****************读按键***************/
uchar getkey()
{
uchar keycode=0xff,temp,i;
key_bus=0x0f;
temp=key_bus&0x0f;
if(temp!=0x0f) //有键按下
{
beep=0;
key_bus=0x7f;
for(i=0;i<4;i++)
{
temp=key_bus&0x0f;
if(temp==0x07)
{
keycode=i*4;
break;
}
else if(temp==0x0b)
{
keycode=i*4+1;
break;
}
else if(temp==0x0d)
{
keycode=i*4+2;
break;
}
else if(temp==0x0e)
{
keycode=i*4+3;
break;
}
key_bus=(key_bus>>1)|0x80;
}
while((key_bus&0x0f)!=0x0f) //等待释放
{
key_bus=0x0f;
}
beep=1;
}
return keycode;
}
reset(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
//读一个字节
unsigned char read_byte(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80; /*LSB to MSB*/
delay(4);
}
return(dat);
}
//写一个字节
write_byte(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
}
//读取温度
//读取温度
unsigned char read_temperature(void)
{
unsigned char a=0;
unsigned char b=0;
reset();
write_byte(0xCC); // 跳过读序号列号的操作
write_byte(0x44); // 启动温度转换
reset();
write_byte(0xCC); //跳过读序号列号的操作
write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=read_byte();
b=read_byte();
b=b<<4;
a=a>>4;
return(a|b);
}
unsigned char tempdisplay(void)
{
unsigned char iii,i,r=0,j;
unsigned char t,stra[3];
float tt=0;
lcd_wrcmd(0x0f);
lcd_wrcmd(0xc9);
lcd_wrdata(2);
lcd_wrdata(0x43);
lcd_wrcmd(0x81);
for(j=0;j<16;j++)lcd_wrdata(str9[j]);
while(1)
{
t=read_temperature();
if(t<TLL||t>THH)
P2_4=0;
else P2_4=1;
stra[0]=t/100+'0';
stra[1]=t%100/10+'0';
stra[2]=t%10+'0';
if(stra[0]=='0')
r=1;
lcd_wrcmd(0xc6+r);
for(i=r;i<3;i++)
lcd_wrdata(stra[i]);
lcd_wrcmd(0xcf);
iii=table[getkey()];
if(iii==13)
{
state=1;
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
lcd_wrcmd(0x80);
break;
}
}
}
dac_tlc5620(uchar send_char)
{
uchar i;
load=1;
sclk=1;sdata=0;sclk=0;
sclk=1;sdata=0;sclk=0;
sclk=1;sdata=1;sclk=0;
for(i=0;i<8;i++)
{
sclk=1;
if(send_char&0x80) sdata=1;
else sdata=0;
sclk=0;
send_char=send_char<<1;
}
load=0;
load=1;
}
/**********判断忙标志,返回的是一个位BF**********/
bit lcd_busy(void)
{
uchar bflag;
rs=0;
rw=1;
_nop_();
e=1;
_nop_();
lcd_bus=0xff;
bflag=lcd_bus;
e=0;
return(bit)(bflag&0x80); //BF=1 busy
}
/*********写命令,有两个参数,第一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1:判断;为 0:不判断****************/
void lcd_wrcmd(uchar cmd)
{
while(lcd_busy());
lcd_bus=cmd;
rs=0;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
/************向液晶片写数据***************/
void lcd_wrdata( uchar lcddata)
{
while(lcd_busy());
lcd_bus=lcddata;
rs=1;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
/****************初始化***************/
void lcd_ini(void)
{
lcd_wrcmd(0x38);
delay(100);
lcd_wrcmd(0x0c);
delay(100);
lcd_wrcmd(0x06);
delay(100);
lcd_wrcmd(0x01);
delay(100);
}
//////////////////////////////////////////////
//
// 生成汉字子模函数
// 当lcd_wrdata(0);显示第一个汉字
// 当lcd_wrdata(1);显示第二个汉字
//
//////////////////////////////////////////////
lcd_h()
{
uchar i;
lcd_wrcmd(0x40);
for(i=0;i<24;i++) lcd_wrdata(hanzi[i]);
}
welcome()
{
uchar temp=0x12,w;
lcd_wrcmd(0x0c);
lcd_wrcmd(0x82);
for(w=0;w<strlen(str1);w++)
lcd_wrdata(str1[w]);
lcd_h();
lcd_wrcmd(0xc4);
lcd_wrdata('2'); lcd_wrdata('0');lcd_wrdata('0');lcd_wrdata('7');
lcd_wrdata(0);
lcd_wrdata('0');lcd_wrdata('7');
lcd_wrdata(1);
while(1)
{
temp=getkey();
if(temp!=0xff) //按任意键跳转
{
state=1;
lcd_wrcmd(1);
break;
}
}
}
phase()
{
uchar i,j,t,cnt=0;
lcd_wrcmd(0x0f);
lcd_wrcmd(0xc9);
lcd_wrdata(2);
lcd_wrcmd(0x83);
for(t=0;t<strlen(fre);t++)lcd_wrdata(0x30+fre[t]);
lcd_wrcmd(0xc5);
while(1) //按键处理
{
i=table[getkey()];
if(i<10)
{ cnt++;
if(cnt<=3)
{
lcd_wrcmd(0xc5+cnt-1);
lcd_wrdata(0x30+i);
}
else
{
cnt=0;
lcd_wrcmd(0xc5);
for(j=0;j<=3;j++)
lcd_wrdata(' ');
lcd_wrcmd(0xc5);
}
}
else if(i==12)
{
state=1;
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
lcd_wrcmd(0x80);
break;
}
else if(i==13)
{
cnt=0;
lcd_wrcmd(0xc5);
for(j=0;j<=3;j++)
lcd_wrdata(' ');
lcd_wrcmd(0xc5);
}
}
}
frequency()
{
uchar i,j,cnt=0; // 假如将cnt定义成全局变量,当退出这个界面时,cnt仍然保存原来的值
lcd_wrcmd(0x80); //会出现光标乱跳的错误
lcd_wrcmd(0xce);
lcd_wrdata('H');
lcd_wrdata('Z');
lcd_wrcmd(0x81);
for(i=0;i<15;i++)lcd_wrdata(str2[i]);
lcd_wrcmd(0x0f);
lcd_wrcmd(0xc0);
for(i=0;i<20;i++)
fre[i]=NULL;
while(1) //按键处理
{
i=table[getkey()];
if(i<10)
{ cnt++;
if(cnt<=10)
{ fre[cnt-1]=i;
lcd_wrcmd(0xc0+cnt-1);
lcd_wrdata(0x30+i);
}
else
{
cnt=0;
lcd_wrcmd(0xc0);
for(j=0;j<=10;j++)
lcd_wrdata(' ');
lcd_wrcmd(0xc0);
}
}
else if(i==12)
{
state=1;
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
lcd_wrcmd(0x80);
break;
}
else if(i==13)
{
cnt=0;
lcd_wrcmd(0xc0);
for(j=0;j<=10;j++)
lcd_wrdata(' ');
lcd_wrcmd(0xc0);
}
}
}
warning()
{
uchar i,ii;
lcd_wrcmd(1);
lcd_wrcmd(0x0c);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -