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 + -
显示快捷键?