Keil实例教程
基于Keil的实验仿真板的使用

🏠 首页 《无线电》杂志 2003年 🔗 第11期 🔗 第37页 分类:电脑与单片机 🔗 周坚 🔗

前几期笔者介绍了Keil软件的使用,从中我们可以看到Keil的强大功能。不过,对于初学者来说,还有些不直观,调试过程中看到的是一些数值,并没有看到这些数值所引起的外围电路的变化,例如数码管点亮、发光管发光等。为了让初学者更好地入门,笔者利用Keil提供的AGSI接口开发了两块仿真实验板。

这两块仿真板将枯燥无味的数字用形象的图形表达出来,可以使初学者在没有硬件时就能感受到真实的学习环境,降低单片机的入门门槛。图1是键盘、LED显示实验仿真板图,可以看出,该板比较简单,有在P1口接有8个发光二极管,在P3口接有4个按钮,图的右边给出了原理图。

图1
图1 🔍原图 (536×434)

图2是另一个较为复杂的实验仿真板。在该板上有8个数码管,16个按键(接成4×4的矩阵式),另外还有P1口接的8个发光管,两个外部中断按钮,一个带有计数器的脉冲发生器等资源,显然,这块板可以完成更多的实验。

图2
图2 🔍原图 (536×462)

一、实验仿真板的安装

这两块仿真实验板实际上是两个dll文件,名称分别是ledkey.dll和simboard.dll,安装时只要根据需要将这两个或某一个文件拷贝到keil软件的c51\bin文件夹中即可。

二、实验仿真板的使用

使用仿真板,必须对工程进行设置,设置的方法是点击Project->Option for Target ‘Target1’打开对话框,然后选中Debug标签页,在Dialog :Parameter:后的编辑框中输入-d文件名。例如要用ledkey.dll(即第一块仿真板)进行调试,就输入-dledkey,如图3所示,输入完毕后点击确定退出。编译、连接完成后按CTRL

图3
图3 🔍原图 (536×344)

+F5进入调试,此时,点击菜单Peripher-als,即会多出一项“键盘LED仿真板(K)”,选中该项,即会出现如图1所示的界面,同样,在设置时如果输入-dsim-board则能够调出如图2所示的界面。

第一块仿真板的硬件电路很简单,电路图已在板上,第二块板实现的功能稍复杂,其键盘和数码显示管部分的电路原理图如图4所示。附表给出了常用字形码,读者也可以根据图中的接线自行写出其他如A、B、C、D、E、F等的字形码。 除了键盘和数码管以外,P1口同样也接有8个发光二极管,连接方式与图1相同;键盘旁的两个按钮INT0和INT1分别接到P3口的INT0和INT1,即P3.2和P3.3引脚,脉冲发生器是接入T0即P3.4引脚。

图5
图5 🔍原图 (365×67)
图4
图4 🔍原图 (825×347)

三、实例调试

下面以一个稍复杂的程序为例,说明键盘、LED显示实验仿真板的使用。该程序实现的是可控流水灯,接P3.2的键为开始键,按此键则灯开始流动(由上而下),接P3.3的键为停止键,按此键则停止流动,所有灯暗,接P3.4的键为向上键,按此键则灯由上向下流动,接P3.5的键为向下键,按此键则灯由下向上流动。例:

UpDown BIT 00H;上下行标志

StartEnd BIT 01H;起动及停止标志

LAMPCODE EQU 21H;存放流动数据代码

ORG 0000H

AJMP MAIN

ORG 30H

MAIN:

MOV SP,#5FH

MOV P1,#0FFH

CLR UpDown;启动时处于向上状态

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;分析键的代码,某位被按下,则该位为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 ;将其余位置1

CPL A;取反

JZ K_RET;如果为0则一定无键按下

CALL DELAY;否则延时去键抖

ORL P3,#00111100B

MOV A,P3

ORL A,#11000011B

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 ;如果Up-Down=1,则向上流动

MOV A,LAMPCODE

RL A;实际就是左移位而已

MOV LAMPCODE,A

MOV P1,A

LCALL D500MS

LCALL D500MS

AJMP LAMPRET

LAMPUP:

MOV A,LAMPCODE

RRA ;向下流动实际就是右移

MOV LAMPCODE,A

MOV P1,A

LCALL D500MS

LAMPRET: RET

END

将程序输入并建立工程文件,设置工程文件,在Debug标签页中加入“-dledkey”,汇编、连接文件,按Ctrl+F5开始调试,打开仿真板,使用F5功能键全速运行,可以看到所有灯均不亮,点击最上面的按钮,立即会看到灯流动起来了,点击第二个按键,灯将停止流动,再次点击第一个按钮,使灯流动起来,点击第三个按钮,可以发现灯流动的方向变了,点击第四个按钮,灯的流动方向又变回来了。如果没有出现所描述的现象,可以使用单步、过程单步等调试手段进行调试,在进行调试时实验仿真板会随时显示出当前的情况,是不是非常直观方便呢?

下面的一个例子是关于第二块实验仿真板的,演示点亮8位数码管。

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

MOV CA,@A+DPTR

MOV P

MOV P2,R0

MOV A,R0

RRA

MOV R

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。这里是用了最简单的逐位显示的方式编写的显示程序。

最后介绍一个小技巧,将鼠标移入按钮区域,按下左键,按钮显示被按下,不要放开鼠标左键,将光标移出按钮区域,松开左键,可以看到,按钮仍处于按下状态。利用这一功能,在需要I/O口长期处于低电平时,就不必一直用手按着鼠标的左键啦!

编者注:读者可在本期配刊光盘的“本期程序”文件夹中找到本文介绍的两块实验仿真板的文件,还可找到“Keil实例教程”系列文章中所有实例的源程序。

(周坚)