📄 xsjp6.asm
字号:
org 0000h
ljmp key00
org 000bh
ljmp it00 ;定时中断0
;*************************************************************
; 主程序
;*************************************************************
org 0028h
key00: mov psw,#00h ;51机软件复位
mov ip,#00h
mov ie,#00h
mov 88h,#00h ;8A到8C为定时器清领零
mov 8ch,#00h
mov 8ah,#00h
mov 8dh,#00h
mov 8bh,#00h
mov 98h,#00h ;串行SCON复为位
mov 97h,#00h
mov 5bh,#00h
mov 5ch,#00h
mov tmod,#00h ;定时反方式复位
mov sp,#5fh ;堆栈指针从60h 开始
mov 41h,#27h ;显视数字的首地址指针(即27单元)
mov 50h,#26h ;显视横杠的首地址指针(即26单元)
mov 47h,#18h
mov 28h,#00h
mov 44h,#0f9h ;输入60转的初值(TH0)
mov 43h,#7dh ;TL0送值
clr 6eh ;清闪动开关标志位
clr 50h
setb ea ;开中断
setb et0 ;定时中断0 允许中断
mov th0,44h ;输入60转的初值
mov tl0,43h
mov tmod,#01h ;定时方式1 (16位计数器)
setb tr0 ;启动定时器
lcall drr
mov 27h,47h ;让27单元显视P
key: lcall dirv
;-------------------------;
; 读键 ;
;-------------------------;
kl0:
lcall pk4 ;调键状态判断子程序
jnb acc.0,kl1 ;判断有无键按下
jnb acc.1,kl1 ;判断有无键按下
jnb acc.2,kl1 ;判断有无键按下
lcall dirv
ljmp kl0 ;无键按下继续
kl1: lcall dirv ;20h单元位0为1处于最高位带小数点显示
kl12: lcall pk4
jnb acc.0,kl2
jnb acc.1,kl2
jnb acc.2,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,#0feh ;确实有键开始扫描键值
mov r4,#00h
pk1: mov dptr,#0dffdh ;8255B口地址为0fffdh
mov a,r2
movx @dptr,a
inc dptr ;8255C口地址为0fffeh
movx a,@dptr
mov r1,#00h ;r1中为键行数
jnb acc.0,pk20 ;判有无键按下
lcall kll2
jnb acc.1,pk20 ;判有无键按下
lcall kll2
jnb acc.2,pk20 ;判有无键按下
ljmp pk2
kll2: mov r0,a
mov a,r1
add a,#08h ;加一行八个键
mov r1,a
mov a,r0
ret
pk20: mov a,#00h
add a,r4
add a,r1
ljmp pk5 ;扫到键值去散转处理
pk2: inc r4
mov a,r2
jnb acc.7,pk3 ;判断8个键是否扫描完
rl a
mov r2,a
ajmp pk1 ;24个键没扫完继续
pk3: ajmp kl0 ;24个键全扫完为误动作反回
;------------------------------;
; 键状态判断子程序 ;
;------------------------------;
pk4: mov dptr,#0dfffh ;8255控制口
mov a,#81h ;8255控制方式为81h: C口(上)出(下)入,B口出,A口出
movx @dptr,a
mov dptr,#0dffdh ;8255B口地址为0fffdh
mov a,#00h
movx @dptr,a
inc dptr ;8255C口地址为0fffeh
movx a,@dptr
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 ;键0
ajmp k15 ;键.
ajmp k16 ;键+
ajmp k17 ;键-
ajmp k18 ;键K
ajmp k21 ;键4
ajmp k22 ;键5
ajmp k23 ;键6
ajmp k24 ;键F
ajmp k25 ;键G
ajmp k26 ;键H
ajmp k27 ;键I
ajmp k28 ;键J
ajmp k31 ;键1
ajmp k32 ;键2
ajmp k33 ;键3
ajmp k34 ;键A
ajmp k35 ;键B
ajmp k36 ;键C
ajmp k37 ;键D
ajmp k38 ;键E
ljmp kl0
;************************
k11: lcall xshg
mov r0,41h
mov @r0,#07h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k12: lcall xshg
mov r0,41h
mov @r0,#08h
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
lcall xs
ljmp kl0
k13: lcall xshg
mov r0,41h
mov @r0,#09h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k14: lcall xshg
mov r0,41h
mov @r0,#00h
lcall xs
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
ljmp kl0
k15: lcall xshg ;显示退一位(向20h方向)
mov r0,41h ;当前显示位(27h--20h)指针取到r0
mov a,@r0 ;当前显示内容取到a
xrl a,#10h ;当前显示是否为"灭"
jz k150 ;当前显示为"灭"跳
mov a,@r0 ;当前显示内容取到a(不为"灭")
ljmp k151
k150: mov a,42h ;当前显示内容取到a(不为"灭")
k151: mov b,a
xrl a,#1bh ;当前显示是否为"_"
jnz k152 ;当前显示不为"_"跳
setb 47h
mov r0,41h ;当前显示位取到a
dec r0 ;显示退一位(向20h方向)
mov @r0,#10h ;显示"灭"(显示不移位)
mov r0,41h ;当前显示位取到a
inc r0 ;显示进一位(向27h方向)----小数点打在该位
mov a,@r0 ;当前显示内容取到a
mov b,a
k152: clr c
subb a,#20h ;显示内容是否已经有"."
jnc k155 ;显示内容已经有"."退出
mov a,b
add a,#20h ;打小数点
mov @r0,a
mov 42h,a
mov a,b
xrl a,#1bh
jz k155
mov r0,41h
dec r0
mov a,@r0
xrl a,#1bh
jnz k155
k153: lcall xs ;当前显示位(27h--20h)指针减一(向20h方向)
mov 6bh,#00h ;清除键"-"记忆
mov 5bh,#00h ;显示数据末位指针清零
k155: jnb 47h,k156 ;当前显示不为"_"跳
clr 47h
mov r0,41h
mov @r0,#1bh
mov 42h,#1bh
k156: ljmp kl0
;*******************************
k16: mov 4ah,41h
inc 41h
mov a,41h
mov 6ch,41h
xrl a,#28h
jnz k160
mov 41h,#20h
ajmp k160
k160: mov a,41h
xrl a,#20h
jnz kw4
mov 6ch,21h
mov a,6ch
subb a,5bh
jc kw5
kw4: mov r0,4ah
mov a,6ch
subb a,5bh
jc kw1
mov a,6ch
xrl a,5bh
jnz kw6
mov 42h,#10h
kw6: mov @r0,42h
mov r0,41h
mov 42h,@r0
ljmp kl0
kw5: push 0
mov r0,4ah
mov @r0,42h
mov r0,41h
mov @r0,#1bh
mov 42h,@r0
pop 0
ljmp kl0
kw1: mov 42h,#10h
mov @r0,42h
mov r0,41h
mov @r0,#1bh
mov 42h,@r0
ljmp kl0
k17: mov 4ah,41h ;保存当前显示指针到4ah
inc 6bh ;
mov a,6bh
xrl a,#01h ;是否第一次按k17
jnz kw2
mov r0,41h
mov a,@r0 ;当前显示值送a
orl a,42h ;当前显示值与闪烁保留值"或"取出当前实际值
cs: mov b,a ;寻找数据末位
mov a,b
xrl a,#1bh ;当前显示位是否为"-"
jnz cs10
ljmp kw0 ;当前显示位是为"-"
cs10: mov a,b
xrl a,#10h ;当前显示位是否为"灭"
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -