嵌入式系统开发课程实验报告1班级_08网络一班_学号__20080611052_姓名__袁晓洋___按键检测实验[实验目的]深入理解单片机IO输入的特性和编程方法理解4×4键盘的工作原理和扫描原理掌握利用单片机单IO口实现对4×4键盘扫描输入的方法[实验内容]采用单片机的IO口实现对4×4键盘的低电平扫描,将扫描输入的结果按照按钮与数码的对应关系显示到7段数码管上。[实验步骤]在此填写在proteus中的操作步骤,并附绘制的电路图首先加入根据课本121页,连接电路,一个P0端口连接按键,P2端口连接数码管,设置按钮,设置8个10K的电阻,如图所示:在此填写keilC51代码并附详细注释#includereg51.h添加头文件#defineKEYPP0定义键盘连接到P0#defineSEG7PP2定义七段数码管连接到P2CharcodeTAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xa0,0x83,0xa7,0xa1,0x84,0x8e,0xbf,0x7f};0-9,a-f的显示chardisp=0x7f;声明七段显示器初值只显示小数点unsignedcharscan[4]={0xef,0xdf,0xbf,0x7f};显示器及键盘的扫描码voiddelay(int);声明延迟函数voidscanner(void);声明扫描函数main()主程序{while(1)无穷循环{scanner();一直扫描键盘和显示七段显示器嵌入式系统开发课程实验报告2}}voidscanner(void)扫描函数开始{unsignedcharcol,row,dig;定义变量col:列,row:行dig:显示位unsignedcharrowkey,kcode;定义变量rowkey:行键值kcode:按键码for(col=0;col4;col++)for循环扫描第col列{KEYP=scan[col];高4位输出扫描信号,低4位输入行值SEG7P=disp;输出数字rowkey=~KEYP&0x0f;读入KEYP值,取反,再相与消除高4位00001111if(rowkey!=0)若按键被按下{if(rowkey==0x01)row=0;说明第0行被按下elseif(rowkey==0x02)row=1;说明第1行被按下elseif(rowkey==0x04)row=2;说明第2行被按下elseif(rowkey==0x08)row=3;说明第3行被按下kcode=4*col+row;计算出按键的号码disp=TAB[kcode];将键值编码后写入最右侧while(rowkey!=0)当按钮未放开rowkey=~KEYP&0x0f;再读入行键值}delay(4);延迟函数延迟4ms}}voiddelay(intx)延迟函数{inti,j;声明变量i,jfor(i=0;ix;i++)for(j=0;j600;j++);延迟约5ms}[实验总结]总结试验中遇到的问题和问题的解决方法。刚开始做时在P2端口和数码管直接连接了电阻,而且总是不亮,后来通过老师的提醒,查看P2端口的内部构造知道了P2内部带有上拉电阻不用再加电阻,后来通过多次的尝试,完成了实验!