📄 单相带液晶显示电子表原程序.asm
字号:
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 + -