⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getkey.c

📁 4X4键盘扫描程序
💻 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 + -