📄 0.c
字号:
#include <intrins.h>
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//#include"absacc.h"
//#include"intrins.h"
#define dport P1
#define unchar unsigned char
sbit RS=P3^4;
sbit RW=P3^3;
sbit E=P3^2;
unchar xpos; //列方向地址指针
unchar ypos; //行方向地址指针
#define nodisp 0
#define nocur 1
#define curnoflash 2
#define curflsh 3
void lcdwcn(unchar);
void lcdwc(unchar);
void writechar(unchar);
void lcdpos();
void lcdwd(unchar);
void lcdwdn(unchar);
uchar table[10]= {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};//数码管代码
sbit BEEP = P3^5; //蜂鸣器驱动线
uchar dis_buf; //显示缓存
uchar temp;
uchar key; //键顺序吗
void mdelay(unsigned int delay)
{unsigned int i;
for( ; delay>0; delay--)
{for(i=0;i<124;i++)
{ ; }
}
}
void setcur(unchar cur) //光标设置
{switch(cur)
{case 0x0:
{lcdwc(0x08); //关显示
break;
}
case 0x1:
{lcdwc(0xc); //开显示但无光标
break;
}
case 0x2:
{lcdwc(0x0e);//开显示有光标但不闪
break;
}
case 0x3:
{lcdwc(0x0f); //开显示有光标且闪
break;
}
default: break;
}
}
void clrlcd() //清屏
{lcdwc(0x01);} //在指定的行和列显示
void writechar(unchar c)
{lcdpos();
lcdwd(c);
}
void waitidle()//正常读写之前LCD控制器
{unchar tmp;
dport=0xff;
RS=0;
RW=1;
E=1;
_nop_();
for( ; ; )
{tmp=dport;
tmp&=0x80;
if(tmp==0)
break;
}
E=0;
}
void lcdwdn(unchar c)//不检测忙子程序
{
RS=1;
RW=0;
dport=c;//写入待写字符
E=1;
_nop_();
E=0;
}
void lcdwd(unchar c)//带忙坚检测的控制字子程序
{waitidle();
lcdwdn(c);}
void lcdwcn(unchar c)
{RS=0;
RW=0;
dport=c;
E=1;
_nop_();
E=0;
}
void lcdwc(unchar c)//检测忙信号的送控制字子程序
{waitidle();
lcdwcn(c);
}
void lcdpos()
{unchar tmp;
xpos&=0x0f;//范围为0~15个字符
ypos&=0x01;//范围为0~1
tmp=xpos;
if(ypos==1)
{tmp+=0x40;
}
tmp|=0x80;//地址加80H
lcdwc(tmp);
}
void rstlcd()//LCD的复位程序
{mdelay(15);//延时15S
lcdwcn(0x38);
mdelay(5);
lcdwcn(0x38);
mdelay(5);
lcdwcn(0x38);
lcdwc(0x38);
lcdwc(0x08);
lcdwc(0x01);
lcdwc(0x06);
lcdwc(0x0c);
}
void beep(); //蜂鸣器
void delay0(uchar x); //x*0.14MS
//--------------------------------------------------
/* 延时子程序*/
void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}
//--------------------------------------------------
/*键扫描子程序*/
void keyscan(void)
{
P2=0x0F; //低四位输入
delay(1);
temp=P2; //读P2口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==1)
key=0;
else if(temp==2)
key=1;
else if(temp==4)
key=2;
else if(temp==8)
key=3;
else
key=16;
P2=0xF0; //高四位输入
delay(1);
temp=P2; //读P2口
temp=temp&0xF0;
temp=~((temp>>4)|0xF0);
if(temp==1)
key=key+0;
else if(temp==2)
key=key+4;
else if(temp==4)
key=key+8;
else if(temp==8)
key=key+12;
else
key=16;
dis_buf=table[key]; //查表得键值
}
//--------------------------------------------------
/*判断键是否按下*/
void keydown(void)
{
P2=0xF0;
if(P2!=0xF0)
{
keyscan();
beep();
// while(P1!=0xF0); //等待键释放
}
}
//--------------------------------------------------
void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay0(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay(250); //延时
}
//--------------------------------------------------
void delay0(uchar x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
//--------------------------------------------------
main()
{
P0=0xFF;
dis_buf=0xBF;
while(1)
{ int t;
keydown();
//P0 = dis_buf; //键值送显示
t=dis_buf;
delay(2);
rstlcd();
clrlcd();
setcur(curflsh);
xpos=2;
ypos=0;
writechar(t);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -