1602液晶显示按键键值程序
扫描二维码
随时随地手机看文章
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitBEEP=P3^7;//蜂鸣器驱动线
uchardis_buf;//显示缓存
uchartemp;
ucharkey;//键顺序吗
voidbeep();//蜂鸣器
voiddelay0(ucharx);//x*0.14MS
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
ucharcodecdis1[]={"KEYNUMBER"};
ucharcodecdis2[]={"KEY-CODE:H"};
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
/*************************************************************/
/**/
/*延时子程序*/
/**/
/*************************************************************/
voiddelay(ucharx)
{ucharj;
while((x--)!=0)
{for(j=0;j<125;j++)
{;}
}
}
/*************************************************************/
/**/
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据*/
/**/
/*************************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
}
/*******************************************************************/
/**/
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*/
/**/
/*******************************************************************/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*******************************************************************/
/**/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。*/
/**/
/*******************************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*************************************************************/
/**/
/*LCD初始化设定*/
/**/
/*************************************************************/
voidlcd_init()
{
delay(15);
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c);//显示开,关光标
delay(5);
lcd_wcmd(0x06);//移动光标
delay(5);
lcd_wcmd(0x01);//清除LCD的显示内容
delay(5);
}
/*************************************************************/
/**/
/*设定显示位置*/
/**/
/*************************************************************/
voidlcd_pos(ucharpos)
{
lcd_wcmd(pos|0x80);//数据指针=80+地址变量
}
/*************************************************************/
/**/
/*键扫描子程序*/
/**/
/*************************************************************/
voidkeysCAN(void)
{
P1=0x0F;//低四位输入
delay(1);
temp=P1;//读P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==1)
key=0;
elseif(temp==2)
key=1;
elseif(temp==4)
key=2;
elseif(temp==8)
key=3;
else
key=16;
P1=0xF0;//高四位输入
delay(1);
temp=P1;//读P1口
temp=temp&0xF0;
temp=~((temp>>4)|0xF0);
if(temp==1)
key=key+0;
elseif(temp==2)
key=key+4;
elseif(temp==4)
key=key+8;
elseif(temp==8)
key=key+12;
else
key=16;
dis_buf=key;//键值入显示缓存
dis_buf=dis_buf&0x0f;
if(dis_buf>9)//转换为ASCII码
dis_buf=dis_buf+0x37;
else
dis_buf=dis_buf+0x30;
}
/*************************************************************/
/**/
/*判断键是否按下*/
/**/
/*************************************************************/
voidkeydown(void)
{
P1=0xF0;
if(P1!=0xF0)
{
keyscan();
beep();
}
}
/*************************************************************/
/**/
/*蜂鸣器响一声*/
/**/
/*************************************************************/
voidbeep()
{
unsignedchari;
for(i=0;i<100;i++)
{
delay0(4);
BEEP=!BEEP;//BEEP取反
}
BEEP=1;//关闭蜂鸣器
delay(250);//延时
}
/*************************************************************/
/**/
/*延时x*0.14ms*/
/**/
/*************************************************************/
voiddelay0(ucharx)
{
unsignedchari;
while(x--)
{
for(i=0;i<13;i++){}
}
}
/*************************************************************/
/**/
/*主程序*/
/**/
/*************************************************************/
main()
{
ucharm;
P0=0xFF;//置P0口
P2=0xFF;//置P2口
delay(10);//延时
lcd_init();//初始化LCD
lcd_pos(0);//设置显示位置为第一行的第1个字符
m=0;
while(cdis1[m]!=’ ’)
{//显示字符
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40);//设置显示位置为第二行第1个字符
m=0;
while(cdis2[m]!=’ ’)
{
lcd_wdat(cdis2[m]);//显示字符
m++;
}
dis_buf=0x2d;//显示字符"-"
while(1)
{
keydown();
lcd_pos(0x4c);
lcd_wdat(dis_buf);//第一位数显示
}
}
/************************************************************/