键盘接口实验报告

更新时间:2024-02-29 15:04:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验六 键盘接口实验

姓名: 专业:通信工程 学号: 成绩: 一:实验目的

1 掌握keil c51和proteus软件联合仿真调试的方法; 2 掌握单片机的键盘接口电路 3 掌握单片机键盘扫描的原理 4 掌握键盘的去抖原理与处理方法 二:实验内容

1. 用proteus设计一个接盘接口电路,要求利用P1口接4*4矩阵键盘,通过74ls164接一

个共阴的数码管

2. 用中断方式编写程序,要求无按键按下时,数码管循环画8,有按键按下时产生中断显

示按键值0-f通过串行口输出,在数码管上显示3秒后返回,数码管继续画8。

3. 将P1口接7个独立按键,要求用定时扫描的方式检测按键,并显示按键值,其中要求

第七个开关计数。 三:实验原理及步骤 实验步骤

1.用proteus设计键盘接口电路;

2.在keil c51中编写控制程序,编译通过后,与proteus联合调试; 3.按动任意键,观察键是否能显示正确。 实验原理说明

矩阵键盘识别一般应包括一下几个内容: 1 判别有无按键按下

2 键盘扫描取得闭合的行列值 3 用计算法或查表法得到按键值

4 判断闭合键是否释放,如没释放则继续等待

5 将闭合键的按键值保存,同时转去执行该闭合键的功能 四:电路设计及调试 1.程序:

(1)矩阵键盘: #include

#define uchar unsigned char #define uint unsigned int uchar temp,key,num,n;

uchar code table1[]={0x01,0x21,0x61,0x65, 0x6d,0x7d,0x7d,0x7f}; uchar code table2[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code KEY_TABLE[]={0xee,0xde,0xbe,0x7e, 0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b, 0xe7,0xd7,0xb7,0x77};

void delayMs(uint k) {uint i,j;

for(i=k;i>0;i--)

for(j=110;j>0;j--); }

void INT_0() interrupt 0 {EX0=0;

delayMs(20); EX0=1; P1=0xf0; if(P1!=0xf0) {delayMs(20); if(P1!=0xf0) {temp=P1; P1=0x0f; key=P1|temp; for(n=0;n<16;n++) if(key==KEY_TABLE[n]) {num=n;break;} } SBUF=table2[num]; while(!TI); TI=0;

delayMs(3000); } P1=0xf0; }

void main() {uchar m; SM0=0; SM1=0; EA=1; EX0=1; IT0=1; P1=0xf0; while(1)

{for(m=0;m<=7;m++) {SBUF=table1[m]; while (TI==0); TI=0; delayMs(500); } } }

(2)独立键盘: #include

#define uchar unsigned char #define uint unsigned int bit flag;

uchar key,num,n,m;

uchar code table1[]={0x01,0x21,0x61,0x65, 0x6d,0x7d,0x7d,0x7f};

uchar code table2[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code KEY_TABLE[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f,}; void delayMs(uint k) {uint i,j;

for(i=k;i>0;i--)

for(j=110;j>0;j--); }

void T_1() interrupt 3 {TH1=(65536-10000)/256; TL1=(65536-10000)%6; if(P1!=0xff) {delayMs(20); if(P1!=0xff&&flag==0) {key=P1; for(n=0;n<8;n++) if(key==KEY_TABLE[n]) {num=n;break;} if(num==7)

{SBUF=table2[m++]; if(m==7) m=0; } else {SBUF=table2[num];} flag=1; while(!TI);

TI=0;

delayMs(1000); } } else flag=0; }

void main() {uchar m;

SM0=0;SM1=0; EA=1;

ET1=1;TR1=1;

TH1=(65536-10000)/256; TL1=(65536-10000)%6; TMOD=0x10; while(1)

{for(m=0;m<=7;m++) {SBUF=table1[m]; while (TI==0); TI=0; delayMs(500); } } } 电

路图:

C222pfC1X122pfU1CRYSTAL19XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617U298RSRG8C1/->30102030405060718XTAL2C3920uFR11k293031RST12&1D4075605101103121301020406PSENALEEAP10P11P12P13P14P15P16P1712345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51net=02474LS1646U3:A74LS2112048124523P10P11P12P13P17P16P15P14

C222pfC1X122pfU1CRYSTAL19XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617U298RSRG8C1/->30102030405060718XTAL2C3920uFR11k293031RST12&1D4075605101103121301020406PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51net=02474LS164 2.调试

(一)矩阵键盘程序调试 1加载程序,点击仿真按钮;

2程序出现乱码,分析发现74LS164与数码管的高低位相连,但和编码的高低位不匹配,重新编码;

3调试矩阵键盘时,中断不执行,主函数没给P1口赋值,中断函数里if语句无法执行,在主函数里给P1口赋值后,中断函数里可以显示按键值零,其他的键值不显示; 4分析后发现应在中断里给P1口赋值,则键值正常显示; (二)独立键盘程序调试 1加载程序,点击仿真按钮;

2显示键值零后,只中断,不再显示键值,分析程序发现中断函数后面没给flag赋值,执行一次按键后,if语句不再满足条件,给flag赋零后,可正常显示。 3.实验结果及分析 (一) 矩阵键盘

无中断时,正常画8,中断产生时,可正确显示键值。 (二) 独立键盘

无中断时,正常画8,中断产生时,按按键0—6正确显示键值,按按键7逐次加1。

五:实验后的经验总结

1学习完理论知识后,通过实验可以发现新的问题,会对所学的知识有所思考,从而对所学知识理解并掌握。

2通过本次实验我理解了键盘的线反转法,定时扫描法,更加深刻地体会了for循环和if语句的用法。

本文来源:https://www.bwwdw.com/article/m3ma.html

Top