pxsjpgb.asm
来自「电子时钟的单片机设计」· 汇编 代码 · 共 486 行 · 第 1/2 页
ASM
486 行
org 0000h
ljmp main
org 000bh
ljmp it00 ;定时中断0
;***************************;
; 主程序 ;
;***************************;
org 0030h
main:
mov 28h,#00h ;标记位总清零
mov 41h,#23h ;显视数字的首地址指针(即23单元)
mov 50h,#22h ;显视横杠的首地址指针(即22单元)
mov 44h,#08h ;定时器高位(TH0)初值
mov 43h,#88h ;定时器低位(TL0)初值
mov 5bh,#00h
mov 5ch,#00h
clr 50h
clr 6eh ;清闪动开关标志位
mov tmod,#01h ;定时方式1 (16位计数器)
mov th0,44h ;定时器高位(TH0)送初值
mov tl0,43h ;定时器低位(TL0)送初值
setb et0 ;定时中断0 允许中断
setb tr0 ;启动定时器
setb ea ;开中断
mov 42h,#2eh
mov 20h,#2eh
mov 21h,#2eh
mov 22h,#2eh
mov 23h,#2fh ;让23单元显视P
key: lcall dirv
;-------------------------;
; 读键 ;
;-------------------------;
kl0:
setb et0 ;定时中断0 允许中断
setb tr0 ;启动定时器
setb ea ;开中断
mov a,#0fh
mov p2,a
mov a,p2 ;p2口低四位为键扫描输入,高四位数出
jnb acc.0,kl1 ;判断有无键按下
jnb acc.1,kl1 ;判断有无键按下
jnb acc.2,kl1 ;判断有无键按下
jnb acc.3,kl1 ;判断有无键按下
lcall dirv
ljmp kl0 ;无键按下继续
kl1: lcall dirv ;20h单元位0为1处于最高位带小数点显示
kl12: mov a,#0fh
mov p2,a
mov a,p2 ;p2口低四位为键扫描输入,高四位数出
jnb acc.0,kl2
jnb acc.1,kl2
jnb acc.2,kl2
jnb acc.3,kl2 ;判断有无键按下
clr 51h ;清除键按下标记:28h单元位1为1则键按下
lcall dirv
ljmp kl0 ;为抖动没键按下继续
kl2: jnb 51h,ke1y ;28h单元位1为1则键按下已经处理过反回
ljmp kl0
ke1y: setb 51h ;打上键按下标记:28h单元位1为1则键按下
mov r2,#0efh ;确实有键开始扫描键值
mov r4,#00h
pk1: ; mov a,p2 ;p2口低四位为键扫描输入,高四位数出
mov a,r2
mov p2,a
mov a,p2 ;p2口低四位为键扫描输入,高四位数出
mov r1,#00h ;r1中为键行数
jnb acc.0,pk20 ;判有无键按下
lcall kll2
jnb acc.1,pk20 ;判有无键按下
lcall kll2
jnb acc.2,pk20 ;判有无键按下
lcall kll2
jnb acc.3,pk20 ;判有无键按下
ljmp pk2
pk20: mov a,#00h
add a,r4
add a,r1
ljmp pk5 ;扫到键值去散转处理
pk2: inc r4
mov a,r2
jnb acc.7,pk3 ;判断4个键是否扫描完
rl a
mov r2,a
ajmp pk1 ;16个键没扫完继续
pk3: ajmp kl0 ;16个键全扫完为误动作反回
kll2: mov r0,a
mov a,r1
add a,#04h ;加一行四个键
mov r1,a
mov a,r0
ret
;------------------------------;
; 键状态判断子程序 ;
;------------------------------;
pk5: mov dptr,#tb0 ;散转处理
mov r2,a
add a,r2
jnc pk6
inc dph
pk6: jmp @a+dptr
tb0: ajmp k11 ;键7
ajmp k12 ;键8
ajmp k13 ;键9
ajmp k14 ;键/
ajmp k21 ;键4
ajmp k22 ;键5
ajmp k23 ;键6
ajmp k24 ;键x
ajmp k31 ;键1
ajmp k32 ;键2
ajmp k33 ;键3
ajmp k34 ;键-
ajmp k41 ;键c
ajmp k42 ;键0
ajmp k43 ;键=
ajmp k44 ;键+
ljmp kl0
k11: ;键7
lcall xshg
mov r0,41h
mov @r0,#07h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k12: ;键8
lcall xshg
mov r0,41h
mov @r0,#08h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k13: ;键9
lcall xshg
mov r0,41h
mov @r0,#09h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k14: ;键/
ljmp kl0
k21: ;键4
lcall xshg
mov r0,41h
mov @r0,#04h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k22: ;键5
lcall xshg
mov r0,41h
mov @r0,#05h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k23: ;键6
lcall xshg
mov r0,41h
mov @r0,#06h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k24: ;键x
ljmp kl0
k31: ;键1
lcall xshg
mov r0,41h
mov @r0,#01h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k32: ;键2
lcall xshg
mov r0,41h
mov @r0,#02h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k33: ;键3
lcall xshg
mov r0,41h
mov @r0,#03h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k34: ;键-
mov 4ah,41h ;保存当前显示指针到4ah
inc 6bh ;
mov a,6bh
xrl a,#01h ;是否第一次按k34
jnz kw2
mov r0,41h
mov a,@r0 ;当前显示值送a
orl a,42h ;当前显示值与闪烁保留值"或"取出当前实际值
cs: mov b,a ;寻找数据末位
mov a,b
xrl a,#30h ;当前显示位是否为"-"
jnz cs10
ljmp kw0 ;当前显示位是为"-"
cs10: mov a,b
xrl a,#2eh ;当前显示位是否为"灭"
jnz cs20
ljmp kw0 ;当前显示位是为"灭"
cs20: dec r0 ;当前显示位不是为"灭",继续寻找数据末位
mov a,r0
xrl a,#1fh ;是否找过最低显示位;20h
jz kw00
ljmp cs
kw00: mov 5bh,#00h ;显示位全为数据:5bh指向显示末位
ljmp kw2
kw0: mov 5bh,r0 ;
inc 5bh ;是第一次按k17当前显示指针加一(指向有数末位)存5bh
kw2: dec 41h ;当前指针减一
mov a,41h
xrl a,#1fh
jnz k170 ;是否减过最低显示位
mov 41h,#23h ;减过最低显示位回到最高显示位
ajmp k170
k170: mov r0,4ah ;当前显示指针存r0
mov a,41h
xrl a,#23h ;减一后的显示指针是否指向最高显示位
jnz kw3
mov a,5bh
xrl a,#00h
jnz k171
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?