您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机AVR单片机节约I/O口的键盘程序设计 正文
AVR单片机节约I/O口的键盘程序设计

AVR单片机节约I/O口的键盘程序设计

点击数:7977 次   录入时间:03-04 11:52:58   整理:http://www.55dianzi.com   AVR单片机
#i nclude<90s8515.h>
#define uchar unsigned char
#asm
equ __LCD_port=0x18 ;PORTB
#endasm
#i nclude <lcd.h>
#i nclude<stdio.h>
/************按键功能说明:0--9为数字键 ********/
#define cEnter 16                //确认键
#define cFuntion 15       //功能菜单键
#define cDown 14        //上,下选择键
#define cUp 13
#define cRn_Stop 12             //运行/停止切切实实换键
#define cDel 11                 //删除
uchar lcd_buffer[33];
uchar getkey(void)
{
 uchar key_temp;
 PORTC|=0x07;                 //向PORTC.0--PORTC.2写入高电平
 DDRC=0x00;                   //把PORTA设置为输入模式
 key_temp=PINC&0x07;         //读取PORTA.0--PORTA.2上的值并屏蔽其它位
 /*****如果K0---K6按下,key_temp就为相应的键值,如果K7--K15按下,则读入PINC.0--PINC.2都为高电平,key_temp==7
 然后PORTC.0--PORTC.2依次输出低电平,判断K7--K15那个键按下**********/
 if(key_temp==7)             //判断K7--K9是否按下
 {
   DDRC|=0x01;                //设置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;               //设置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;                  //设置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);//清屏并把显示坐标设定在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);
}


本文关键字:单片机  程序设计  键盘  AVR单片机单片机-工控设备 - AVR单片机