Kei软件实全教程(五) 其于Kel的实验仿真板的使用 前面介绍了Kei软件的使用,从中我们可以看到Kei的强大功能,不过,对于初学者 来说,还有些不直观,调试过程中看到的是一些数值,并没有看到这些数值所引起的外围电 路的变化,例如数码管点亮、发光管发光等。为了让初学者更好地入门,笔者利用Kei提 供的AGSI接口开发了两块仿真 实验板 键盘、LD显示实验仿真板 这两块仿真板将枯燥无味 P1.0P3.2 的数字用形象的图形表达出来, nFe 可以使初学者在没有硬件时就 P1.1 能感受到真实的学习环境,降低 P12P3.3 单片机的入门门槛。图1是键 P1.3 盘、LED显示实验仿真板的图, P1.43.4↑ P3.5 从图中可以看出,该板比较简 单,有在P1口接有8个发光二 极管,在P3口接有4个按钮 图的右边给出了原理图。 图2是另一个较为复杂的P7 实验仿真板。在该板上有8个数访问平凡的单片机 码管,16个按键(接成4★4的 键盘、LED显示实验仿真板 矩阵式),另外还有P1口接的8 个发光管,两个外部中断按钮,一个带有计数器的脉冲发生器等资源,显然,这块板可以完 成更多的实验。 实验仿真板的安装 这两块仿真实验板实际上是两个dl文 件,名称分别是 leakey. d和 simboard dll, 安装时只要根据需要将这两个或某一个文 件拷贝到kei件的c5lbin文件夹中即可 B0BB00GE c弄风 实验仿真板的使用 要使用仿真板,必须对工程进行设置, 设置的方法是点击 Project->Option for Target o叫 angel'打开对话框,然后选中 Debug标签 冲子教 页,在 Dialog: Parameter:后的编缉框中输入 d文件名。例如要用 leakey. dll(即第一块仿 2单片机实验仿真板 真板)进行调试,就输入 deskey,如图3 所示,输入完毕后点击确定退出。编译、连接完成后按CTRL+F5进入调试,此时,点击菜 单 Peripherals,即会多出一项“键盘LED仿真板(K)”,选中该项,即会出现如图1的界面
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 单片机实验仿真板
Kei软件实全教程(五) 同样,在设置时如果输入- dsimboard则能够调出如 t 图2的界面。 0s1 ItL 第一块仿真板的硬件电路很简单,电路图已在 板上,第二块板实现的功能稍复杂,其键盘和数码acrm 显示管部份的电路原理图如图4所示。下表给出了 3u“ 常用字形码,读者也可以根据图中的接线自行写出 其它如A、B、C、D、E、F等的字形码。除了键 盘和数码管以外,P1口同样也接有8个发光二极管, 图3实验仿真板的设置 连接方式与图1相同;脉冲发生器是接入T0即P34引脚。 OcOh0f9h 0a4hOb0h99h92h 90h OFFH 2 9消隐 RM MM P3.7 89C51 P3.6 益图2图 h g fe d c ba P3.5 E.E.B.E.E.B.B.B. P3.1 P3.0 图4实验仿真板2数码管和键盘部份的电路图 三、实例调试 以下以一个稍复杂的程序为例,说明键盘、LED显示实验仿真板的使用。该程序实现 的是可控流水灯,接P32的键为开始键,按此键则灯开始流动(由上而下),接P3.3的键 为停止键,按此键则停止流动,所有灯暗,接P34的键为向上键,按此键则灯由上向下流 动,接P35的键为向下键,按此键则灯由下向上流动 例8 UpDown BIT OOH;上下行标志 StartEnd bit olh;起动及停止标志 LAMPCODE EQU2H;存放流动的数据代码 ORO 000OH AJMP MAIN MAIN MOV SP#SFH MOV Pl#OFFH CLRUpDown 启动时处于向上的状态
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.7 P0.6 P0.5 P0.4 d c b a P0.3 P0.2 P0.1 P0.0 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 2 3 6 7 A B E F 0 1 4 5 8 9 VCC C D 89C51 图 4 实验仿真板 2 数码管和键盘部份的电路图 图 3 实验仿真板的设置
Kei软件实全教程(五) CLRStart End;启动时处于停止状态 MOV LAMPCODE,#OIH;单灯流动的代码 LOOP: ACALL KEY;调用键盘程序 JNBF0, LNEXT如果无键按下,则继续 ACALL KEYPROC 否则调用键盘处理程序 LNEXT: ACALL LAMP;调用灯显示程序 AJMP LOOP ;反复循环,主程序到此结束 延时程序键盘处理中调用 DELAY: MOV R7.#100 DI: MOV R6.#100 DJNZ R6.S DJNZ R7DI RET KEYPROC MOVA,B;从B寄存器中获取键值 JB ACO.2 KeyStart;分析键的代码,某位被按下,则该位为1 JB ACC.3, KeyOver JB ACC. 4, KeyUp Jb ACC. 5. KeyDown AJMP KEY RET SETB StartEnd;第一个键按下后的处理 AJMP KEY RET CLRStartEnd;第二个键按下后的处理 AJMP KEY RET SETB UpDown;第三个键按下后的处理 AJMP KEY RET CLRUpDown 第四个键按下后的处理 KEY RET. RET CLRF0;清FO,表示无键按下。 ORLP3,#00111008;将P3口的接有键的四位置 MOV AP3;取P3的值 ORLA,#1100011B;将其余4位置1 CPLA;取反 JZ KRET;如果为0则一定无键按下 CALL DELAY;否则延时去键抖 ORLP3,#0011110B ORLA#11000011B
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 ;分析键的代码,某位被按下,则该位为 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
Kei软件实全教程(五) CPLA JZ K RET MOVB,A;确实有键按下,将键值存入B中 SETB F0;设置有键按下的标志 以下的代码是可以被注释掉的,如果去掉注释,就具有判断键是否释放的功能,否则 没有 K_RET.,ORLP3,#o0111108;处循环等待键的释放 ORLA#11000011B CPL K RETI 读取的数据取反后为0说明键释放了 AJMP K RET K RETI: CALL DELAY 消除后沿抖动 RET DSOOMS 流水灯的延迟时间 MOV R7.#255 D51:MOVR6,#255 DJNZ R6.S DJNZ R7.D51 RET LAMP. JB Start End, LampStart;如果 StartEnd=1,则启动 MOV PL#OFFH AJMP LAMPRET;否则关闭所有显示返回 JB UpDown, LAMPUP;如果 UpDown=1,则向上流动 MOV A LAMPCODE RLA 实际就是左移位而已 MOV LAMPCODEA MOV PLA LCALL DS00MS LCALL D500MS AJMP LAMPRET LAMPUP MOV A LAMPCODE RRA;向下流动实际就是右移 MOV LAMPCODEA MOV PLA LCALL DS00MS LAMPRET RET END 将程序输入并建立工程文件,设置工程文件,在 Debug标签页中加入“ leakey”,汇 编、连接文件,按Ctrl+F5开始调试,打开仿真板,使用F5功能键全速运行,可以看到所
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 功能键全速运行,可以看到所
Kei软件实全教程(五) 有灯均不亮,点击最上面的按钮,立即会看到灯流动起来了,点击第二个按键,灯将停止流 动,再次点击第一个按钮,使灯流动起来,点击第三个按钮,可以发现灯流动的方向变了, 点击第四个按钮,灯的流动方向又变回来了。如果没有出现所描述的现象,可以使用单步、 过程单步等调试手段进行调试,在进行调试时实验仿真板会随时显示出当前的情况,是不是 非常的直观和方便呢? 下面的一个例子是关于第二块实验仿真板的,演示点亮8位数码管。例9 oRG 0000h JMP MAIN ORG 30H MAIN MOV SP#SFH 显示缓冲区首地址 MOV A#2 INIT. MOv@R0A初始化显示缓冲区 INC RO DJNZ R1,INIT将0-7送显示缓冲区 LOOP CALL DISPLAY JMP LOOP ;主程序到此结束 DISPLAY MOV RO,#7FH;列选择 MOV R7.#08H 共有8个字符 MOV R1#58H 显示缓冲区首地址 AGAIN MOV RI MOV DPTR. #DISPTABLE MOV P2. RO MOV ARO MOV RO, A INC RI DJNZ R7AGAIN RE DISPTABLE:DB0coh,0gh,0a4h,0b0h,9h,92h,82h,0f8h,80h,9Oh,OFFH;字形码表 END 这一程序内部RAM中58H到5FH被当成是显示缓冲区,主程序中用2-9填充该显示 区,然后调用显示程序显示2-9。这里是用了最简单的逐位显示的方式编写的显示程序 最后介绍一个小小技巧,将鼠标移入按钮区域,按下左键,按钮显示被按下,不要放开
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。这里是用了最简单的逐位显示的方式编写的显示程序。 最后介绍一个小小技巧,将鼠标移入按钮区域,按下左键,按钮显示被按下,不要放开
Kei软件实全教程(五) 鼠标左键,将光标移出按钮区域,松开左键,可以看到,按钮仍处于按下状态,利用这一功 能,在需要IO口长期处于低电平时,你就不必一直用手按着鼠标的左键啦
Keil 软件实全教程(五) 鼠标左键,将光标移出按钮区域,松开左键,可以看到,按钮仍处于按下状态,利用这一功 能,在需要 I/O 口长期处于低电平时,你就不必一直用手按着鼠标的左键啦