按键检测驱动实验报告
- 格式: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内部带有上拉电阻不用再加电阻,后来通过多次的尝试,完成了实验!