📄 getkey.c
字号:
/*--------------------------------------------------------------------------------
**工程名称:键盘扫描测试程序
**编译器:ICCAVR6.31A pro
**日期:2005.04.14
**作者:neutronlmk
**芯片类型:M16
**时钟频率:外接4M
---------------------------------------------------------------------------------*/
#include <iom16v.h>
#include <macros.h>
#define led_port PORTA
#define led_port_ddr DDRA
#define key_port PORTD
#define key_port_ddr DDRD
#define key_port_pin PIND
/*------------------------------------函数声明----------------------------------*/
signed char get_key(void);
void delay_1us(void);
void delay_nus(unsigned int n);
void delay_1ms(void);
void delay_nms(unsigned int n);
/*----------------------------------主函数--------------------------------------*/
void main(void)
{
//端口初始化
led_port_ddr=0xff;
led_port=0x00;
key_port_ddr=0xf0;
key_port=0xf0;
//死循环,获取键值,并在发光二极管上提示
while(1)
{
signed char key;
key=get_key();
if(key!=0xff)
{
switch(key)
{
case 0:led_port=0x01;break;
case 1:led_port=0x02;break;
case 2:led_port=0x04;break;
case 3:led_port=0x08;break;
case 4:led_port=0x10;break;
case 5:led_port=0x20;break;
case 6:led_port=0x40;break;
case 7:led_port=0x80;break;
case 8:led_port=0x03;break;
case 9:led_port=0x06;break;
case 10:led_port=0x0c;break;
case 11:led_port=0x18;break;
default:break;
}
}
}
}
/*----------------------------------------------获取按键函数---------------------------------*/
//获取键值函数,返回0~11号按键,无按键按下则返回0xff
signed char get_key(void)
{
unsigned char i,tem;
key_port_ddr=0x0f;//使能键盘口高四位的上拉电阻
key_port=0xff;
for(i=0;i<3;i++)//若4*4键盘,这里应为i<4,因为现在PD3悬空,PD3没电平变化,所以你改i<4也不会出错^__^
{
key_port=~(1<<i);//键盘线扫描,从PD0~PD2逐位电位变低
delay_nus(100);//延时等待电平稳定
tem=key_port_pin&0xf0;//读键盘扫描信号(PD口高四位)状态,屏蔽低四位
if(tem!=0xf0)//若PD高四位不等于0xf0,则PD高四位引脚有可能被拉低(即有按键按下)
{
delay_nms(15);//延时消抖动
tem=key_port_pin&0xf0;//再读键盘
if(tem!=0xf0)//确认按键按下
{
tem&=0xf0;
switch(tem)//计算键值
{
case 0x70:tem=15-(3-i)*4;break;//这里可以改tem=11-(2-i)*4,不过一改4*4键就不适用了^___^
case 0xb0:tem=14-(3-i)*4;break;
case 0xd0:tem=13-(3-i)*4;break;
case 0xe0:tem=12-(3-i)*4;break;
default:break;
}
return tem;//返回0~11号键
}
}
key_port=0xff;
}
return 0xff;//无按键按下则返回0xff
}
/*--------------------------------------------延时函数------------------------------------*/
//1us延时函数
void delay_1us(void)
{
NOP();
}
//n us 延时函数
void delay_nus(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)delay_1us();
}
//1ms延时函数
void delay_1ms(void)
{
unsigned int i;
for(i=0;i<600;i++);
}
//n ms延时函数
void delay_nms(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)delay_1ms();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -