按键控制实验
实验名称:按键控制实验
实验环境:普中实验系统;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.矩阵键盘属于非编码键盘
该实验使用普中实验系统和KeilμVision4软件,通过矩阵键盘接口读取按键值,并在7段数码管上显示。程序实现了按键消抖、键值获取及数码管显示,当按下0-7键显示数字'20211112',8-15键显示'happyday'。实验中强调了数码管位选、按键检测和延时处理等关键点。
1万+

被折叠的 条评论
为什么被折叠?



