五、实验框图
开始 开始 显示缓冲区初始化 初始化地址参数 LED显示 输出列扫描信号 否 列扫描信号移位 有键输入? 是 读入行信号 读取键值 是 该列有键输入 键值转换为显示数据 否 主程序框图 6列扫描完? 显示程序框图见八段码显示实验 是 返回 按照行列计算键值 查表得键码 等待按键释放 返回 读键输入子程序框图 否
44
六、程序清单
OUTBIT equ 0FE02h ; 位控制口
CLK164 equ 0FE04h ; 段控制口(接164时钟位) DAT164 equ 0FE06h ; 段控制口(接164数据位) IN equ 0FE00h ; 键盘读入口 LEDBuf equ 60h ; 显示缓冲 0000 0200B7 ljmp Start
LEDMAP: ; 八段管显示码 0003 3F065B 0006 4F666D
0009 7D07 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h 000B 7F6F77 000E 7C395E
0011 7971 db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h Delay: ; 延时子程序 0013 7F00 mov r7, #0 DelayLoop:
0015 DFFE djnz r7, DelayLoop 0017 DEFC djnz r6, DelayLoop 0019 22 ret DisplayLED:
001A 7860 mov r0, #LEDBuf
001C 7906 mov r1, #6 ; 共6个八段管 001E 7A20 mov r2, #00100000b ; 从左边开始显示 Loop:
0020 90FE02 mov dptr, #OUTBIT 0023 7400 mov a, #0
0025 F0 movx @dptr, a ; 关所有八段管 0026 E6 mov a, @r0
0027 75F008 mov B, #8 ; 送164 DLP:
002A 33 rlc a
002B FB mov r3, a
002C 92E0 mov acc.0, c 002E 90FE06 mov dptr, #DAT164
0031 F0 movx @dptr, a 0032 90FE04 mov dptr, #CLK164 0035 D2E0 setb acc.0 0037 F0 movx @dptr, a 0038 C2E0 clr acc.0
003A F0 movx @dptr, a 003B EB mov a, r3 003C D5F0EB djnz B, DLP
003F 90FE02 mov dptr, #OUTBIT 0042 EA mov a, r2
45
0043 F0 movx @dptr, a ; 显示一位八段管 0044 7E01 mov r6, #1
0046 1113 call Delay
0048 EA mov a, r2 ; 显示下一位 0049 03 rr a
004A FA mov r2, a 004B 08 inc r0
004C D9D2 djnz r1, Loop 004E 22 ret TestKey:
004F 90FE02 mov dptr, #OUTBIT 0052 7400 mov a, #0
0054 F0 movx @dptr, a ; 输出线置为0 0055 90FE00 mov dptr, #IN
0058 E0 movx a, @dptr ; 读入键状态 0059 F4 cpl a
005A 540F anl a, #0fh ; 高四位不用 005C 22 ret
KeyTable: ; 键码定义 005D 161514
0060 FF db 16h, 15h, 14h, 0ffh 0061 131211
0064 10 db 13h, 12h, 11h, 10h 0065 0D0C0B
0068 0A db 0dh, 0ch, 0bh, 0ah 0069 0E0306
006C 09 db 0eh, 03h, 06h, 09h 006D 0F0205
0070 08 db 0fh, 02h, 05h, 08h 0071 000104
0074 07 db 00h, 01h, 04h, 07h GetKey:
0075 90FE02 mov dptr, #OUTBIT 0078 8583A0 mov P2, dph
007B 7800 mov r0, #Low(IN) 007D 7920 mov r1, #00100000b 007F 7A06 mov r2, #6 KLoop:
0081 E9 mov a, r1 ; 找出键所在列 0082 F4 cpl a
0083 F0 movx @dptr, a 0084 F4 cpl a 0085 03 rr a
0086 F9 mov r1, a ; 下一列 0087 E2 movx a, @r0 0088 F4 cpl a
46
0089 540F anl a, #0fh
008B 7006 jnz Goon1 ; 该列有键入 008D DAF2 djnz r2, KLoop
008F 7AFF mov r2, #0ffh ; 没有键按下, 返回 0ffh 0091 800F sjmp Exit Goon1:
0093 F9 mov r1, a ; 键值 = 列 X 4 + 行 0094 EA mov a, r2 0095 14 dec a 0096 23 rl a 0097 23 rl a
0098 FA mov r2, a ; r2 = (r2-1)*4 0099 E9 mov a, r1 ; r1中为读入的行值 009A 7904 mov r1, #4 LoopC:
009C 13 rrc a ; 移位找出所在行 009D 4003 jc Exit
009F 0A inc r2 ; r2 = r2+ 行值 00A0 D9FA djnz r1, LoopC Exit:
00A2 EA mov a, r2 ; 取出键码 00A3 90005D mov dptr, #KeyTable 00A6 93 movc a, @a+dptr
00A7 FA mov r2, a WaitRelease:
00A8 90FE02 mov dptr, #OUTBIT ; 等键释放 00AB E4 clr a
00AC F0 movx @dptr, a 00AD 7E0A mov r6, #10 00AF 1113 call Delay 00B1 114F call TestKey
00B3 70F3 jnz WaitRelease 00B5 EA mov a, r2 00B6 22 ret Start:
00B7 758140 mov sp, #40h
00BA 7560FF mov LEDBuf, #0ffh ; 显示 8.8.8.8. 00BD 7561FF mov LEDBuf+1, #0ffh 00C0 7562FF mov LEDBuf+2, #0ffh 00C3 7563FF mov LEDBuf+3, #0ffh 00C6 756400 mov LEDBuf+4, #0 00C9 756500 mov LEDBuf+5, #0 MLoop:
00CC 111A call DisplayLED ; 显示 00CE 114F call TestKey ; 有键入?
00D0 60FA jz MLoop ; 无键入, 继续显示
47
00D2 1175 call GetKey ; 读入键码 00D4 540F anl a, #0fh ; 显示键码 00D6 900003 mov dptr, #LEDMap 00D9 93 movc a, @a+dptr 00DA F565 mov LEDBuf+5, a
00DC 0200CC ljmp MLoop end
实验九 单片机串行口通讯实验
一、实验要求
利用8031单片机串行口,实现两个实验台之间的串行通讯。其中一个实验台作为发送方,另一侧为接收方。发送方读入按键值,并发送给接收方,接收方收到数据后在LED上显示。
二、实验目的
1、 掌握单片机串行口工作方式的程序设计,及简易三线式通讯的方法。 2、 了解实现串行通讯的硬环境、数据格式的协议、数据交换的协议。 3、 学习串口通讯的中断方式的程序编写方法。
三、实验电路
显示电路和键盘电路见硬件实验十六和硬件实验十七。
四、实验说明 通讯双 方的RXD、 TXD信号本 甲方 乙方 应经过电平 转换后再行 交叉连接,本 实验中为减少连线可将电平转换电
路略去,而将双方的RXD、TXD直接交叉连接。也可以将本机的TXD接到RXD上,这样按下的键,就会在本机LED上显示出来。
五、程序清单
OUTBIT equ 0FE02h ; 位控制口
CLK164 equ 0FE04h ; 段控制口(接164时钟位) DAT164 equ 0FE06h ; 段控制口(接164数据位) IN equ 0FE00h ; 键盘读入口 LEDBuf equ 60h ; 显示缓冲
48