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

📄 74ls164_2片.asm

📁 在Protues下仿真用2片164驱动8个LED数码管
💻 ASM
字号:
;4*4行列键盘及8位LED数码管程序,LED采用2片164译码,占用3个I/O口,键盘采用线扫描法。
;程序有以下功能:
;FUN为功能控制状态字
;FUN为0时(功能代号0:0~9键):输入数字状态,输入一个数字,左移并显示
;FUN为1时(功能代号1:A键):左移一位
;FUN为2时(功能代号2:B键):右移一位
;FUN为3时(功能代号3:C键):闪烁
;FUN为4时(功能代号4:D键):左移/右移静止,闪烁停止,去除消隐   第二功能键(SHIFT)
;FUN为5时(功能代号5:E键):数据清零
;FUN为6时(功能代号6:F键):消隐状态
;FUN为11时(第二功能:SHIFT+A),连续左移,数据不断左移
;FUN为12时(第二功能:SHIFT+B),连续右移,数据不断右移
;FUN为13时(第二功能:SHIFT+C),向右跑马灯
;FUN为15时(第二功能:SHIFT+E),清屏,且清除数据
;FUN为16时(第二功能:SHIFT+F),撤销,因存储空间原因,只能撤销两次


LED EQU 30H   ;30H~37H为显存
KEY EQU 38H   ;KEY为键号
FUN EQU 39H    ;FUN为功能状态字
DIS_N EQU 3AH   ;DIS_N用于显存更新触发
RUN_N EQU 3BH    ;RUN_N 跑马灯的当前位置
TEMP EQU 3CH      ;临时变量,用于左右移数据暂存
PREKEY EQU 3DH     ; PREKEY为上次按键操作的键号,用于判断上挡键是否有效
SHIFT EQU 20H.0    ;上挡键标志
LEDDOWN EQU 20H.1   ; 消隐标志位
UNDO EQU 3EH         ; 当前能够撤销的次数
WATCH EQU 3FH
ORG 0000H
LJMP START

START:                ; 程序初始化
     MOV SP,#60H
     CLR SHIFT
     CLR LEDDOWN
     CLR P2.0
     CLR P2.1
     MOV DIS_N,#0FDH
     MOV RUN_N,#0FFH
     MOV UNDO,#0
     MOV R0,#LED       ;使8个LED处于全灭状态(无数据)
     MOV R1,#8
     MOV A,#0FFH
START1:
     MOV @R0,A
     INC R0
     DJNZ R1,START1


MAIN:
     MOV P1,#0F0H      ;键盘初始化
     ACALL CHECK       ;检测是否有键按下
     JNZ WAIT_KEY      ;若有键,则进行去抖处理
     ACALL DISP         ;调用显示子程序
     SJMP MAIN
WAIT_KEY:
     ACALL DISP          ;去抖处理
     ACALL DELAY
     CLR A
     ACALL CHECK
     JNZ FINDKEY        ;若有键按下,则转入计算键号
     SJMP MAIN          ;

CHECK:
     MOV A,P1        ;按键检测
     CPL A
     ANL A,#0F0H
     SWAP A
     RET
FINDKEY:                ;计算键号
     MOV R0,#00H
     CLR C
 CR1:
     RRC A
     INC R0
     JNC CR1
     DEC R0         ;得出第几行
     MOV A,R0
     MOV B,#04
     MUL AB
     MOV R1,A            ;得出行号
     MOV P1,#0FEH        ;利用线扫描法求列号
     ACALL CHECK
     JNZ K1
     MOV P1,#0FDH
     ACALL CHECK
     JNZ K2
     MOV P1,#0FBH
     ACALL CHECK
     JNZ K3
     MOV P1,#0F7H
     ACALL CHECK
     JNZ K4
     AJMP MAIN
K1:
     MOV A,#00H         ;计算列号
     AJMP KEND
K2:
     MOV A,#01H
     AJMP KEND
K3:
     MOV A,#02H
     AJMP KEND
K4:
     MOV A,#03H
KEND:
     ADD A,R1
     MOV KEY,A  ;得出键号,放入KEY
     ACALL INIT_KEY
K15:                  ;根据键号转入对应的处理程序
     CJNE A,#15,K14
     AJMP FUN15
K14:
     CJNE A,#14,K13
     AJMP FUN14
K13:
     CJNE A,#13,K12
     AJMP FUN13
K12:
     CJNE A,#12,K11
     AJMP FUN12
K11:
     CJNE A,#11,K10
     AJMP FUN11
K10:
     CJNE A,#10,K09
     AJMP FUN10
K09:
     MOV FUN,#0
     ACALL KEY_NUM
     AJMP WAIT_KEY_UP
FUN15:                   ;各键的处理程序,这里包括0~9键的数字处理,及A~F键的功能模块程序
    MOV FUN,#6             ;的初始化(及修改功能状态字,在下次调用DISP显示子程序时,对
    AJMP WAIT_KEY_UP         ;应的功能模块将被执行
FUN14:
    MOV FUN,#5
    AJMP WAIT_KEY_UP
FUN13:
    MOV FUN,#4
    AJMP WAIT_KEY_UP
FUN12:
    MOV FUN,#3
    AJMP WAIT_KEY_UP
FUN11:
    MOV FUN,#2
    AJMP WAIT_KEY_UP
FUN10:
    MOV FUN,#1
    AJMP WAIT_KEY_UP


INIT_KEY:
    MOV PREKEY,FUN
    MOV RUN_N,#0FFH
    MOV DIS_N,#0FDH
    RET

WAIT_KEY_UP:             ;等待键起
    ACALL DISP
    ACALL CHECK          ;不断调用DISP,直到键起
    JZ COMBACK
    SJMP WAIT_KEY_UP
COMBACK:AJMP MAIN

DISP:                      ;显示子程序
     INC DIS_N
     MOV A,DIS_N
     JZ DO                 ;转入功能处理模块
     MOV A,DIS_N
     CJNE A,#25,DISP1 ;DISP_N为50时触发LED显存更新(对应不同功能状态字)
     MOV DIS_N,#0FFH
DISP1:
     MOV R1,#00H
     MOV R2,#08H
     MOV R5,#7FH
LOOP:MOV R0,#LED     ;动态显示LED
     MOV A,R0
     ADD A,R1
     MOV R0,A
     MOV A,@R0
     MOV R4,A
     MOV C,LEDDOWN       ;LEDDOWN为1时,消隐
     JC DISABLE
DIS2:MOV A,R4
     ACALL SENDDATA
     MOV A,R5
     RR A
     MOV R5,A
     INC R1
     ACALL DELAY
     DJNZ R2,LOOP
     CLR P2.2
     SETB P2.2
     RET



DELAY:MOV R6,#1FH  ;延时
DELAY1:
      MOV R7,#1FH
      DJNZ R7,$
      DJNZ R6,DELAY1
      RET

DISABLE:               ;消隐输出
      MOV A,R1
      CJNE A,RUN_N,DIS3
      AJMP DIS2
DIS3:
      MOV R4,#0FFH
      AJMP DIS2
 DO:               ;功能处理模块
      MOV A,FUN
      JZ DISP1
      MOV C,SHIFT
      JC FUNPLUS
   D1:MOV A,FUN    ;根据功能状态字转入对应的功能模块
   D2:DEC A
      JZ TURNL  ;左移
      DEC A
      JZ TURNR  ;右移
      DEC A
      JZ FLASHL  ;闪烁
      DEC A
      JZ STOP   ;静止/SHIFT/恢复
      DEC A
      JZ CLRLEDL   ;清零
      DEC A
      JZ DOWNLEDL   ;消隐
   D3:MOV A,FUN     ;以下为第二功能键功能
      CJNE A,#11,D4
      AJMP TURNL2   ;连续左移
   D4:CJNE A,#12,D5
      AJMP TURNR2    ;连续右移
   D5:CJNE A,#13,D6
      AJMP RUNL      ;跑马灯
   D6:CJNE A,#15,D7
      AJMP CLS        ;清屏
   D7:CJNE A,#16,D8
      AJMP UNDOL       ;撤销
   D8:AJMP DISP1

FUNPLUS:                ;第二功能键
      CJNE A,#04,PLUS1
      CLR SHIFT
      MOV FUN,#0
      CLR LEDDOWN
      AJMP DISP1
PLUS1:
      MOV A,FUN
      ADD A,#10
      MOV FUN,A
      AJMP D3

UNDOL:AJMP UNDOD
FLASHL:AJMP FLASH
RUNL:AJMP RUN
DOWNLEDL:AJMP DOWNLED
CLRLEDL:AJMP CLRLED
TURNL:
      MOV FUN,#00H         ;左移子程序
TURNL2:
      MOV R0,#31H
      MOV R1,#07H
      MOV TEMP,30H
   U2:MOV A,@R0
      DEC R0
      MOV @R0,A
      INC R0
      INC R0
      DJNZ R1,U2
      MOV R0,#37H
      MOV @R0,TEMP
      CLR SHIFT
      AJMP DISP1

TURNR:
      MOV FUN,#00H                ;右移子程序
TURNR2:
      MOV R0,#36H
      MOV R1,#07H
      MOV TEMP,37H
   U3:MOV A,@R0
      INC R0
      MOV @R0,A
      DEC R0
      DEC R0
      DJNZ R1,U3
      MOV R0,#30H
      MOV @R0,TEMP
      CLR SHIFT
      AJMP DISP1


STOP:
      MOV A,PREKEY
      JZ SH
      CLR SHIFT
      MOV FUN,#0      ;清除左右移及消隐闪烁状态,第二功能键
      CLR LEDDOWN
      AJMP DISP1
   SH:SETB SHIFT
      MOV FUN,#0
      AJMP DISP1

CLRLED:
      MOV FUN,#00H      ;数据清零
      ACALL SAVEDATA
      MOV R0,#LED
      MOV R1,#8
      MOV A,#0
CLRLED1:
      MOV @R0,A
      INC R0
      DJNZ R1,CLRLED1
      AJMP DISP1

DOWNLED:                    ;关闭LED
       MOV FUN,#6
       SETB LEDDOWN
       AJMP DISP1
FLASH:
       CPL LEDDOWN            ;取反,使出现闪烁效果
       AJMP DISP1
CLS:
       MOV FUN,#00H    ;清屏
       ACALL SAVEDATA
       MOV R0,#LED
       MOV R1,#8
       MOV A,#0FFH
CLS1:
       MOV @R0,A
       INC R0
       DJNZ R1,CLS1
       CLR SHIFT
       AJMP DISP1
DISPL:AJMP DISP1
RUN:
      SETB LEDDOWN         ;跑马灯子程序
      CLR SHIFT
      INC RUN_N
      MOV A,RUN_N
      CJNE A,#8,DISPL
      MOV RUN_N,#0
      AJMP DISPL

UNDOD:                       ;撤销,因存储空间原因,只能撤销两次
      CLR SHIFT
      MOV FUN,#0
      MOV A,UNDO
      JZ GOBACK
      DEC UNDO
      MOV R0,#58H
      MOV R1,#30H
      MOV R3,#08
      ACALL LOOPS
      MOV R0,#50H
      MOV R1,#58H
      MOV R3,#08
      ACALL LOOPS
GOBACK:AJMP DISPL

KEY_NUM:
       MOV FUN,#0              ;0~9数字按键处理
       CLR SHIFT
       CLR LEDDOWN
       ACALL SAVEDATA
       MOV R0,#31H
       MOV R1,#07H
    U1:MOV A,@R0
       DEC R0
       MOV @R0,A
       INC R0
       INC R0
       DJNZ R1,U1
       MOV R0,#37H
       MOV @R0,KEY
       RET

SAVE2:MOV UNDO,#02
      SJMP SAVE1

SAVEDATA:INC UNDO
         CLR C
         MOV A,UNDO
         SUBB A,#03
         JZ SAVE2
    SAVE1:MOV R0,#58H
         MOV R1,#50H
         MOV R3,#08
         ACALL LOOPS
         MOV R0,#30H
         MOV R1,#58H
         MOV R3,#08
         ACALL LOOPS
         RET
   LOOPS:MOV A,@R0
         MOV @R1,A
         INC R0
         INC R1
         DJNZ R3,LOOPS
         RET
SENDDATA:

         MOV DPTR,#LEDCODE
         MOVC A,@A+DPTR
         MOV B,R5
SENDDATA1:
         MOV R3,#08
   SEND1:RRC A
         MOV P2.2,C
         PUSH A
         MOV A,B
         RRC A
         MOV P2.1,C
         MOV B,A
         POP A
         CPL P2.0
         CPL P2.0
         DJNZ R3,SEND1
         RET
LEDCODE:
        DB 3FH
        DB 06H,5BH,4FH
        DB 66H,6DH
        DB 7DH,07H,7FH,6FH,77H,7CH
        DB 39H,5EH,79H,71H

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -