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

📄 单相带液晶显示电子表原程序.asm

📁 单相电子式液晶电能表源程序已经是成熟产品的程序。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
       MOV R0,#40H
       MOV A,@R0
DUSJ3: INC R0
       ADD A,@R0
       DJNZ R2,DUSJ3
       MOV  50H,A
       MOV 51H,#16H
       MOV R2,#12H        ; 发送数据
       MOV R0,#40H
       CLR  P3.3
       NOP
       NOP
       LCALL  FASON
       NOP
       NOP
       SETB  P3.3
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;地址正确存储应答
DZYD:  MOV  40H,#68H
       MOV  MTRD,#41H
       MOV  SUBAH,#00H
       MOV  SUBAL,#10H
       MOV  NUMBYTE ,#06H
       LCALL READE
       JNB  ACK,DZYD
       CLR  ACK
       MOV  47H,#68H
       MOV  48H,#81H
       MOV  49H,#08H
       MOV  4AH,#32H
       MOV  4BH,#0C0H
       MOV  A,41H
       ADD  A,#33H
       MOV  4CH,A
       MOV  A,42H
       ADD  A,#33H
       MOV  4DH,A
       MOV  A,43H
       ADD  A,#33H
       MOV  4EH,A
       MOV  A,44H
       ADD  A,#33H
       MOV  4FH,A
       MOV  A,45H
       ADD  A,#33H
       MOV  50H,A
       MOV  A,46H
       ADD  A,#33H
       MOV  51H,A
       MOV   A,4AH
       ADD   A,#33H
       MOV   4AH,A
       MOV   A,4BH
       ADD   A,#33H
       MOV   4BH,A
       MOV R2,#11H        ; 校验和        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
       MOV R0,#40H
       MOV A,@R0
WAIT3: INC R0
       ADD A,@R0
       DJNZ R2,WAIT3
       MOV  52H,A
       MOV  53H,#16H
       MOV  R0,#40H
       MOV  R2,#14H
       CLR  P3.3
       NOP
       NOP
       LCALL FASON
       NOP
       NOP
       SETB P3.3
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;发送数据子程序
FASON: CLR  ES
       MOV A,#0FEH         ; 发送前导数据
       LCALL TXDD
       LCALL TXDD
       LCALL TXDD
       LCALL TXDD
WAIT4: MOV A,@R0           ;依次发送数据
       INC R0
       LCALL TXDD
       DJNZ R2,WAIT4
       RET
TXDD:  CLR TI
       MOV  C,P
       MOV  TB8,C
       MOV SBUF,A
TXD1:  JNB TI,TXD1
       CLR TI
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;地址判断子程序
PDDZ:   MOV  A,23H
        CJNE A,#99H,PDDZ1
        MOV  A,24H
        CJNE A,#99H,PDDZ1
        MOV  A,25H
        CJNE A,#99H,PDDZ1
        MOV  A,26H
        CJNE A,#99H,PDDZ1
        MOV  A,27H
        CJNE A,#99H,PDDZ1
        MOV  A,28H
        CJNE A,#99H,PDDZ1
        JB  P3.5,PDDZD
        SETB TRUE            ;广播命令置表地址标志
        JMP PDDZD
PDDZ1:  MOV MTRD,#41H
        MOV SUBAH,#00H      ;从存储器中读出的表地址放在41--46
        MOV SUBAL,#10H
        MOV NUMBYTE,#06H
        LCALL READE
        JNB ACK,PDDZ1
        CLR ACK
        MOV A,23H           ;判断是否为本机地址
        CJNE A,41H,PDDZD
        MOV A,24H
        CJNE A,42H,PDDZD
        MOV A,25H
        CJNE A,43H,PDDZD
        MOV A,26H
        CJNE A,44H,PDDZD
        MOV A,27H
        CJNE A,45H,PDDZD
        MOV A,28H
        CJNE A,46H,PDDZD
        SETB ADDRE           ;如果是本机地址置一
PDDZD:  RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;数据存储子程序
DATSAV:  MOV  MTRD,#37H
         MOV  SUBAH,#00H
         MOV  SUBAL,#0BH
         MOV  NUMBYTE,#04H
         LCALL READE
         JNB  ACK,DATSAV
         CLR  ACK           ;
DATSAV1: MOV   MTRD,#54H
         MOV   SUBAH,#00H
         MOV   SUBAL,#0BH
         MOV   NUMBYTE,#04H
         LCALL  READE
         JNB   ACK,DATSAV1
         CLR   ACK
         MOV   A,54H
         CJNE  A,37H,DATSAV
         MOV   A,55H
         CJNE  A,38H,DATSAV
         MOV   A,56H
         CJNE  A,39H,DATSAV
         MOV   A,57H
         CJNE  A,3AH,DATSAV
DATS1:   CLR   C
         MOV   A,37H
         ADDC  A,#01H
         DA   A
         MOV  37H,A
         CJNE  A,#00H,DATS2
         CLR   C
         MOV   A,38H
         ADDC  A,#01H
         DA    A
         MOV   38H,A
         CJNE  A,#00H,DATS2
         CLR    C
         MOV    A,39H
         ADDC   A,#01H
         DA     A
         MOV   39H,A
         CJNE  A,#00H,DATS2
         INC   3AH
         MOV   A,3AH
         CJNE  A,#0AH,DATS2
         MOV   3AH,#00H
DATS2:   MOV  MTRD,#37H
         MOV  SUBAH,#00H
         MOV  SUBAL,#0BH
         MOV  NUMBYTE,#04H
         LCALL WRITE
DATS3:   MOV  MTRD,#54H         ;
         MOV  SUBAH,#00H
         MOV  SUBAL,#0BH
         MOV NUMBYTE,#04H
         LCALL READE
         JNB  ACK,DATS3
         CLR  ACK
         MOV  A,54H
         CJNE A,37H,DATS2
         MOV  A,55H
         CJNE  A,38H,DATS2
         MOV  A,56H
         CJNE  A,39H,DATS2
         MOV  A,57H
         CJNE  A,3AH,DATS2
         RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;掉电保护
DIODIA: PUSH DPL
        PUSH DPH
DIAO1: MOV  MTRD,#34H
       MOV  SUBAH,#00H
       MOV  SUBAL,#03H
       MOV  NUMBYTE,#01H
       LCALL WRITE
;DIAO2: MOV  MTRD,#36H         ;34单元中存储脉冲个数
       ;MOV  SUBAH,#00H
      ; MOV  SUBAL,#08H
       ;MOV NUMBYTE,#01H
       ;LCALL READE
      ; JNB  ACK,DIAO2
      ; CLR  ACK
       ;MOV  A,36H
      ; CJNE  A,34H,DIAO1
       LCALL  MS1
       POP   DPH
       POP   DPL
       RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;向存储器写数据程序
;每发送八位后就检查应答位
WRITE: CLR   P1.6         ;片选信号
       NOP
       PUSH  PSW
       SETB   PSW.4
       CLR    PSW.3
       MOV   A,NUMBYTE
       MOV   R3,A
       LCALL   START
       MOV   A,SUBAH       ;控制信号
       RLC   A
       ANL   A,#0EH
       ORL   A,#0A0H
       LCALL   WRBYTE
       LCALL   CACK
       JNB   ACK,RETWR
       MOV   A,SUBAL
       LCALL   WRBYTE
       LCALL   CACK
       JNB   ACK,RETWR
       MOV   R1,MTRD
WRDA:  MOV   A,@R1          ;发送字节
       LCALL   WRBYTE
       LCALL   CACK
       JB    ACK,JXWR
       LCALL   STOPE
       JMP   WRITE
JXWR:  INC   R1
       DJNZ  R3,WRDA
RETWR: LCALL   STOPE
       POP   PSW
       SETB  P1.6
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;发送字节子命令
WRBYTE:MOV   R0,#08H
WLP:   RLC   A
       JC    WR1
       SJMP  WR0
WLP1:  DJNZ  R0,WLP
       NOP
       RET
WR1:   SETB  P1.4
       SETB  P1.5
       CLR   P1.5
       SJMP  WLP1
WR0:   CLR   P1.4
       SETB  P1.5
       CLR   P1.5
       SJMP  WLP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;检查应答位子程序
;ACK为1表示有应答
CACK:  SETB  P1.4
       SETB  P1.5
       CLR   ACK
       MOV   C,P1.4
       JC    CEND
       SETB  ACK
CEND:  CLR   P1.5
       NOP
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;启动总线子程序
START: SETB  P1.4
       NOP
       SETB  P1.5
       NOP
DB 0,0,0,0,0
       NOP
       CLR   P1.4
       NOP
DB 0,0,0,0,0
       NOP
       CLR   P1.5
       NOP
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;结束总线子程序
STOPE:  CLR   P1.4
;      NOP
       SETB  P1.5
;      NOP
;DB 0,0,0,0,0,0,0
       ;NOP
       SETB  P1.4
       NOP
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;从存储器中读出数据
READE: CLR   P1.6           ; 片选信号
       PUSH  PSW
       SETB  PSW.4
       SETB  PSW.3
       MOV   R3,NUMBYTE
       LCALL START
       MOV   A,SUBAH        ; 控制信号
       CLR   C
       RLC   A
       ANL   A,#0FH
       ORL   A,#0A0H
       LCALL WRBYTE
       LCALL CACK
       JNB   ACK,RETRE
       MOV   A,SUBAL         ; 读数地址
       LCALL WRBYTE
       LCALL CACK
       LCALL START
       MOV   A,#0A0H
       INC   A               ;控制信号
       LCALL WRBYTE
       LCALL CACK
       JB    ACK,JXRE
       LCALL STOPE
       JMP   READE
JXRE:  MOV   R1,MTRD          ; 开始读数
RDN1:  LCALL RDBYTE
       MOV   @R1,A
       DJNZ  R3,SACK
RETS:  CLR   P1.5
       LCALL MNACK
RETRE: JNB   P1.4,RETS
       ;LCALL STOPE
       POP   PSW
       SETB  P1.6
       RET
SACK:  LCALL MACK            ; 循环读取
       INC  R1
      SJMP  RDN1
MACK:  CLR   P1.4            ; 发送应答信号子程序
       SETB  P1.5
       CLR   P1.5
       NOP
       NOP
       RET
MNACK: SETB  P1.4             ;发送非应答信号子程序
       SETB  P1.5
       NOP
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;读取字节子程序
RDBYTE:MOV    R0,#08H
RLP:   SETB   P1.4
       SETB   P1.5
       MOV    C,P1.4
       MOV    A,R2
       CLR    P1.5
       RLC    A
       MOV    R2,A
       DJNZ   R0,RLP
       RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;调用延时程序
MS1:  ;MOV  R4,#01H
      MOV  R5,#38H
CC:   MOV  R6,#0FEH
BB:   MOV  R7,#0FEH
AA:   DJNZ R7,AA
      DJNZ R6,BB
      DJNZ R5,CC
      ;DJNZ R4,DD
      RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SEND1621COM:
            PUSH  A
            PUSH  LCDBITCNT
            ACALL INTI    ;启动1621
            MOV   LCDBITCNT,#04H
            MOV   A,#80H
            ACALL SENDB0         ;发送四个位
            MOV   A,LCDCOMMAND   ;发送命令字
            ACALL SEND1621BYTE   ;发送一个字节
            SETB  WRITE1
            SETB  CS
            SETB  SDATA1
            POP   LCDBITCNT
            POP   A
            RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SENDB0:     PUSH  A
            PUSH  PSW
            PUSH  LCDBITCNT
SENDB01:    RLC   A
            MOV   SDATA1,C
            SETB  WRITE1
            NOP
            NOP
            CLR   WRITE1
            NOP
            NOP
            DJNZ  LCDBITCNT,SENDB01
            POP   LCDBITCNT
            POP   PSW
            POP   A
            RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SEND1621BYTE: PUSH  LCDBITCNT
              MOV   LCDBITCNT,#08H   ;显示8个字节数
              ACALL SENDB0
              POP   LCDBITCNT
              RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BRUSHLCD:    PUSH   LCDBYTECNT
             PUSH   LCDADR
             MOV    LCDBYTECNT,#06H     ;发送6个数字
             MOV    LCDADR,#DISBUFF
DISPLAY0:    LCALL  SEND1621DATA
             POP    LCDADR
             POP    LCDBYTECNT
             RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SEND1621DATA: PUSH     A
              PUSH     LCDBITCNT
              PUSH     LCDBYTECNT
              PUSH     LCDADR
              ACALL    INTI
              MOV      LCDBITCNT,#01H
              MOV      A,#80H
              ACALL    SENDB0
              MOV      A,#40H       ;
              ACALL    SEND1621BYTE
              MOV      R1,LCDADR
SENDNEXT1:    MOV      A,@R1
              ACALL    SEND1621BYTE
              INC      R1
              DJNZ     LCDBYTECNT,SENDNEXT1
              SETB     WRITE1
              SETB     CS
              SETB     SDATA1
              POP      LCDADR
              POP      LCDBYTECNT
              POP      LCDBITCNT
              POP      A
              RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTI:      CLR     CS
           SETB    WRITE1
           NOP
           CLR     WRITE1
           NOP
           RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;掉电模式
HT1621DOWN: PUSH    LCDCOMMAND
            MOV     LCDCOMMAND,#SYSDIS
            ACALL   SEND1621COM
            POP     LCDCOMMAND
            RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SJZH:  PUSH  A
       MOV  DPTR,#LIST
       MOV  A,37H
       ANL  A,#0FH
       MOVC A,@A+DPTR
       MOV  5AH,A
       MOV  A,37H
       SWAP  A
       ANL  A,#0FH
       MOVC A,@A+DPTR
       MOV  5BH,A
       MOV  A,38H
       ANL  A,#0FH
       MOVC  A,@A+DPTR
       MOV  5CH,A
       MOV  A,38H
       SWAP A
       ANL  A,#0FH
       MOVC  A,@A+DPTR
       MOV  5DH,A
       MOV  A,39H
       ANL  A,#0FH
       MOVC  A,@A+DPTR
       MOV  5EH,A
       MOV  A,39H
       SWAP  A
       ANL  A,#0FH
       MOVC  A,@A+DPTR
       MOV  5FH,A
       MOV  A,5FH
       CJNE A,#0EBH,YEJ1
       MOV  5FH,#00H
       MOV  A,5EH
       CJNE A,#0EBH,YEJ1
       MOV  5EH,#00H
       MOV  A,5DH
       CJNE A,#0EBH,YEJ1
       MOV  5DH,#00H
       MOV  A,5CH
       CJNE A,#0EBH,YEJ1
       MOV  5CH,#00H
YEJ1:  ORL  5CH,#10H
       POP  A
       RET
LIST:  DB 0EBH,60H,0C7H,0E5H,6CH,0ADH,0AFH,0E0H,0EFH,0EDH
       END


⌨️ 快捷键说明

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