键盘实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于单片机4×4键盘的实现

成员:刘耀鹏、高攀、谢富田

2014年7月20日

理论分析

本实验是基于AT89C52单片机来实现4×4阵列键盘的输入,用七段数码管输出相应的键值,从而提供良好的人机接口。AT89C52单片机是一个8位的单片,与51系列单片机相比较,其最大的区别是多了一个计数定是中断。

采用12MHz的晶振,采用内接法,对电路提供一个时间基准,P1端口作为键盘的输入端口,P0端口为数据输出端口,P1端口输入的键值,在P0端口产生相应的输出。4×4键盘被抽象为16个开关按钮(每行4个共四行),那么久有4位行控制线,和列四位控制线,当开关接通时,则按键按下,数码管显示相应的键值,具体硬件电路如下:

电路中排阻限流作用,以达到对数码管保护作用,P2口作为位选端口,数码管8接P2.0端口,数码管7接P0.1端口。以达到位选

的作用,对于电路可编写一下程序:

2、程序如下:

#include

#include

#define uint unsigned int

#define uchar unsigned char

//uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

uchar code table[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

/********************************************************** ****

* 名称: Delay_1ms()

* 功能: 延时子程序,延时时间为1ms * x

* 输入: x (延时一毫秒的个数)

* 输出: 无

*********************************************************** ****/

void Delay_1ms(uint x)

{

uint i;

uchar j;

for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);

}

/********************************************************** ****

* 名称:Keyscan()

* 功能:P1外接4×4按键, 按照扫描法读出键值

* 输出:按键值0~15/如无键按下, 返回16

*********************************************************** ****/

uchar Keyscan(void)

{

uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};

for(j = 0; j < 4; j++) { //循环四次

P1 = Buffer[j]; //在P1高四位分别输出一个低电平

temp = 0x01; //计划先判断P1.0位

for(i = 0; i < 4; i++) { //循环四次

if(!(P1 & temp)) //从P1低四位,截取1位

return (i + j * 4); //返回取得的按键值

temp <<= 1; //判断的位,左移一位

} }

return 16; //判断结束,没有键按下,返回16

}

/********************************************************** ****

* 名称:Display(uchar k)

* 功能:将参数分成十位、个位分别显示

* 输入:k (键盘数值)

* 输出:P0口输出七段码,P2口输出位选码

*********************************************************** ****/

void Display(uchar k)

{

P2 = 1111; //消隐

P0 = table[k / 10];

P2 = 0xfd; Delay_1ms(5); //显示5ms十位

P2 = 1111; //消隐

P0 = table[k % 10];

P2 = 0xfe; Delay_1ms(5); //显示5ms个位

}

/********************************************************** ****

* 名称: Main()

* 功能: 主函数

***********************************************************

****/

void Main(void)

{

uchar Key_Value = 16, Key_Temp1, Key_Temp2; //两次读出的键值

while(1) {

//---------以下读入按键、消抖、等待按键释放

P1 = 0xf0;

Key_Temp1 = Keyscan(); //先读入按键

if(Key_Temp1 != 16) { //如果有键按下

//Delay_1ms(10); //延时一下

Display(Key_Value); //可用显示代替延时

Key_Temp2 = Keyscan(); //再读一次按键

if (Key_Temp1 == Key_Temp2) {//必须是两次相等

Key_Value = Key_Temp1; //才保存下来,这就是消除抖动

while(Keyscan() < 16) //等待按键释放

Display(Key_Value); //等待期间显示键值

//---------以下是对按键的处理

Display(Key_Value); //显示键值

} }

Display(Key_Value); //没有按键按下,也显示键值

}

相关文档
最新文档