单片机键盘显示实验报告
单片机的键盘和显示实验报告
㈠实验目的
1.掌握单片机I/O的工作方式;
2.掌握单片机以串行口方式0工作的LED显示;
3.掌握键盘和LED显示的编程方法。
㈡实验器材
1.G6W仿真器一台
2.MCS—51实验板一台
3.PC机一台
4.电源一台
㈢实验内容及要求
实验硬件线路图见附图
从线路图可见,8051单片机的P1口作为8个按键的输入端,构成独立式键盘。四个LED显示器通过四个串/并移位寄存器74LS164接口至8051的串行口,该串行口应工作在方式0发送状态下,RXD端送出要显示的段码数据,TXD则作为发送时钟来对显示数据进行移位操作。
编写一个计算器程序,当某一键按下时可执行相应的加、减、乘、除运算方式,在四个显示器上显示数学算式和最终计算结果。
注:①通过按键来选择加、减、乘、除四种运算方式。
②输入两个数字均为一位十进制数,可预先放在内存中。
㈣实验框图(见下页)
㈤思考题
1.当键盘采用中断方式时,硬件电路应怎样连接
~是键输出线,~是扫描输入线。输入与门用于产生按键中断,其输入端与各列线
相连,再通过上拉电阻接至+5 V电源,输出端接至8051的外部中断输入端。
移位寄存器的移位速率是多少
实验中要求计算的式子和结果之间相差一秒,移位寄存器的移位速率应该是每秒一位吧。其实这个问题确实不知道怎么回答。。。。。
实验代码:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:MOV 41H,#0BBH ;对几个存放地址进行初始化
MOV 42H,#0BBH
MOV 43H,#0BBH
MOV 44H,#0BBH
MOV SCON,#00H ;初始化串行口控制寄存器,设置其为方式0 LCALL DISPLAY ;初始化显示
KEY:MOV R3,#08H ;用来存放两个数据
MOV R4,#02H
MOV P1,#0FFH ;初始化P1口
MOV A,P1 ;读取按键状态
CPL A ;取正逻辑,高电平表示有键按下
JZ KEY ;A=0时无键按下,重新扫描键盘
LCALL DELAY1 ;消抖
MOV A,P1 ;再次读取按键状态
CPL A
JZ KEY ;再次判别是否有键按下
PUSH A
KEY1:MOV A,P1
CPL A
ANL A,#0FH ;判别按键释放
JNZ KEY1 ;按键未释放,等待
LCALL DELAY1 ;释放,延时去抖动
POP A
JB ,ADD1 ;K1按下转去ADD1
JB ,SUB1 ;K1按下转去SUB1
JB ,MUL1 ;K1按下转去MUL1
JB ,DIV1 ;K1按下转去DIV1
LJMP KEY
ADD1:LCALL BUFFER ;显示加数和被加数 MOV 43H,#049H
LCALL DISPLAY ;显示加号
MOV A,R3
ADD A,R4
DA A
MOV R3,A ;相加结果放入R6
ANL A,#0FH
MOV R4,A ;结果个位放入R7
MOV A,R3
SWAP A ;半字节交换,高四位放入低四位
ANL A,#0FH
MOV R3,A ;结果的高位放入R6
LCALL L ;显示缓存区设置
LCALL DELAY2 ;延时一秒后显示
LCALL DISPLAY
LJMP KEY
SUB1:LCALL BUFFER ;显示减数和被减数
MOV 43H,#40H
LCALL DISPLAY ;显示减号
MOV A,R3
CLR CY ;CY清零
SUBB A,R4 ;做减法
PUSH A
RLC A ;带进位循环左移,最高位放入CY
JC F ;判断最高位,若为1则跳转到负数ZHENG: POP A
MOV R4,A
MOV R3,#00H ;高位清零
SJMP OUT
FU:POP A
CPL A ;取绝对值
INC A
MOV R4,A
MOV R3,#11H ;显示负号
OUT: LCALL L ;显示缓存区设置
LCALL DELAY2 ;延时1s后显示
LCALL DISPLAY
LJMP KEY
MUL1:LCALL BUFFER ;显示两位乘数
MOV 43H,#99H
LCALL DISPLAY ;显示乘号
MOV A,R3
MOV B,R4
MUL AB ;结果放入AB,A中是低8位,B中是高8位
MOV B,#0AH
DIV AB ;十进制转换
MOV R4,B ;结果个位放入R7
MOV R3,A ;结果的十位放入R6
LCALL L
LCALL DELAY2
LCALL DISPLAY ;延时1s后显示
LJMP KEY
DIV1:LCALL BUFFER ;显示除数和被除数
MOV 43H,#62H
LCALL DISPLAY ;显示除号
MOV A,R3
MOV B,R4
DIV AB ;A除以B
MOV R4,B ;余数放在R4中
MOV R3,A ;商放在R3中
MOV A,R4
MOVC A,@A+DPTR ;调用段选号
MOV 41H,A ;显示余数
MOV A,R3
MOVC A,@A+DPTR
MOV 43H,A ;显示商
MOV 42H,#00H
MOV 44H,#00H
LCALL DELAY2 ;延时1S后显示
LCALL DISPLAY
LJMP KEY
BUFFER: MOV 41H,#22H ;显示初始化,在做计算之前显示两个操作数,显
示等号
MOV DPTR,#TABL
MOV A,R4
MOVC A,@A+DPTR
MOV 42H,A
MOV A,R3
MOVC A,@A+DPTR
MOV 44H,A
RET
DISPLAY:MOV R5,#04H ;共四位需要显示
MOV R0,#41H
DISPLAY1:MOV A,@R0
MOV SBUF,A
DISPLAY2:JNB TI,DISPLAY2 ;是否传完了
CLR TI
INC R0
DJNZ R5,DISPLAY1
RET
L:MOV A,R4
MOVC A,@A+DPTR
MOV 41H,A ;R4对应的段码
MOV A,R3
MOVC A,@A+DPTR
MOV 42H,A ;R3对应的段码
MOV 43H,#00H
MOV 44H,#00H
RET
DELAY1: ;普通延时
M OV R1,#20H
DS1: M OV R2,#0FFH
DS2: D JNZ R2,DS2
D JNZ R1,DS1
R ET
DELAY2: MOV R6,#14H ;定时1S
MOV TMOD,#01H
DS3:MOV TH0,#3CH
MOV TL0,#0B0H ;50ms
SETB TR0
LOOP:JNB TF0,LOOP
CLR TF0
CLR TR0
DJNZ R6,DS3 ;1s到,中断返回
TABL:DB 0BBH 09H 0EAH 6BH ;段码表
DB 59H 73H 0F3H 0BH
DB 0FBH 7BH 00H 0DBH
DB 0F1H 0B2H 0E9H 0F2H
DB 0D2H 40H
实验结果及分析
按键1:8+2= 结果:10
按键2:8-2= 结果: 6
按键3:8*2= 结果:16
按键4:8/2= 结果:4
从上面的结果可以看出,本次实验基本完成了实验要求。本次实验主要运用了键盘接口和LED显示方面的知识,
掌握了如何读取键盘状态和消抖:
MOV P1,#0FFH ;初始化P1口
MOV A,P1 ;读取按键状态
CPL A ;取正逻辑,高电平表示有键按下
JZ KEY ;A=0时无键按下,重新扫描键盘
LCALL DELAY1 ;消抖
MOV A,P1 ;再次读取按键状态
CPL A
JZ KEY ;再次判别是否有键按下
PUSH A
KEY1:MOV A,P1
CPL A
ANL A,#0FH ;判别按键释放
JNZ KEY1 ;按键未释放,等待
LCALL DELAY1 ;释放,延时去抖动
POP A
在计算过程的显示中复习了定时器的知识:
DELAY2: MOV R6,#14H ;定时1S
MOV TMOD,#01H
DS3:MOV TH0,#3CH
MOV TL0,#0B0H ;50ms
SETB TR0
LOOP:JNB TF0,LOOP
CLR TF0
CLR TR0
DJNZ R6,DS3 ;1s到,中断返回
对于缓存区的设置这一块儿掌握的还不是很好,希望经过多次练习可以加深理解。