这是一个常用程序段—子程序—标准程序,通过端口扫描而获得输入数据或控制输出数据,达到节省位或字节的目的—节约硬件资源。
关于扫描,可以从位及其取反实现流水灯着手来理解。可以通过移位实现流水灯—扫描。可以通过字节数据(01H,02H,04H,08H,10H,20H,40H,80H—阳极管)的端口发送实现流水灯—扫描。可以通过数据表(DB 01H,02H,04H,08H,10H,20H,40H,80H—阴极管)实现流水灯—扫描。可以通过循环跳转实现流水灯—扫描。扫描注意入比出查—获得输入要比较数据、发送输出要检查出口
扫描获取端口字节
扫描输出位移动产生动态效果(01、02、04、08、10、20、40、80),可以用字节表
扫描输出字符字节,通过延时可以变换字符以便造成数字进位效果
ORG 0000H
START:
dbuf equ 30h ;置存储区首址
temp equ 40h ;置缓冲区首址
org 00h
mov 30h,#2 ;存入数据
mov 31h,#0
mov 32h,#1
mov 33h,#0
mov 34h,#7
mov 35h,#1
mov r0,#dbuf
mov r1,#temp
mov r2,#6 ;六位显示器
mov dptr,#segtab ;段码表首地址
dp00: mov a,@r0 ;取要显示的数据
movc a,@a+dptr ;查表取段码
mov @r1,a ;段码暂存
inc r1
inc r0
djnz r2,dp00
disp0: mov r0,#temp ;显示子程序
mov r1,#6 ;扫描6次
mov r2,#01h ;从第一位开始
dp01: mov a,@r0
mov p2,a ;段码输出
mov a,r2 ;取位码
mov p1,a ;位码输出
acall delay ;调用延时
mov a,r2
rl a
mov r2,a
inc r0
djnz r1,dp01
sjmp disp0
segtab: db 0C0H,0F9H,0A4H,0B0H,99H,92H ;共阳极管
db 82H,0F8H,80H,90H,88H,88H,83H
delay: mov r4,#29h ;延时子程序
aa1: mov r5,0ffh
aa: djnz r5,aa
djnz r4,aa1
ret
end
???????????????????????
************************************************************************
还可以用其他程序形式进行扫描,像循环、递增或递减判断程序等。扫描技术可以用于点阵显示,液晶板(LCD)显示。这些都需要字符编码、显示延时、扫描端口以充分利用资源(节约资源)。
l 实例1—关于动态显示—LED闪烁
ORG 0000H
START:
MOV A,#0FFH ;字节传送
MOV P3,A ;字节传送
MOV P1,A
MOV C, 0A0H ;位传送
JNB 0A0H,GUAN ;判断位电平低为真,则转移;直接地址位为0转移
MOV P1,#00H ; P1口先赋#0FFH,再赋#00H,则产生闪烁
RET
GUAN :
MOV P3,#00H ;P3口先赋#0FFH,再赋#00H,则产生闪烁,也可以使用取反指令
RET ;可以产生闪烁效果
END
其他方法(如:延时子程序)也可以实现动态显示。[page]
l
实例2—单个LED灯-单个按键的仿真
ORG 0000H ;这是伪指令,机器并不执行,用于程序的交流。指令执行的起始地址,十进制用D表示,十六进制用H表示,二进制用B表示。一个字节(8位机、16位机、32位机、64位机)一次执行。也可以按位来执行,也就是一个bit。
ORG 00000000B与ORG 0000H作用相同。注意8位(bit)一个字节。16位的处理器需要用0000 0000H 表示。16或32位以上,使用操作系统(Wince、Linux等)更有效,可以利用大量的、底层的、专业化、标准化的面向控制的库函数(如:API等)。
START: ;这是伪指令,机器并不执行。只是为了汇编语言讲故事的可理解性
MAIN: ;伪指令,主程序,用于区别子程序
PC→MOV A,#00H ;将立即数00000000B(常数0D)传送给累加器ACC(专用寄存器,可用于存放计算结果等)。要通过累加器A和其它存储地址进行数据交换。注意PC是自动移位(自动+1)到下一个语句的地址。使用该语句实质上是让PC具有初始位置。
PC→MOV P1,A ;将累加器中的数(常数0D)传送给端口P1(P1口8位全部置0,低电平, P1端口各位处于关闭状态,LED灯处于系统响应的准备状态),按字节传送数据。特别记忆:PC→表示指针所指地址,并会自动加1。
PC→MOV C,0A0H ;检测P2.0口的状态,将P2.0口的状态(由按键状态决定)传送给位累加器C,位累加器C的地址是PSW(程序状态字寄存器)的进位标志位CY(D7H\PSW.7)。P2.0口可以是开或关,也就是置1或0,高电平或低电平),按字节传送数据。要通过位累加器C和其它存储地址进行数据交换。该语句也可以写成:MOV C,P2.0,比较字节数据传送MOV A,#00H或MOV A,P1。
PC→MOV P1.0,C;等价于MOV 90H,C;将位累加器C地址中的值传送给P1.0口(90H是其直接地址),也就是将P2.0口的状态(由直接地址0A0H状态决定)传送给直接地址90H,P1.0口
PC→MOV P1.1,C ;等价于MOV 91H,C
PC→MOV P1.2,C ;等价于MOV 92H,C
PC→MOV P1.3,C ;等价于MOV 93H,C 等等
END ;伪指令,程序结束标志
l
实例3—扫描实现数字移动变化的仿真
l
实例4—双数码管双端口数字进位仿真
l 实例5—双四数码管组双端口数字显示—单端口扫描移动仿真—点阵
双四数码管组双端口数字显示—单端口扫描移动仿真,可以被分解为
a) 双四数码管组双端口数字显示—单端口无扫描无移动—>数字变化(依靠数表和指针),
b) 双四数码管组双端口数字显示—单端口扫描移动—>数字不变化(依靠数表和指针),
c) 双四数码管组双端口数字显示—单端口扫描移动—>数字变化(依靠数表和指针),