📄 keyboard.c
字号:
#include "mega16.h"
#include "delay.h"
#include "avryejing.c"
#define scanport_dir DDRD
#define scanport_out PORTD
#define scanport_in PIND
unsigned char keydata=0;
//unsigned char ledcode[16]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
unsigned char lcdcode[18]={16,17,18,19,20,21,22,23,24,25,33,34,35,36,37,38,39,40};
unsigned char key_read(void)
{ unsigned char i;
scanport_dir = 0xFF;/*获取列地址*/ //出 出 出 出 出 出 出 出
scanport_out = 0x0F; // 0 0 0 0 1 1 1 1
scanport_dir = 0xF0; //出 出 出 出 入 入 入 入
i = scanport_in; // 0 0 0 1 1 1 1 1
scanport_dir = 0xFF;/*获取行地址*/
scanport_out = 0xF0;
scanport_dir = 0x0F;
i &= scanport_in;
scanport_dir = 0x00;/*输出复位*/
scanport_out = 0xFF;
switch (i)
{/*将按键码转换成键值*/
case 0x11: return 0; break;
case 0x21: return 1; break;
case 0x41: return 2; break;
case 0x81: return 3; break;
case 0x12: return 4; break;
case 0x22: return 5; break;
case 0x42: return 6; break;
case 0x82: return 7; break;
case 0x14: return 8; break;
case 0x24: return 9; break;
case 0x44: return 10;break;
case 0x84: return 11;break;
case 0x18: return 12;break;
case 0x28: return 13;break;
case 0x48: return 14;break;
case 0x88: return 15;break;
case 0x00: return 16;break;
default : return 17;
}
}
/*按键获取函数 获取按键信号,其中包含有状态记录及按键去颤抖。
有正确按键按下返回相应按键值 无正确按键按下返回"0xFF"*/
unsigned char get_key(void)
{ unsigned char i;
unsigned char j; /*按键记录*/
i = key_read();
if (i == 16) /*无有效按键按下*/
{
j = 0x00; /*清除按键记录*/
return 0xFF; /*程序退出*/
}
if (j== 0x00)
{ /*为新按键*/
j = i;
delay_ms(10 );
i = key_read();
if(i == j)
{ return i; }
else return 0xFF;
}
}
void main(void)
{
//DDRA=0XFF;
//DDRC=0XFF;
//DDRD=0XFF;
DDRA=0xff;
PORTA=0xff;
#asm("cli");
delay_ms(1000); //初始化液晶
resetlcd();
delay_ms(500);
while(1)
{
keydata=get_key();
if(keydata!=0xFF)
{
//PORTA=ledcode[keydata];
word(0,0,lcdcode[keydata]);
delay_ms(300);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -