⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xsjp6.asm

📁 电子时钟的单片机设计
💻 ASM
📖 第 1 页 / 共 2 页
字号:
       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 + -