按键检测驱动实验报告

  • 格式:doc
  • 大小:103.00 KB
  • 文档页数:2

嵌入式系统开发课程实验报告

1 班级_08网络一班_ 学号__20080611052_ 姓名__袁晓洋___

按键检测实验

[实验目的]

深入理解单片机IO输入的特性和编程方法

理解4×4键盘的工作原理和扫描原理

掌握利用单片机单IO口实现对4×4键盘扫描输入的方法

[实验内容]

采用单片机的IO口实现对4×4键盘的低电平扫描,将扫描输入的结果按照按钮与数码的对应关系显示到7段数码管上。

[实验步骤]

在此填写在proteus中的操作步骤,并附绘制的电路图

首先加入

根据课本121页,连接电路,一个P0端口连接按键,P2端口连接数码管,设置按钮,设置8个10K的电阻,如图所示:

在此填写keil C51代码并附详细注释

#include 添加头文件

#define KEYP P0 定义键盘连接到P0

#define SEG7P P2 定义七段数码管连接到P2

Char code TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80

,0x98,0xa0,0x83,0xa7,0xa1,0x84,0x8e,0xbf,0x7f}; 0-9,a-f的显示

char disp=0x7f; 声明七段显示器初值只显示小数点

unsigned char scan[4]={0xef,0xdf,0xbf,0x7f}; 显示器及键盘的扫描码

void delay(int); 声明延迟函数

void scanner(void); 声明扫描函数

main() 主程序

{

while(1) 无穷循环

{

scanner(); 一直扫描键盘和显示七段显示器 嵌入式系统开发课程实验报告

2 }

}

void scanner(void) 扫描函数开始

{

unsigned char col,row,dig; 定义变量col:列,row:行dig:显示位

unsigned char rowkey,kcode; 定义变量rowkey:行键值kcode:按键码

for(col=0;col<4;col++) for循环扫描第col列

{

KEYP=scan[col]; 高4位输出扫描信号,低4位输入行值

SEG7P=disp; 输出数字

rowkey=~KEYP&0x0f; 读入KEYP值,取反,再相与消除高4位

00001111

if(rowkey!=0) 若按键被按下

{ if(rowkey==0x01) row=0; 说明第0行被按下

else if(rowkey==0x02) row=1; 说明第1行被按下

else if(rowkey==0x04) row=2; 说明第2行被按下

else if(rowkey==0x08) row=3; 说明第3行被按下

kcode=4*col+row; 计算出按键的号码

disp=TAB[kcode]; 将键值编码后写入最右侧

while(rowkey!=0) 当按钮未放开

rowkey=~KEYP&0x0f; 再读入行键值

}

delay(4); 延迟函数延迟4ms

}

}

void delay(int x) 延迟函数

{

int i,j; 声明变量i,j

for(i=0;i

for(j=0;j<600;j++); 延迟约5ms

}

[实验总结]

总结试验中遇到的问题和问题的解决方法。

刚开始做时在P2端口和数码管直接连接了电阻,而且总是不亮,后来通过老师的提醒,查看P2端口的内部构造知道了P2内部带有上拉电阻不用再加电阻,后来通过多次的尝试,完成了实验!