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

📄 led500.asm

📁 用MAX6959实现的键盘以及数码显示原代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
       HBEN   EQU  P1.4
       ISDA   EQU  P1.5
       ISCL   EQU  P1.7
       Current_Value EQU 048H
       MinValue      EQU 049H
       MaxValue      EQU 04AH
              ORG  0000H
              SJMP START
              ORG 0013H
              LJMP INTERRUPT1
              ORG  0050H
START:

CLR_ERAM:
              MOV  DPTR,#2000H
              CLR  A
      CLR_C00:MOVX @DPTR,A
              INC  DPTR
              MOV  A,DPH
              CJNE A,#2FH,CLR_C00
CLR_IRAM:
              MOV  R0,#030H
              CLR  A
     CLR_C01: MOV  @R0,A
              INC  R0
              CJNE R0,#0FFH,CLR_C01
INI_8255:
              MOV  DPTR,#4003H
              MOV  A,#098H     ;A口输入,B口。C口输出,工作方式0
              MOVX @DPTR,A     
INI_6959:
;***********************************************
;*********需要数据输入接口设计******************
              MOV  R5,#08H
              MOV  R4,#30H
              MOV  30H,#70H
              MOV  31H,#01H
              MOV  32H,#0FH
              MOV  33H,#05H
              MOV  34H,#03H
              MOV  35H,#23H
              MOV  36H,#0FFH
              MOV  37H,#058H
              LCALL I2CSTART
              LCALL I2CWRITE
              LCALL I2CSTOP
DISPLAR_AI0:
;***********************************************
;*********需要数据输入接口设计******************
              MOV  R5,#06H
              MOV  R4,#30H
              MOV  30H,#70H
              MOV  31H,#20H
              MOV  32H,#01H
              MOV  33H,#02H
              MOV  34H,#03H
              MOV  35H,#04H
              LCALL I2CSTART
              LCALL I2CWRITE
              LCALL I2CSTOP
INI_PELICAN:
;************暂时空缺,CAN***************************
;************以上通过,2004.09.14
ITERRUPT_CONF:
             SETB  EX1
             SETB  IT1
             SETB  EA;*************到此运行不下去了  09.14.16:08时通过******************88
;******************中断的其他设置暂时空缺*****************
;**********************************************************
;**********************************************************
 MOV  R0,#80H
              MOV   @R0,#0FFH
              INC   R0       
              MOV   @R0,#0FH
              INC   R0
              MOV   @R0,#0FFH
              INC   R0
              MOV   @R0,#0AH
              INC   R0
              MOV   @R0,#0AAH
              INC   R0
              MOV   @R0,#0FH
              INC   R0
              MOV   @R0,#0FFH
              INC   R0
              MOV   @R0,#00H
              INC   R0
              MOV   @R0,#0AAH
              INC   R0
              MOV   @R0,#0FH
              INC   R0
              MOV   @R0,#0FFH
              INC   R0
              MOV   @R0,#0AH
              INC   R0
              MOV   @R0,#00H
              INC   R0
              MOV   @R0,#0FH
              INC   R0
              MOV   @R0,#0FFH
              INC   R0
              MOV   @R0,#0AH
              LCALL PRO_AI   
INPUT_SCAN:
   SCAN_8255:
              MOV  DPTR,#4000H  ;A口
              MOVX A,@DPTR
              MOV  3BH,A
   ;SCAN_197:  
            ;  MOV  A,PSW
            ;  ORL  A,#08H
             ; MOV  PSW,A
             ; MOV  R7,#50H
             ; MOV  R0,#080H     ;存放197采集的数据共8组
        ; SCAN_197_CYCL:    
          ;    CLR HBEN
          ;    MOV  DPTR,#6000H
          ;    MOV  A,R7
          ;    MOVX @DPTR,A
          ;    SETB F0
        ; JUDGEF0:
             ; JB  F0,JUDGEF0
          ;    INC R7
           ;   INC R0
    ;*********存储数据接口设计************
             ; CJNE R7,#58H,SCAN_197_CYCL
             ; MOV  A,PSW
             ; ANL  A,#0E7H
             ; MOV  PSW,A
              LJMP INPUT_SCAN
;***********************************************************
;************************************************************
INTERRUPT1:
              CLR  EA
              PUSH ACC
              PUSH B
              PUSH DPH
              PUSH DPL
              PUSH PSW
              MOV  A,PSW
              ANL  A,#0E7H
              MOV  PSW,A       
              MOV  A,P1
              JB   ACC.6,INRPT_6959   ;P1.6=1则是6959的中断
     INRPT_197:   
              MOV  DPTR,#6000H
              MOVX A,@DPTR
              MOV  @R0,A
              INC  R0
              SETB HBEN
              NOP
              MOVX A,@DPTR
              MOV  @R0,A
              CLR  HBEN
              CLR  F0
              SETB EA
              LJMP INRPT_QUIT              ;***************2004.09.14,,,16:08通过
      INRPT_6959:
   ;*****************键盘显示处理程序,暂时空缺***************************
              MOV   R5,#02H
              MOV   R4,#30H
              MOV   30H,#70H
              MOV   31H,#0CH
              LCALL I2CSTART
              LCALL I2CWRITE
              MOV   R5,#01H
              MOV   R4,#39H
              MOV   39H,#71H
              LCALL I2CSTART
              LCALL I2CWRITE
              LCALL I2CREC_BYTE
              LCALL READ_ACK1
              LCALL I2CSTOP
     ;判断哪一个键被按下
    KEY1: 
               MOV  A,R7;***********把读出来的字节R7中的数据存放在3EH****************
               MOV  3EH,A
               JNB  ACC.0,KEY2
               MOV  A,40H
               CJNE A,#00H,KEY_CLR 
               MOV  40H,#08H
               LJMP DIS_CHANGE 
         KEY_CLR:
              ANL  40H,#00H
      DIS_CHANGE:
              MOV  41H,#00H
              MOV  42H,#00H
              MOV  R1,#070H
              LCALL DISPLAY  
              LJMP  KEY_QUIT;;;;;;;;;;;;;;;;;
     KEY2:
              MOV  A,3EH
              JNB  ACC.1,KEY3
              MOV  A,41H
              CJNE A,#07H,KEY2ADD
              MOV  41H,#00H
              LJMP LED_KEY2
          KEY2ADD:
              INC 41H
      LED_KEY2:                        ;用INC  51H代替
              MOV   42H,#00H           ;清52H
              LCALL DISPLAY_KEY2       ;显示
              LJMP  KEY_QUIT
    KEY3:
               MOV  A,3EH
               JNB  ACC.3,KEY6
               MOV  A,42H
               CJNE A,#07H,KEY3ADD
               MOV  42H,#00H
               LJMP LED_KEY3
          KEY3ADD:
               INC  42H
       LED_KEY3:
               
               LCALL DISPLAY_KEY3     ;显示
               LJMP  KEY_QUIT
    KEY6:
               MOV  A,3EH
               JNB  ACC.7,KEY4
               CLR  A
               MOV  40H,A
               MOV  41H,A
               MOV  42H,A
               MOV  R1,#070H
               LCALL DISPLAY         ;;显示AI0
               LJMP  KEY_QUIT           
    KEY4:
                MOV  A,40H
                JZ   KEY_QUIT0       ;判断KEY1是否处于更改状态
                MOV  A,3EH
                JNB  ACC.4,KEY5
;读出KEY2/3对应寄存器的置查表得到相应的地址并加1
                MOV  A,41H            ;KEY2的值
                CJNE A,#00H,CHANGE_AO ;改变AI
        KEY_QUIT0:
                LJMP  KEY_QUIT        
        CHANGE_AO:
                CJNE A,#01H,CHANGE_DI ;改变AO
                MOV  A,42H            ;KEY3的值
                ADD  A,#0A0H
                MOV  R1,A
                INC  @R1               ;R1存放要改变数据所在地址
                LCALL OUTPUT_521
                LCALL DISPLAY          ;跳到显示模块
                LJMP  KEY_QUIT
        CHANGE_DI:
                CJNE A,#02H,CHANGE_DO   ;改变DI
                LJMP KEY_QUIT
        CHANGE_DO:
                CJNE A,#03H,CHANGE_PID1  ;改变DO
                MOV  A,42H
                ADD  A,#0B0H
                MOV  R1,A
                MOV  @R1,#0AH
                LCALL OUTPUT_8255
                LCALL DISPLAY_DO
                LJMP  KEY_QUIT
        CHANGE_PID1:
                CJNE A,#04H,CHANGE_PID2
                MOV  A,42H
                ADD  A,#0C0H
                MOV  R1,A
                INC  @R1
                LCALL DISPLAY
                LJMP  KEY_QUIT
         CHANGE_PID2:
                CJNE A,#05H,KEY_QUIT
                MOV  A,42H
                ADD  A,#0C8H
                MOV  R1,A
                INC  @R1
                LCALL DISPLAY
                LJMP  KEY_QUIT
   KEY5:
;读出KEY2/3对应寄存器的置查表得到相应的地址并减1
                MOV  A,41H                 ;KEY2的值
                CJNE A,#00H,CHANGE_AOD     ;改变AI
                LJMP KEY_QUIT
          CHANGE_AOD:
                CJNE A,#01H,CHANGE_DID      ;改变AO
              
                MOV  A,42H                  ;KEY3的值
                ADD  A,#0A0H
                MOV  R1,A
                DEC  @R1                    ;R1存放要改变数据所在地址
                LCALL DISPLAY               ;跳到显示模块
                LCALL OUTPUT_521
                LJMP  KEY_QUIT
         CHANGE_DID:
               CJNE A,#02H,CHANGE_DOD       ;改变DI
               LJMP KEY_QUIT
         CHANGE_DOD:
              CJNE A,#03H,CHANGE_PID1D       ;改变DO
               MOV  A,42H
               ADD  A,#0B0H
               MOV  R1,A
               MOV  @R1,#00H
               LCALL OUTPUT_8255
               LCALL DISPLAY_DO
               LJMP  KEY_QUIT
         CHANGE_PID1D:
               CJNE A,#04H,CHANGE_PID2D
               MOV  A,42H
               ADD  A,#0C0H
               MOV  R1,A
               DEC  @R1
               LCALL DISPLAY
               LJMP  KEY_QUIT
         CHANGE_PID2D:
               CJNE A,#05H,KEY_QUIT
               MOV  A,42H
               ADD  A,#0C8H
               MOV  R1,A
               DEC  @R1
               LCALL DISPLAY
KEY_QUIT:
;****************读弹起寄存器,消除中断***********************************
              MOV  R5,#02H
              MOV  R4,#39H
              MOV  39H,#70H
              MOV  3AH,#08H
              LCALL I2CSTART
              LCALL I2CWRITE
              MOV  R5,#01H
              MOV  R4,#3CH
              MOV  3CH,#71H
              LCALL I2CSTART
              LCALL I2CWRITE
              LCALL I2CREC_BYTE
     
              LCALL READ_ACK1
              LCALL I2CSTOP
              MOV A,R7 
              MOV 3FH,A                   ;***********把读出来的字节存放在3FH****************
INRPT_QUIT:
             POP   PSW
             POP   DPL
             POP   DPH
             POP   B
             POP   ACC
             SETB  EA
             RETI    
;************************************************************************************************************
;*****************子程序******子程序******子程序********子程序*******子程序**********************************
I2CSTART:                      ;START信号
           SETB  ISDA          ;设置空闲是都为高电平 
           SETB  ISCL
           LCALL I2CWAIT
           CLR   ISDA
           LCALL I2CWAIT
           CLR   ISCL
           NOP                 ;ISCL低平持续至少4us
           NOP
           RET
I2CSTOP:   
           CLR   ISDA           ;STOP信号
           LCALL I2CWAIT
           SETB  ISCL
           LCALL I2CWAIT
           SETB  ISDA
           RET                   
ACK:       
           SETB   ISCL          ;响应信号时钟
           NOP
           NOP
           NOP
           CLR   ISCL
           NOP
           NOP
           SETB ISDA
           RET
I2CWRITE:
           MOV  A,R4
           MOV  R0,A
       CYCLE_W:
           MOV  A,@R0
           MOV  R7,#08H
         WRITE_BYTE:
           RL   A
           JNB  ACC.0,C008
           LCALL WRITE_1
           LJMP C007
         C008:
           LCALL WRITE_0
         C007:
           DJNZ  R7,WRITE_BYTE
           LCALL ACK
           INC   R0
           DJNZ  R5,CYCLE_W
           RET  
WRITE_0:   
           CLR  ISDA        ;写0
           NOP              ;ISDA须在ISCL转变为高电平之前至少0.25us
           SETB ISCL
           NOP              ;ISCL的高电平至少维持4us
           NOP
           NOP
           CLR ISCL
           NOP              ;ISCL降低后SDA至少维持5us
           NOP
           NOP
           RET
WRITE_1:  
           SETB ISDA
           NOP
           SETB ISCL
           NOP
           NOP
           NOP
           CLR  ISCL
           RET                             
I2CWAIT:   
           NOP
           NOP
           RET
READ_ACK0:  
           NOP
           CLR   ISDA
           NOP
           SETB  ISCL
           NOP
           NOP
           NOP
           CLR   ISCL
           SETB ISDA
           RET
READ_ACK1:  
           NOP
           SETB   ISDA
           NOP
           SETB  ISCL
           NOP
           NOP
           NOP
           CLR   ISCL
           SETB ISDA
           RET                          
;读取6959的数据存放在R7中   
I2CREC_BYTE:
           CLR   A
           MOV   R7,A
           MOV   R6,A
     C0017:
           SETB  ISCL
           LCALL I2CWAIT
           MOV   A,R7
           RL    A
           MOV   R7,A
           JNB   ISDA,C0020
           XCH   A,R7
           ORL   A,#01H
           XCH   A,R7
      C0020:
           CLR   ISCL
           LCALL I2CWAIT
           INC   R6
           CJNE  R6,#08H,C0017
           RET
           ;读取的数据存放在R7中
;;;;;;;;;;;;;;;;;;KEY2显示******************************************           
DISPLAY_KEY2:
           MOV A,41H
           CJNE A,#00H,LED_AO
     LED_AI:
           MOV R1,#070H
           LCALL DISPLAY
           LJMP  DISPLAY_KEY2_QUIT      
; ***********************AI 的显示程序,暂时空缺******************************************
     LED_AO:
           CJNE A,#01H,LED_DI
           MOV R1,#0A0H    ;存放AO 数据的首地址
           LCALL DISPLAY
           LJMP DISPLAY_KEY2_QUIT
     LED_DI:
           CJNE A,#02H,LED_DO 
          ; MOV  42H,#00H
           LCALL DISPLAY_DI
           LJMP  DISPLAY_KEY2_QUIT
                
     LED_DO:
           CJNE A,#03H,LED_PID1
           MOV  R1,#0B0H 
           ;MOV  42H,#00H
           LCALL DISPLAY_DO
           LJMP  DISPLAY_KEY2_QUIT
     LED_PID1: 
           CJNE A,#04H,LED_PID2
           MOV  R1,#0C0H
          ; MOV  42H,#00H
           LCALL DISPLAY
           LJMP  DISPLAY_KEY2_QUIT
      LED_PID2:     
           MOV  R1,#0C8H
          ; MOV  42H,#00H

⌨️ 快捷键说明

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