|
- /*******************************************************
- * 程序功能:矩阵键盘扫描
- * 接线说明:核心板JP1 PB0-PB7连接到核心板数码管显示电路JP71 JP2的PC0-PC7接到JP76
- * 实验现象:按下矩阵键盘,LED数码管显示相应的数字
- * 日 期 : 2014/8/9
- * 作 者 : 翟志刚
- *******************************************************/
- #include <iom16v.h>
- #include <macros.h>
- #define uchar unsigned char
- #define uint unsigned int
- //数码管字型码表显示:从0显示到F
- uchar table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0XFF};
- /*******************************************************
- //函数名称:delay_ms(uint ms)
- //函数功能:延时子程序
- //入口参数:i,j,延时时间参数
- //返回参数:无
- ********************************************************/
- void delay(uint ms)
- {
- uint i,j;
- for(i = 0;i < ms;i++)
- {
- for(j = 0;j < 1141;j++);
- }
- }
- /*******************************************************
- //函数名称:key_press(void)
- //函数功能:检测按键释放与否
- //入口参数:i,PC口的输入参数
- //返回参数:无
- ********************************************************/
- uchar key_press(void)
- {
- uchar i;
- i = PINC;
- if(i == 0XF0) //没按键按下
- {
- DDRC = 0X0f; //端口PC初始化
- return 0; //返回0
- }
- else
- {
- DDRC = 0X0f; //端口PC初始化
- return 1; //返回1,继续判断
- }
- }
- /*******************************************************
- //函数名称:key_scan(void)
- //函数功能:按键扫描
- //入口参数:keycode,key,i,j
- //返回参数:无
- ********************************************************/
- uchar key_scan(void)
- {
- uchar keycode,key,i,j;
- delay(10); //利用延时函数进行消除抖动
- if(key_press()) //有按键按下
- {
- i = 0X7F;
- PORTA=0x00;
- do
- {
- i = (i << 1|i >> 7); //保证每次只能选中一个按键
- DDRC = 0X0F; //初始化PC口
- PORTC = i;
- keycode = PINC;
- j = keycode & 0XF0; //判断是否有按键按下
- }while(j == 0XF0);
- switch(keycode) //扫描键数值
- {
- case 0xEE:
- key = 0;
- break;
- case 0xDE:
- key = 1;
- break;
- case 0xBE:
- key = 2;
- break;
- case 0x7E:
- key = 3;
- break;
- case 0xED:
- key = 4;
- break;
- case 0xDD:
- key = 5;
- break;
- case 0xBD:
- key = 6;
- break;
- case 0x7D:
- key = 7;
- break;
- case 0xEB:
- key = 8;
- break;
- case 0xDB:
- key = 9;
- break;
- case 0xBB:
- key = 10;
- break;
- case 0x7B:
- key = 11;
- break;
- case 0xE7:
- key = 12;
- break;
- case 0xD7:
- key = 13;
- break;
- case 0xB7:
- key = 14;
- break;
- case 0x77:
- key = 15;
- break;
- }
- }
- return key;
- }
- /*******************************************************
- //函数名称:main(void)
- //函数功能:程序主函数
- ********************************************************/
- void main(void)
- {
- uchar a;
- DDRC = 0X0F; //初始化PC口高四位为输入,第四位为输出
- PORTC = 0X00; //定义PC口第四位输出为0
- DDRB = 0XFF; //初始化PB口为输出
- PORTB = 0x00; //定义PB口输出为0
- while(1)
- {
- if(key_press()) //判断是否有按键按下
- {
- a = key_scan(); //将按键值送给参数a
- PORTB=table[a]; //扫描按键 显示数据
- }
- }
- }
复制代码
|
|