键盘输入实验

  • 格式:doc
  • 大小:776.00 KB
  • 文档页数:7

单片机上机实验
指导老师:付先成
姓名:刘文
班号:20061003427
学号:07206229

2008年11月11日
键盘输入实验
实验目的:
1. 熟悉利用keil uvision3软件建立工程文件的操作步骤。
2. 学会综合所学知识编写较复杂的程序。
3. 熟悉键盘输入实验的原理。
实验工具:
计算机、keil uvision3应用软件、单片机试验仪
实验内容:
仿照课件上的程序模块,编写一个键盘输入程序,并进行仿真,观察输入数字后的显
示情况。
程序如下:
ORG 0000H
LJMP 0030H
ORG 0030H
MAIN: MOV SP, #6FH
LCALL INIT8155;8155初始化
MOV 30H, #0FFH ;初始化缓冲区,显示00008.
MOV 31H, # 00H
MOV 32H, # 00H
MOV 33H, # 00H
MOV 34H, # 00H
MOV 35H, # 00H
MAIN1: LCALL DISP ;显示
LCALL KeyTest ;判断是否有键按下
JZ MAIN1 ;无键按下,继续循环
LCALL DISP ;显示,延时6ms
LCALL KeyTest ;再次判断是否有键按下
JZ MAIN1 ;无键按下,继续循环
LCALL KeyGet ;扫描键盘,得到键码
PUSH ACC ;保存键码
CLR C
SUBB A, #16 ;显示小于15的键码
JNC MAIN1
POP ACC
MOV 35H, A ;键码写入显示缓冲区
LJMP MAIN1
INIT8155:MOV DPTR, #0E100H
MOV A, #03H
MOVX @DPTR, A
RET
DISP: MOV R0, #30H ;地址指针
MOV R1, #01H ;位选码,从低位开始显示
DP1: MOV DPTR, #0E101H ;指针指向8155的PA口寄存器
MOV A, #00H
MOVX @DPTR, A ;关显示
MOV A, @R0 ;取待显示字符
LCALL DXM ;查表段选码
LCALL SHIFT ;移位输出段选码
MOV DPTR, #0E101H ; 指向8155的PA口寄存器
MOV A, R1
MOVX @DPTR, A ;输出位选码
INC R0 ;地址指针指向下一单元
RL A ;位选码指向高一位
MOV R1, A ;保存位选码
LCALL DELY1 ;延时1ms
JNB ACC.6, DP1
RET
DXM: MOV DPTR, #TAB ;取段选码表首地址
MOVC A,@A+DPTR ;取段选码,变址寻址
RET
TAB: DB 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
DB 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
SHIFT: MOV R6, #08H ;循环次数
MOV DPTR, #0E102H ;指针指向8155的PB口寄存器
LP1: RLC A
MOV R7, A ;备份A中段选码
MOV ACC.0, C
CLR ACC.1
MOVX @DPTR, A ;输出DAT, 输出CLK为0,
SETB ACC.1
MOVX @DPTR, A ; DAT不变, 输出CLK为1
CLR ACC.1
MOVX @DPTR, A ; DAT不变, 输出CLK为0
MOV A, R7 ;恢复A中内容
DJNZ R6,LP1 ;判断8位是否移位完毕
RET ;
DELY1: MOV R7, #02H
DL1: MOV R6, #0FFH
DJNZ R6, $
DJNZ R7, DL1
RET
KeyTest:MOV DPTR, #0E101H ;指向8155的PA口寄存器
MOV A, #00H
MOVX @DPTR, A ;列输出全0
MOV DPTR, #0E103H ;指向8155的PC口寄存器
MOVX A , @DPTR ;读键值
ORL A, #0F0H ;屏蔽高四位
CPL A ;全0无按键
RET
KeyGet: MOV R2, #11111110B ;行扫描码
MOV R4, #00H ;置第0行首键值
KG1: MOV DPTR, #0E101H ;指向8155的PA口寄存器
MOV A, R2
MOVX @DPTR, A ;一行输出0,其它行输出1
MOV DPTR, #0E103H ;指向8155的PC口寄存器
MOVX A, @DPTR ;读键值
JB ACC.0, L1 ;第0列无按键,跳到L1
MOV A, #00H ;保存列号,准备计算键值
LJMP KG2
L1: JB ACC.1, L2 ;第1列无按键,跳到L2
MOV A, #01H ;保存列号,准备计算键值
LJMP KG2
L2: JB ACC.2, L3 ;第2列无按键,跳到L3
MOV A, #02H ;保存列号,准备计算键值
LJMP KG2
L3: JB ACC.3, NEXT;第3列无按键,跳到扫描下一行
MOV A, #03H ;保存列号,准备计算键值
KG2: ADD A, R4 ; 停止扫描,计算键值
MOV DPTR, #TAB1
MOVC A, @A+DPTR;按照键值查表得到键码
PUSH ACC ;保存键码
WaitRelease:LCALL DISP
LCALL KeyTest ;判断是否有键按下
JNZ WaitRelease
LCALL DISP ;调用显示程序, 延时6ms,消除抖动
LCALL KeyTest ;再次判断是否有键按下
JNZ WaitRelease
POP ACC
KeyGetEND: RET
NEXT: MOV A, R2 ;扫描行指针
JNB ACC.5, NEXT1 ;判断6行是否全部扫描完
RL A ;行扫描码左移
MOV R2, A
MOV A, R4
ADD A, #04 ;置下一行首键值
MOV R4, A
LJMP KG1 ;开始扫描下一行
NEXT1: MOV A, #24 ;未扫描到按键返回键码24
LJMP KeyGetEND
TAB1: DB 0,1,4,7,0FH,2,5,8,0EH,3,6,9,0DH,0CH,0BH,0AH ;键码表
DB 16,17,18,19,20,21,22
END
启动keil,选择菜单project→new project,新建一个工程。输入工程名“键盘输入”,然后
保存,如下图:

选择器件型号为atmel的AT89S51,然后确定,是否加入到启动文件到工程,这时不加入选
“否”,这样一个工程就建立完成。如下图:

选择菜单file→new新建一个文件,选择菜单file→save保存文件,输入文件名为“键盘输
入.asm”然后保存,如下图:
点target1前面的+号,展开target1,击source group 1,在弹出的菜单中选择add files to group
“source group 1”,然后选择all file,找到刚才的“键盘输入.asm”,然后点add ,然后就close,
如下图:

双击工程里的“键盘输入.asm”文件,输入目标程序,如下图:
选择project→build target,进行编译,结果如下图:
没有错误,就可以选择菜单debug→start/stop debug session,进入调试状态,如下图:
进入调试状态后,选择菜单perihperals→I/O-ports→port 1,打开端口1,下图为打开后
的画面(注意:画面最下端时间窗口处的状态为t1:0.00000000):

选择菜单debug→run运行,可以看到程序软件仿真情形,如下图:
注意:在最后的仿真窗口中,我们并没有看到端口的闪烁情况,是因为键盘输入程序是由外
界输入控制的,这并不代表程序错误,我们可以通过窗口的最下端时间状态窗口观察程序仿
真情况,可以看到t1在不断变化。