AVR單片機(jī)節(jié)約I/O口的鍵盤(pán)程序設(shè)計(jì)
#i nclude<90s8515.h>
#define uchar unsigned char
#asm
equ __LCD_port=0x18 ;PORTB
#endasm
#i nclude
#i nclude
/************按鍵功能說(shuō)明:0--9為數(shù)字鍵 ********/
#define cEnter 16 //確認(rèn)鍵
#define cFuntion 15 //功能菜單鍵
#define cDown 14 //上,下選擇鍵
#define cUp 13
#define cRn_Stop 12 //運(yùn)行/停止切切實(shí)實(shí)換鍵
#define cDel 11 //刪除
uchar lcd_buffer[33];
uchar getkey(void)
{
uchar key_temp;
PORTC|=0x07; //向PORTC.0--PORTC.2寫(xiě)入高電平
DDRC=0x00; //把PORTA設(shè)置為輸入模式
key_temp=PINC&0x07; //讀取PORTA.0--PORTA.2上的值并屏蔽其它位
/*****如果K0---K6按下,key_temp就為相應(yīng)的鍵值,如果K7--K15按下,則讀入PINC.0--PINC.2都為高電平,key_temp==7
然后PORTC.0--PORTC.2依次輸出低電平,判斷K7--K15那個(gè)鍵按下**********/
if(key_temp==7) //判斷K7--K9是否按下
{
DDRC|=0x01; //設(shè)置PORTC.0輸出0
PORTC&=0xfe;
DDRC&=0x00;
key_temp=PINC&0x07;
key_temp=(key_temp+1)/2+7;
if(key_temp==10) //判斷K10--K12是否按下
{
DDRC|=0x02; //設(shè)置PORTC.1輸出0
PORTC&=0xfd;
DDRC&=0x00;
key_temp=PINC&0x07;
key_temp=(key_temp+1)/2+10;
if(key_temp==13) //判斷K13--K15是否按下
{
DDRC|=0x04; //設(shè)置PORTC.2輸出0
PORTC&=0xfb;
DDRC&=0x00;
key_temp=PINC&0x07;
key_temp+=13;
}
}
}
return key_temp;
}
void init()
{
PORTB=0x00; //PORB的初始化
DDRB=0x00;
DDRC=0x00;
// LCD module initialization
lcd_init(16);//清屏并把顯示坐標(biāo)設(shè)定在0列0行
}
void main()
{
uchar result;
init();
result=getkey();
sprintf(&lcd_buffer[2],"%c",result);
lcd_gotoxy(0,4);
lcd_putchar(lcd_buffer[2]);
while(1);
}