按键控制实验
实验名称:按键控制实验 实验环境:普中实验系统;Keil μVision 4软件; 实验目的: (1)掌握矩阵键盘和单片机的接口方法以及键值获取的原理。 (2)制作自己的按键实验方案,并通过程序设计控制实验箱上对应按键,在7段数码管上显示出设计方案的按键值。
硬件连线:
数码管连接P0口 按键连接P1口 P2口的2,3,4引脚连接位选线
实验主要代码:
#include “reg52.h” //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8;
#define GPIO_DIG P0 #define GPIO_KEY P1
sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4;
u8 KeyValue; //用来存放读取到的键值 u8 code smgduan[17]={0x5b,0x3f,0x5b,0x06,0x06,0x06,0x06,0x5b,0x76, 0x77,0x73,0x73,0x6E,0x5E,0x77,0x6E};//显示20211112happyday的值
/*******************************************************************************
-
函 数 名 : delay -
函数功能 : 延时函数,i=1时,大约延时10us */ void delay(u16 i) { while(i–); } / -
函 数 名 : KeyDown -
函数功能 : 检测有按键按下并读取键值 */ void KeyDown(void) { char a=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f)//读取按键是否按下 { delay(1000);//延时10ms进行消抖 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下 { //测试列 GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; //第一个键按下 // 0000 0111 case(0X0b): KeyValue=1;break; // 0000 1011 case(0X0d): KeyValue=2;break; // 0000 1101 case(0X0e): KeyValue=3;break; // 0000 1110 } //测试行 GPIO_KEY=0XF0; switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue;break; // 0111 0000 case(0Xb0): KeyValue=KeyValue+4;break; // 1011 0000 case(0Xd0): KeyValue=KeyValue+8;break; // 1101 0000 case(0Xe0): KeyValue=KeyValue+12;break; // 1110 0000 } while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测 { delay(1000); a++; } } } } / -
函 数 名 : main -
函数功能 : 主函数 -
输 入 : 无 -
输 出 : 无 *******************************************************************************/ void main() { while(1) { KeyDown(); //按键判断函数 switch(KeyValue){ case 0: LSA=0;LSB=0;LSC=0; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第0位和第0个值“2” case 1: LSA=1;LSB=0;LSC=0; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第1位和第1个值“0” case 2: LSA=0;LSB=1;LSC=0; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第2位和第2个值“2” case 3: LSA=1;LSB=1;LSC=0; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第3位和第3个值“1” case 4: LSA=0;LSB=0;LSC=1; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第4位和第4个值“1” case 5: LSA=1;LSB=0;LSC=1; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第5位和第5个值“1” case 6: LSA=0;LSB=1;LSC=1; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第6位和第6个值“1” case 7: LSA=1;LSB=1;LSC=1; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第7位和第7个值“2” case 8: LSA=0;LSB=0;LSC=0; GPIO_DIG=smgduan[KeyValue]; break;//显示第0位和第8个值“h” case 9: LSA=1;LSB=0;LSC=0; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第1位和第9个值“a” case 10: LSA=0;LSB=1;LSC=0; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第2位和第10个值“p” case 11: LSA=1;LSB=1;LSC=0; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第3位和第11个值“p” case 12: LSA=0;LSB=0;LSC=1; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第4位和第12个值“y” case 13: LSA=1;LSB=0;LSC=1; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第5位和第13个值“d” case 14: LSA=0;LSB=1;LSC=1; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第6位和第14个值“a” case 15: LSA=1;LSB=1;LSC=1; GPIO_DIG=smgduan[KeyValue]; delay(30); break;//显示第7位和第15个值“y” } } }
实验结果与心得: 实现效果:按下按键0-7在数码管8位从右向左依次显示20211112字样,按下按键8-15在数码管8位从右向左依次显示happyday字样 实验心得:1.数组中的十六进制是字符的共阴极形式 2.数码管3个位选是A为低位,C为高位 3.按键闭合与否,反应在行线输出电压上就是高电平或低电平,对行线电平高低状态检测,便可确认按键是否按下与松开 4.数码管每次显示字符要延时,否则会由于按键按下时间短而忽略点亮效果 5.矩阵键盘属于非编码键盘
|