📄 fil1256高频头程序.asm
字号:
MOV LCD_DB4,C
CLR E
RET
NOP
NOP
AJMP STAR
NOP
NOP
;*********************************
;读数据寄存器字节子程序
;READS: ACALL READBF
; MOV CKOU,#255
; SETB RS
; SETB RW
; ACALL DELAYLCD
; SETB E
; ACALL DELAYLCD
; MOV SHUJU,DKOU
; ACALL DELAYLCD
; CLR RW
; CLR E
; MOV CKOU,#255
;***********************************
;以上为LCD各个子程序程序应用部分
;***********************************
;**************************************
;以下为写各个控制数据到写高频头的程序
;***************************************
WRITE_TURN: ACALL START
;-------------------------
MOV A,ADBW ;发送地址信息
ACALL SENDDATE
ACALL ASKW
;-------------------------
MOV A,DB1 ;数据
ACALL SENDDATE
ACALL ASKW
;-------------------------
MOV A,DB2
ACALL SENDDATE
ACALL ASKW
;------------------------
MOV A,CB ;控制
ACALL SENDDATE
ACALL ASKW
;-------------------------
MOV A,PB ;端口
ACALL SENDDATE
ACALL ASKW
;-------------------------
ACALL STOP
RET
NOP
NOP
AJMP STAR
NOP
NOP
;************************************
;以上为写各个控制数据到写高频头的程序
;************************************
;以下为从高频头读数据到R_DATA的程序
;************************************
READ_TURN:
ACALL START
MOV A,ADBW
SETB ACC.0
ACALL SENDDATE
NOP
ACALL ASKW
NOP
;-----------------------------------
ACALL RECEIVEDATE
MOV R_DATA,A
ACALL NOASK
ACALL STOP
RET
NOP
NOP
AJMP STAR
NOP
NOP
;**************************************
;以上为从高频头读数据到R_DATA的程序
;**************************************
;**************************************
;以下为I2C总线的各个控制信号
;**************************************
;写存储器时等待ASK信号
ASKW: ACALL DELAY
SETB SDA ;释放SDA总线
ACALL DELAY
SETB SCL
WAITASKW: MOV C,SDA
JC WAITASKw
CLR SCL
CLR SDA
RET
NOP
NOP
AJMP STAR
NOP
NOP
;**********************************
;MCU作为从器件不应答
NOASK: SETB SDA
SETB SCL
ACALL DELAY
CLR SCL
ACALL DELAY
CLR SDA
RET
NOP
NOP
AJMP STAR
NOP
NOP
;-----------------------------------
; 启动信号
START: SETB SCL
SETB SDA
ACALL DELAY
CLR SDA
ACALL DELAY
CLR SCL
RET
NOP
NOP
AJMP STAR
NOP
NOP
;---------------------------
; 停止信号
STOP: CLR SCL
CLR SDA
ACALL DELAY
SETB SCL
ACALL DELAY
SETB SDA
ACALL DELAY
RET
NOP
NOP
AJMP STAR
NOP
NOP
;---------------------------------
;MCU从存储器(从器件)读数据字节时产生ASK信号
ASKR: ACALL DELAY
CLR SCL
ACALL DELAY
CLR SDA
ACALL DELAY
SETB SCL
ACALL DELAY
CLR SCL
ACALL DELAY
SETB SDA
ACALL DELAY
RET
NOP
NOP
AJMP STAR
NOP
NOP
;-----------------------------
;送数据到总线上,A作为移位输出寄存器
SENDDATE: MOV R2,#8
LOOPW: RLC A
MOV SDA,C
ACALL DELAY
SETB SCL
ACALL DELAY
CLR SCL
ACALL DELAY
DJNZ R2,LOOPW
CLR SDA
RET
NOP
NOP
AJMP STAR
NOP
NOP
;--------------------------------
;从总线上接收数据,A作为移位入寄存器
RECEIVEDATE: MOV R2,#0
SETB SDA
LOOPR: RL A
ACALL DELAY
SETB SCL
ACALL DELAY
MOV C,SDA
MOV ACC.0,C
ACALL DELAY
CLR SCL
ACALL DELAY
INC R2
CJNE R2,#8,LOOPR
RET
NOP
NOP
AJMP STAR
NOP
NOP
;--------------------------------
DELAY: NOP
NOP
NOP
NOP
RET
NOP
NOP
AJMP STAR
NOP
NOP
;***********************************
;以上为I2C总线的各个控制信号
;************************************
;上电延迟
DELAY_STAR:
MOV R0,#0FFH
DELAY_STAR1: MOV R1,#0FFH
DJNZ R1,$
DJNZ R0,DELAY_STAR1
;CPL PLOCK_LED
RET
NOP
NOP
AJMP STAR
NOP
NOP
;功能:单字节压缩BCD码整数转换成单字节十六进制整数
;入口条件:待转换的单字节BCD码整数在累加器 A 中。
;出口信息:转换后的单字节十六进制整数仍在累加器 A 中。
;影响资源: PSW 、 A 、 B 堆栈需求: 2字节
;--------------------------------
BCDH: PUSH TMP0
MOV B,#10H ;分离十位和个位
DIV AB
MOV TMP0,B ;暂存个位
MOV B,#10 ;将十位转换成十六进制
MUL AB
ADD A,TMP0 ;按十六进制加上个位
POP TMP0
RET
;功能:将显示数据除以8再显示
;--------------------------------
DIV_8: MOV R0,#(DISSHIWAN+1) ;显示的数据
MOV R1,#(TMP0-1) ;结果
MOV B,#0
;--------------------------------
DIV_8_3: DEC R0
INC R1
MOV A,B
SWAP A
ORL A,@R0
CALL BCDH
MOV B,#8
DIV AB
MOV @R1,A ;10M位压入堆栈
CJNE R1,#TMP5,DIV_8_3
;--------------------------------
MOV A,B
SWAP A
ORL A,#0
CALL BCDH
MOV B,#8
DIV AB
MOV TMP6,A ;0.1K位压入堆栈
;--------------------------------
MOV A,B
SWAP A
ORL A,#0
CALL BCDH
MOV B,#8
DIV AB
MOV TMP7,A ;0.01K位压入堆栈
DIV_8_DISLCD1: MOV ZLING,#84H ;第一行显示除以8的结果,#0c6(16*2 ;显示键盘输入频率值
ACALL WRTC
;-------------------------------------
MOV R0,#(TMP0-1)
DIV_8_2:
INC R0
MOV A,@R0 ;显示100M位
MOV DPTR,#ADDR_LCD
MOVC A,@A+DPTR
MOV SHUJU,A
ACALL WRTS
MOV A,R0
CJNE A,#(TMP0+2),DIV_8_1
MOV SHUJU,#00101110B ;显示小数点
ACALL WRTS
DIV_8_1:
CJNE A,#(TMP0+7),DIV_8_2
;-------------------------------------
MOV SHUJU,#01001101B ;显示M
ACALL WRTS
;--------------------------------------
MOV SHUJU,#01001000B ;显示H
ACALL WRTS
;--------------------------------------
MOV SHUJU,#01111010B ;显示z
ACALL WRTS
RET
NOP
NOP
AJMP STAR
NOP
NOP
;标号: MULD 功能:单字节乘双字节二进制无符号数乘法
;入口条件:被乘数在 TMP3 (LSB)中,乘数在 TMP6 (MSB)、 TMP7 (LSB)中。
;出口信息:乘积在 TMP3 、 TMP6 、 TMP7 中。 TMP3高位
;影响资源: PSW 、 A 、 B 、 TMP3 TMP6 TMP7 堆栈需求: 2字节
MULD: PUSH TMP4
PUSH TMP5
;--------------------------------
MOV A,TMP3 ;计算 TMP3 乘 TMP7
MOV B,TMP7
MUL AB
MOV TMP4,B ;TMP3*TMP7高位送TMP4
MOV TMP5,A ;TMP3*TMP7低位送TMP5
;--------------------------------
MOV A,TMP3 ;计算 TMP3 乘 TMP6
MOV B,TMP6
MUL AB
;--------------------------------
ADD A,TMP4 ;累加部分积
MOV TMP4,A
CLR A
;--------------------------------
ADDC A,B
MOV TMP3,A ;TMP3*TMP7=TMP3,TMP4,TMP5
MOV TMP6,TMP4
MOV TMP7,TMP5
;--------------------------------
POP TMP5
POP TMP4
RET
NOP
NOP
AJMP STAR
NOP
NOP
;24c16资料,2K字节 E2PROM
; ********** **********
; * *** *
; NC A0 ** 1 8 ** VCC NC
; * *
; NC A1 ** 2 7 ** WP 悬空或接地,正常读写
; * *
; input A2 ** 3 6 ** SCL X1
; * *
; reset VSS ** 4 5 ** SDA X0
; * 24C16 *
; ***********************
;器件寻址:1 0 1 0 A2 A1 A0 R/W(LSB)
M24C16_ADRH EQU 0A1H ;A10--A8=0,R/W=0
M24C16_ADRL EQU 00H ;DATE START IN 00H
;READ 24C16
R24C16:
LCALL START
;--------------------------------
MOV A,#M24C16_ADRH
CLR ACC.0 ;WRITE DATE
ACALL SENDDATE
ACALL ASKW ;
;--------------------------------
MOV A,#M24C16_ADRL
ACALL SENDDATE
ACALL ASKW
;--------------------------------
ACALL START
;--------------------------------
MOV A,#M24C16_ADRH
SETB ACC.0 ;READ DATE
ACALL SENDDATE
ACALL ASKW
;--------------------------------
ACALL RECEIVEDATE
PUSH ACC
;ANL A,#0F0H
JNZ INT_24C16
POP DISGE
;MOV DISGE,A ;GE WEI
ACALL ASKR;;;;;;;;;;;;;;;;;;;;;
;--------------------------------
ACALL RECEIVEDATE
PUSH ACC
ANL A,#0F0H
JNZ INT_24C16
POP DISSHI
;MOV DISSHI,A ;SHI WEI
ACALL ASKR
;--------------------------------
ACALL RECEIVEDATE
PUSH ACC
ANL A,#0F0H
JNZ INT_24C16
POP DISBAI
;MOV DISBAI,A ;百位
ACALL ASKR
;--------------------------------
ACALL RECEIVEDATE
PUSH ACC
ANL A,#0F0H
JNZ INT_24C16
POP DISQIAN
;MOV DISQIAN,A ;千位
ACALL ASKR
;--------------------------------
ACALL RECEIVEDATE
PUSH ACC
ANL A,#0F0H
JNZ INT_24C16
POP DISWAN
;MOV DISWAN,A ;万位
ACALL ASKR
;--------------------------------
ACALL RECEIVEDATE
PUSH ACC
ANL A,#0F0H
JNZ INT_24C16
POP DISSHIWAN
;MOV DISSHIWAN,A ;十万位
ACALL ASKR
;--------------------------------
ACALL RECEIVEDATE
PUSH ACC
ANL A,#0F8H
JNZ INT_24C16
POP STEP
;MOV STEP,A ;步进
;--------------------------------
ACALL NOASK
;--------------------------------
ACALL STOP
RET
NOP
NOP
AJMP STAR
NOP
NOP
;24C16的初始化,只要检测到数据的高四位不为零立刻开始.
;---------------------------------------------------
INT_24C16:
MOV DISGE,#0
MOV DISSHI,#0
MOV DISBAI,#0
MOV DISQIAN,#3
MOV DISWAN,#3
MOV DISSHIWAN,#4
MOV STEP,#6
;---------------------------------------------------
ACALL W24C16
RET
NOP
NOP
AJMP STAR
NOP
NOP
;WRITE 24C16
;将DISGE---DISSHIWAN 写入00H-05H,STEP 写入06H
;---------------------------------------------------
W24C16:
ACALL START
MOV A,#M24C16_ADRH
CLR ACC.0 ;WRITE DATE
ACALL SENDDATE
;--------------------------------
ACALL ASKW ; 写低位地址
MOV A,#M24C16_ADRL
ACALL SENDDATE
;--------------------------------
ACALL ASKW ;GE WEI
MOV A,DISGE
ACALL SENDDATE
;--------------------------------
ACALL ASKW ;SHI WEI
MOV A,DISSHI
ACALL SENDDATE
;--------------------------------
ACALL ASKW ;BAI WEI
MOV A,DISBAI
ACALL SENDDATE
;--------------------------------
ACALL ASKW ;QIAN WEI
MOV A,DISQIAN
ACALL SENDDATE
;--------------------------------
ACALL ASKW ;WAN WEI
MOV A,DISWAN
ACALL SENDDATE
;--------------------------------
ACALL ASKW ;SHIWAN
MOV A,DISSHIWAN
ACALL SENDDATE
;--------------------------------
ACALL ASKW ;步进
MOV A,STEP
ACALL SENDDATE
ACALL ASKW
ACALL STOP
RET
;清看门够程序,高电平脉冲清除
CLRWDT:
CLR WDT
SETB WDT
LCALL DELAYLCD
LCALL DELAYLCD
CLR WDT
NOP
NOP
RET
NOP
NOP
AJMP STAR
NOP
NOP
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -