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

📄 led500.asm

📁 用MAX6959实现的键盘以及数码显示原代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
           LCALL DISPLAY
          
DISPLAY_KEY2_QUIT:
         RET           
;**************************************************************************
;**********************KEY3显示***************************************

DISPLAY_KEY3:
           MOV A,41H
           CJNE A,#00H,LED3_AO
     LED3_AI:
           MOV   A,42H
           ADD   A,#070H
           MOV   R1,A
           LCALL DISPLAY
           LJMP  DISPLAY_KEY3_QUIT       
; ***********************AI 的显示程序,暂时空缺******************************************
     LED3_AO:
           CJNE  A,#01H,LED3_DI
           MOV   A,42H    ;存放AO 数据的首地址
           ADD   A,#0A0H
           MOV   R1,A
           LCALL DISPLAY
           LJMP  DISPLAY_KEY3_QUIT
     LED3_DI:
           CJNE  A,#02H,LED3_DO 
           
           LCALL DISPLAY_DI
           LJMP  DISPLAY_KEY3_QUIT
                
     LED3_DO:
           CJNE A,#03H,LED3_PID1
           MOV A,42H    ;存放DO 数据的首地址
           ADD  A,#0B0H
           MOV  R1,A
           LCALL DISPLAY_DO
           LJMP  DISPLAY_KEY3_QUIT
     LED3_PID1: 
           CJNE A,#04H,LED3_PID2
           MOV A,42H    ;存放AO 数据的首地址
           ADD  A,#0C0H
           MOV  R1,A
           LCALL DISPLAY
           LJMP  DISPLAY_KEY3_QUIT
      LED3_PID2:     
           MOV A,42H    ;存放AO 数据的首地址
           ADD  A,#0C8H
           MOV  R1,A
           LCALL DISPLAY
          
DISPLAY_KEY3_QUIT:
         RET           
;*********************显示@R1的内容*************
DISPLAY:
           MOV   A,@R1
           MOV   R7,A
           LCALL HEX2BCD1
           MOV   30H,#70H
           MOV   31H,#20H
           MOV   32H,R7
           MOV   33H,R6
           MOV   34H,R3
           MOV   35H,42H              ;显示第几个变量
           MOV   A,40H                ;显示第几类变量
           ADD   A,41H
           MOV   36H,A
           
           MOV   R5,#07H
           MOV   R4,#030H
           LCALL I2CSTART
           LCALL I2CWRITE
           LCALL I2CSTOP
           RET           
;将变量值的各位、十位分别取出,以便应用
;输入 R7:待转换的数值0~99,
;输出 R7 个位   R6  十位
;将变量值的各位、十位分别取出,以便应用
;输入 R7:待转换的数值0~99,
;输出 R7 个位   R6  十位 R3  百位
HEX2BCD1:
             MOV   A,R7
             MOV   B,#64H
             DIV   AB
             MOV   R3,A
             MOV   A,#0AH
             XCH   A,B
             DIV   AB
             MOV   R6,A
             MOV   R7,B
             RET
;入口  R1,,,,,,,,,,最后应该在主循环中调用             
OUTPUT_521:
            MOV A,@R1
            MOV R7,A
            LCALL Value100_255
            MOV  46H,#50H    ;521的地址
            MOV  47H,42H     ;通道选择
            MOV  R4,#46H     
            MOV  R5,#03H
            LCALL I2CSTART
            LCALL I2CWRITE
            LCALL I2CSTOP
            RET
;将变量值范围从0~100放大到0~255
;输入 R7:待转换的变量0~100
;MinValue:最小值,地址范围00H~7FH为直接寻址
;MaxValue:最大值,地址范围00H~7FH为直接寻址
;输出:CurrentValue,转换后0~255,地址范围00H~7FH为直接寻址
Value100_255:
            MOV  A,R7
            SETB C
            SUBB A,#064H
            JC   C0003           ;A<065H进借位C=1,跳到C0003
            MOV  R7,#64H
C0003:
            MOV  Current_Value,R7
            CLR  A
            MOV  MinValue,A
            MOV  MaxValue,#64H
            CLR  C
            MOV  A,Current_Value
            SUBB A,MinValue
            MOV  B,#0FFH
            MUL  AB
            MOV  R5,A
            MOV  R4,B
            CLR  OV
            CLR  C
            MOV  A,MaxValue
            SUBB A,MinValue
            MOV  R7,A
            LCALL DDIVISION
            MOV   A,R3
            MOV   Current_Value,A
            RET
;功能   双字节除以一个字节
;入口   R4R5被除数,,,,R7除数
;出口   R3
;所用资源: PSW  C  OV  R3~R7            
DDIVISION:
             CLR C
             MOV  A,R4
             SUBB A,R7
             JC   DV50
             SETB OV
             RET
DV50:
             MOV  R6,#08H
DV51:
             MOV  A,R5
             RLC  A
             MOV  R5,A
             MOV  A,R4
             RLC  A
             MOV  R4,A
             MOV  F0,C
             CLR  C
             SUBB A,R7
             ANL  C,/F0
             JC   DV52
             MOV  R4,A
DV52:
             CPL  C
             MOV  A,R3
             RLC  A
             MOV  R3,A
             DJNZ R6,DV51
             MOV  A,R4
             ADD  A,R4
             JC   DV53
             SUBB A,R7
             JC   DV54
DV53:
             INC   R3
DV54:
             CLR  OV
             RET
;*************向8255输出数字量************************************************** 
OUTPUT_8255:
            MOV  A,42H    ;对应与KEY3键的寄存器的值给A
     OUTPUT_0:
            CJNE A,#00H,OUTPUT_1
            MOV  A,@R1
            CJNE A,#00H,OUTPUT_0ON
            MOV  A,3CH
            ANL  A,#0FEH
            LJMP OUTPUT_QUIT       
         OUTPUT_0ON:
            MOV  A,3CH
            ORL  A,#01H
            LJMP OUTPUT_QUIT
     OUTPUT_1:
            CJNE A,#01H,OUTPUT_2
            MOV  A,@R1
            CJNE A,#00H,OUTPUT_1ON
            MOV  A,3CH
            ANL  A,#0FDH
            LJMP OUTPUT_QUIT       
         OUTPUT_1ON:
            MOV  A,3CH
            ORL  A,#02H
            LJMP OUTPUT_QUIT     
     OUTPUT_2:
            CJNE A,#02H,OUTPUT_3
            MOV  A,@R1
            CJNE A,#00H,OUTPUT_2ON
            MOV  A,3CH
            ANL  A,#0FBH
            LJMP OUTPUT_QUIT       
         OUTPUT_2ON:
            MOV  A,3CH
            ORL  A,#04H
            LJMP OUTPUT_QUIT     
     OUTPUT_3:
            CJNE A,#03H,OUTPUT_4
            MOV  A,@R1
            CJNE A,#00H,OUTPUT_3ON
            MOV  A,3CH
            ANL  A,#0F7H
            LJMP OUTPUT_QUIT       
         OUTPUT_3ON:
            MOV  A,3CH
            ORL  A,#08H
            LJMP OUTPUT_QUIT
     OUTPUT_4:
            CJNE A,#04H,OUTPUT_5
            MOV  A,@R1
            CJNE A,#00H,OUTPUT_4ON
            MOV  A,3CH
            ANL  A,#0EFH       
         OUTPUT_4ON:
            MOV  A,3CH
            ORL  A,#10H     
     OUTPUT_5:
            CJNE A,#05H,OUTPUT_6
            MOV  A,@R1
            CJNE A,#00H,OUTPUT_5ON
            MOV  A,3CH
            ANL  A,#0DFH
            LJMP OUTPUT_QUIT       
         OUTPUT_5ON:
            MOV  A,3CH
            ORL  A,#20H
            LJMP OUTPUT_QUIT     
     OUTPUT_6:
            CJNE A,#06H,OUTPUT_7
            MOV  A,@R1
            CJNE A,#00H,OUTPUT_6ON
            MOV  A,3CH
            ANL  A,#0BFH
            LJMP OUTPUT_QUIT       
         OUTPUT_6ON:
            MOV  A,3CH
            ORL  A,#40H
            LJMP OUTPUT_QUIT     
     OUTPUT_7:
            CJNE A,#07H,OUTPUT_RET
            MOV  A,@R1
            CJNE A,#00H,OUTPUT_7ON
            MOV  A,3CH
            ANL  A,#07FH
            LJMP OUTPUT_QUIT       
         OUTPUT_7ON:
            MOV  A,3CH
            ORL  A,#80H
OUTPUT_QUIT:          
            MOV  3CH,A
            MOV  DPTR,#4001H
            MOV  A,3CH
            MOVX @DPTR,A
OUTPUT_RET:
            RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;            
DISPLAY_DO:    
            MOV  A,@R1                   ;入口R1
            JNZ   DISPLAY_OA
     DISPLAY_OFF:         
            MOV   30H,#70H
            MOV   31H,#20H
            MOV   32H,#0FH
            MOV   33H,#0FH
            MOV   34H,#00H
            MOV   35H,42H
            LJMP  C0009
     DISPLAY_OA:
            MOV   30H,#70H
            MOV   31H,#20H
            MOV   32H,#0AH
            MOV   33H,#00H
            MOV   34H,#00H
            MOV   35H,42H
     C0009: 
            MOV   A,40H
            ADD   A,41H
            MOV   36H,A      
            MOV   R5,#07H
            MOV   R4,#030H       
            LCALL I2CSTART
            LCALL I2CWRITE
            LCALL I2CSTOP
            RET
;***********************************************************************
;********************显示DI,这段程序最后要在主循环中处理***************************************                          
DISPLAY_DI:
            MOV  A,42H
            CJNE A,#00H,DISPLAY_DI1
            MOV  A,3BH;8255的输入数据
            JNB  ACC.0,DI000
            LCALL DISPLAY_OA
            LJMP  DISPLAY_DI_QUIT
          DI000:
            LCALL DISPLAY_OFF
            LJMP  DISPLAY_DI_QUIT
     DISPLAY_DI1:              
            CJNE A,#01H,DISPLAY_DI2
            MOV  A,3BH;8255的输入数据
            JNB  ACC.1,DI001
            LCALL DISPLAY_OA
            LJMP  DISPLAY_DI_QUIT
          DI001:
            LCALL DISPLAY_OFF
            LJMP  DISPLAY_DI_QUIT
      DISPLAY_DI2:              
            CJNE A,#02H,DISPLAY_DI3
            MOV  A,3BH;8255的输入数据
            JNB  ACC.2,DI002
            LCALL DISPLAY_OA
            LJMP  DISPLAY_DI_QUIT
          DI002:
            LCALL DISPLAY_OFF
            LJMP  DISPLAY_DI_QUIT
     DISPLAY_DI3:              
            CJNE A,#03H,DISPLAY_DI4
            MOV  A,3BH;8255的输入数据
            JNB  ACC.3,DI003
            LCALL DISPLAY_OA
            LJMP  DISPLAY_DI_QUIT
          DI003:
            LCALL DISPLAY_OFF
            LJMP  DISPLAY_DI_QUIT
     DISPLAY_DI4:              
            CJNE A,#04H,DISPLAY_DI5
            MOV  A,3BH;8255的输入数据
            JNB  ACC.4,DI004
            LCALL DISPLAY_OA
            LJMP  DISPLAY_DI_QUIT
          DI004:
            LCALL DISPLAY_OFF
            LJMP  DISPLAY_DI_QUIT
     DISPLAY_DI5:              
            CJNE A,#05H,DISPLAY_DI6
            MOV  A,3BH;8255的输入数据
            JNB  ACC.5,DI005
            LCALL DISPLAY_OA
            LJMP  DISPLAY_DI_QUIT
          DI005:
            LCALL DISPLAY_OFF
            LJMP  DISPLAY_DI_QUIT
     DISPLAY_DI6:              
            CJNE A,#06H,DISPLAY_DI7
            MOV  A,3BH;8255的输入数据
            JNB  ACC.6,DI006
            LCALL DISPLAY_OA
            LJMP  DISPLAY_DI_QUIT
          DI006:
            LCALL DISPLAY_OFF
            LJMP  DISPLAY_DI_QUIT
      DISPLAY_DI7:              
            MOV  A,3BH;8255的输入数据
            JNB  ACC.7,DI007
            LCALL DISPLAY_OA
            LJMP  DISPLAY_DI_QUIT
     DI007:
            LCALL DISPLAY_OFF
DISPLAY_DI_QUIT:
             RET 
;模拟量输入数据处理,把AI从0~4096压缩为0~100,用到中转寄存器4BH~4FH,考虑遇到中断的情况
PRO_AI:
              MOV  4FH,#070H
              MOV  R0,#80H;197所采集的数据
      PRO_DI_CYL:
              MOV  A,@R0   ;取出数据
              MOV  R3,A
              INC  R0
              MOV  A,@R0
              MOV  R2,A
              MOV  R6,#00H  ;乘以100
              MOV  R7,#64H
              LCALL MULD
              MOV  4BH,R2
              MOV  4CH,R3
              MOV  4DH,R4
              MOV  4EH,R5
              MOV  R2,4BH
              MOV  R3,4CH
              MOV  R4,4DH
              MOV  R5,4EH
              MOV  R6,#0FH   ;除以4095
              MOV  R7,#0FFH
              LCALL DIVD
              MOV  R1,4FH
              MOV   A,R3
              MOV   @R1,A   ;存放地位商
              INC   R0
              INC   4FH
              MOV   A,4FH
              CJNE  A,#078H,PRO_DI_CYL  
              RET
;标号:MULD   功能: 双字节二进制无符号数乘法
;入口:被乘数R2R3,乘数R6R7,出口:乘积在R2R3R4R5
;影响资源:PSW ,A,B.,,R2~R7,,,,,堆栈需求R6R7
MULD:
               MOV   A,R3;计算R3*R7
               MOV   B,R7
               MUL   AB
               MOV   R4,B;暂存部分积
               MOV   R5,A
               MOV   A,R3;R3*R6
               MOV   B,R6
               MUL   AB
               ADD   A,R4
               MOV   R4,A
               CLR   A
               ADDC  A,B
               MOV   R3,A
               MOV   A,R2
               MOV   B,R7
               MUL   AB
               ADD   A,R4;累加部分积
               MOV   R4,A
               MOV   A,R3
               ADDC  A,B
               MOV   R3,A
               CLR   A
               RLC   A;?把进位标志C 移进来
               XCH   A,R2;R2*R6
               MOV   B,R6
               MUL   AB
               ADD   A,R3;累加部分积
               MOV   R3,A
               MOV   A,R2
               ADDC  A,B
               MOV   R2,A
               RET
;DIVD功能:双字节二进制无符号数除法
;入口条件:被除数在R2,R3,R4,R5中,除数在R6.R7中,R2,R6高位
;出口:OV=0时,双字节商R2,R3中,OV=1时溢出。
;影响资源 PSW,A,B,R1-R7,堆栈需求2字节
DIVD:
               CLR  C  ;比较除数和被除数
               MOV  A,R3
               SUBB A,R7
               MOV  A,R2
               SUBB A,R6
               JC   DIVD1
               SETB OV   ;溢出
               RET
DIVD1:
               MOV  B,#10H ;计算双字节的商
DIVD2:
               CLR  C  ;部分商和余数同时左移一位
               MOV  A,R5
               RLC  A
               MOV  R5,A
               MOV  A,R4
               RLC  A
               MOV  R4,A
               MOV  A,R3
               RLC  A
               MOV  R3,A
               XCH  A,R2
               RLC  A
               XCH  A,R2
               MOV  F0,C   ;保存溢出位
               CLR  C
               SUBB A,R7    ;计算(R2R3-R6R7)
               MOV  R1,A
               MOV  A,R2
               SUBB A,R6
               ANL  C,/F0;结果判断
               JC   DVD3
               MOV  R2,A ;够减,存放新的余数
               MOV  A,R1
               MOV  R3,A
               INC  R5     ;商的低位置1
DVD3:
               DJNZ  B,DIVD2  ;计算完16位商(R4R5)
               MOV   A,R4    ;将商移到R2R3中
               MOV   R2,A
               MOV   A,R5
               MOV   R3,A
               CLR   OV      ;设立成功标志
               RET                                      
 END                

⌨️ 快捷键说明

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