Keil 软件实全教程(五)
其于 Keil的实验仿真板的使用
前面介绍了 Keil软件的使用,从中我们可以看到 Keil的强大功能,不过,对于初学者
来说,还有些不直观,调试过程中看到的是一些数值,并没有看到这些数值所引起的外围电
路的变化,例如数码管点亮、发光管发光等。为了让初学者更好地入门,笔者利用 Keil 提
供的AGSI接口开发了两块仿真
实验板。
这两块仿真板将枯燥无味
的数字用形象的图形表达出来,
可以使初学者在没有硬件时就
能感受到真实的学习环境,降低
单片机的入门门槛。图 1 是键
盘、LED显示实验仿真板的图,
从图中可以看出,该板比较简
单,有在 P1口接有 8个发光二
极管,在 P3口接有 4个按钮,
图的右边给出了原理图。
图 2 是另一个较为复杂的
实验仿真板。在该板上有 8个数
码管,16个按键(接成 4*4的
矩阵式),另外还有 P1口接的 8
个发光管,两个外部中断按钮,一个带有计数器的脉冲发生器等资源,显然,这块板可以完
成更多的实验。
一、实验仿真板的安装
这两块仿真实验板实际上是两个 dll 文
件,名称分别是 ledkey.dll 和 simboard.dll,
安装时只要根据需要将这两个或某一个文
件拷贝到 keil软件的 c51\bin文件夹中即可。
二、实验仿真板的使用
要使用仿真板,必须对工程进行设置,
设置的方法是点击 Project->Option for Target
‘Target1’打开对话框,然后选中 Debug标签
页,在 Dialog :Parameter:后的编缉框中输入
-d文件名。例如要用 ledkey.dll(即第一块仿
真板)进行调试,就输入-dledkey,如图 3
所示,输入完毕后点击确定退出。编译、连接完成后按 CTRL+F5进入调试,此时,点击菜
单 Peripherals,即会多出一项“键盘 LED仿真板(K)”,选中该项,即会出现如图 1的界面,
键盘、LED显示实验仿真板
图 2 单片机实验仿真板
Keil 软件实全教程(五)
同样,在设置时如果输入-dsimboard 则能够调出如
图 2的界面。
第一块仿真板的硬件电路很简单,电路图已在
板上,第二块板实现的功能稍复杂,其键盘和数码
显示管部份的电路原理图如图 4 所示。下表给出了
常用字形码,读者也可以根据图中的接线自行写出
其它如 A、B、C、D、E、F 等的字形码。 除了键
盘和数码管以外,P1口同样也接有 8个发光二极管,
连接方式与图 1相同;脉冲发生器是接入 T0即 P3.4引脚。
0c0h 0f9h 0a4h 0b0h 99h 92h 82h 0f8h 80h 90h 0FFH
0 1 2 3 4 5 6 7 8 9 消隐
三、实例调试
以下以一个稍复杂的程序为例,说明键盘、LED 显示实验仿真板的使用。该程序实现
的是可控流水灯,接 P3.2 的键为开始键,按此键则灯开始流动(由上而下),接 P3.3 的键
为停止键,按此键则停止流动,所有灯暗,接 P3.4 的键为向上键,按此键则灯由上向下流
动,接 P3.5的键为向下键,按此键则灯由下向上流动。
例 8:
UpDown BIT 00H ;上下行标志
StartEnd BIT 01H ;起动及停止标志
LAMPCODE EQU 21H ;存放流动的数据代码
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV P1,#0FFH
CLR UpDown ;启动时处于向上的状态
h g f e
P0.7
P0.0
P0
.5
P0
.4
P0
.7
P0
.6
abcd
P0
.3
P0
.2
P0
.0
P0
.1
P2.7
P2.0
P2
.7
P2
.6
P2
.5
P2
.4
P2
.3
P2
.2
P2
.1
P2
.0
驱动
P3.0
P3.1
P3.2
P3.5
P3.3
P3.4
P3.6
P3.7
32
76
BA
FE
10
54
98
C DVCC 89C51
图 4 实验仿真板 2数码管和键盘部份的电路图
图 3 实验仿真板的设置
Keil 软件实全教程(五)
CLR StartEnd ;启动时处于停止状态
MOV LAMPCODE,#01H ;单灯流动的代码
LOOP: ACALL KEY ;调用键盘程序
JNB F0,LNEXT ;如果无键按下,则继续
ACALL KEYPROC ;否则调用键盘处理程序
LNEXT: ACALL LAMP ;调用灯显示程序
AJMP LOOP ;反复循环,主程序到此结束
;延时程序,键盘处理中调用
DELAY: MOV R7,#100
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
KEYPROC:
MOV A,B ;从 B寄存器中获取键值
JB ACC.2,KeyStart ;
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
键的代码,某位被按下,则该位为 1
JB ACC.3,KeyOver
JB ACC.4,KeyUp
JB ACC.5,KeyDown
AJMP KEY_RET
KeyStart:
SETB StartEnd ;第一个键按下后的处理
AJMP KEY_RET
KeyOver:
CLR StartEnd ;第二个键按下后的处理
AJMP KEY_RET
KeyUp:
SETB UpDown ;第三个键按下后的处理
AJMP KEY_RET
KeyDown:
CLR UpDown ;第四个键按下后的处理
KEY_RET:
RET
KEY:
CLR F0 ;清 F0,表示无键按下。
ORL P3,#00111100B ;将 P3口的接有键的四位置 1
MOV A,P3 ;取 P3的值
ORL A,#11000011B ;将其余 4位置 1
CPL A ;取反
JZ K_RET ;如果为 0则一定无键按下
CALL DELAY ;否则延时去键抖
ORL P3,#00111100B
MOV A,P3
ORL A,#11000011B
Keil 软件实全教程(五)
CPL A
JZ K_RET
MOV B,A ;确实有键按下,将键值存入 B中
SETB F0 ;设置有键按下的标志
;以下的代码是可以被注释掉的,如果去掉注释,就具有判断键是否释放的功能,否则
没有
K_RET: ;ORL P3,#00111100B ;此处循环等待键的释放
;MOV A,P3
;ORL A,#11000011B
;CPL A
;JZ K_RET1 ;读取的数据取反后为 0说明键释放了
;AJMP K_RET
;K_RET1:CALL DELAY ;消除后沿抖动
RET
D500MS: ;流水灯的延迟时间
MOV R7,#255
D51: MOV R6,#255
DJNZ R6,$
DJNZ R7,D51
RET
LAMP:
JB StartEnd,LampStart ;如果 StartEnd=1,则启动
MOV P1,#0FFH
AJMP LAMPRET ;否则关闭所有显示,返回
LampStart:
JB UpDown,LAMPUP ;如果 UpDown=1,则向上流动
MOV A,LAMPCODE
RL A ;实际就是左移位而已
MOV LAMPCODE,A
MOV P1,A
LCALL D500MS
LCALL D500MS
AJMP LAMPRET
LAMPUP:
MOV A,LAMPCODE
RR A ;向下流动实际就是右移
MOV LAMPCODE,A
MOV P1,A
LCALL D500MS
LAMPRET:
RET
END
将程序输入并建立工程文件,设置工程文件,在 Debug 标签页中加入“-dledkey”,汇
编、连接文件,按 Ctrl+F5 开始调试,打开仿真板,使用 F5 功能键全速运行,可以看到所
Keil 软件实全教程(五)
有灯均不亮,点击最上面的按钮,立即会看到灯流动起来了,点击第二个按键,灯将停止流
动,再次点击第一个按钮,使灯流动起来,点击第三个按钮,可以发现灯流动的方向变了,
点击第四个按钮,灯的流动方向又变回来了。如果没有出现所描述的现象,可以使用单步、
过程单步等调试手段进行调试,在进行调试时实验仿真板会随时显示出当前的情况,是不是
非常的直观和方便呢?
下面的一个例子是关于第二块实验仿真板的,演示点亮 8位数码管。例 9:
ORG 0000h
JMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV R1,#08H
MOV R0,#58H ;显示缓冲区首地址
MOV A,#2
INIT:
MOV @R0,A ;初始化显示缓冲区
INC A
INC R0
DJNZ R1,INIT ;将 0-7送显示缓冲区
LOOP:
CALL DISPLAY
JMP LOOP
;主程序到此结束
DISPLAY:
MOV R0,#7FH ;列选择
MOV R7,#08H ;共有 8个字符
MOV R1,#58H ;显示缓冲区首地址
AGAIN:
MOV A,@R1
MOV DPTR,#DISPTABLE
MOVC A,@A+DPTR
MOV P0,A
MOV P2,R0
MOV A,R0
RR A
MOV R0,A
INC R1
DJNZ R7,AGAIN
RET
DISPTABLE: DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0FFH ;字形码表
END
这一程序内部 RAM 中 58H 到 5FH 被当成是显示缓冲区,主程序中用 2-9 填充该显示
区,然后调用显示程序显示 2-9。这里是用了最简单的逐位显示的方式编写的显示程序。
最后介绍一个小小技巧,将鼠标移入按钮区域,按下左键,按钮显示被按下,不要放开
Keil 软件实全教程(五)
鼠标左键,将光标移出按钮区域,松开左键,可以看到,按钮仍处于按下状态,利用这一功
能,在需要 I/O口长期处于低电平时,你就不必一直用手按着鼠标的左键啦。