#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitBEEP=P3^7;//蜂鳴器驅(qū)動線
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忙狀態(tài)*/
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)*/
/**/
/*************************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
return(result);
}
/*******************************************************************/
/**/
/*寫指令數(shù)據(jù)到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;
}
/*******************************************************************/
/**/
/*寫顯示數(shù)據(jù)到LCD*/
/*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。*/
/**/
/*******************************************************************/
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初始化設(shè)定*/
/**/
/*************************************************************/
voidlcd_init()
{
delay(15);
lcd_wcmd(0x38);//16*2顯示,5*7點陣,8位數(shù)據(jù)
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c);//顯示開,關(guān)光標
delay(5);
lcd_wcmd(0x06);//移動光標
delay(5);
lcd_wcmd(0x01);//清除LCD的顯示內(nèi)容
delay(5);
}
/*************************************************************/
/**/
/*設(shè)定顯示位置*/
/**/
/*************************************************************/
voidlcd_pos(ucharpos)
{
lcd_wcmd(pos|0x80);//數(shù)據(jù)指針=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)//轉(zhuǎn)換為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;//關(guān)閉蜂鳴器
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);//設(shè)置顯示位置為第一行的第1個字符
m=0;
while(cdis1[m]!=’