📄 pcf8591-lcd1602-4ch-xianshi.asm
字号:
;显示数据初址在AD_TEMP中
;255/51=5.00V 运算
;====================================================================
TUNBCD:
MOV A,AD_TEMP
MOV B,#51
DIV AB
MOV DISSTART+2,A ;整数个位数放入DISSTART+2
MOV A,B ;余数大于1AH,F0为0,乘法溢出,结果加5
CLR F0
SUBB A,#1AH ;相减不够,C=1 表示余数小于1AH(26)
MOV F0,C
MOV A,#10
MUL AB ;余数乘以10,相当于补0,继续除。
MOV B,#51
DIV AB ;再除以51
JB F0,T_BCD1
ADD A,#5
T_BCD1:
MOV DISSTART+1,A ;小数后第一位放入DISSTART+1
MOV A,B
CLR F0
SUBB A,#1AH
MOV F0,C
MOV A,#10
MUL AB
MOV B,#51
DIV AB
JB F0,T_BCD2
ADD A,#5
T_BCD2:
MOV DISSTART,A ;小数后第二位放入DISSTART
RET
;====================================================================
;蜂鸣器响一声子程序
;====================================================================
BEEP_BL:
MOV R6,#100
DEL1:
CALL DEL2
CPL BEEP
DJNZ R6,DEL1
RET
DEL2:
MOV R7,#180
DEL3:
NOP
DJNZ R7,DEL3
RET
;====================================================================
DELAY: ;延时100MS
MOV R6,#200
DEL4:
MOV R7,#250
DJNZ R7,$
DJNZ R6,DEL4
RET
;=====================================================
;PCF8591演示程序
;=====================================================
;=======================================================
;D/A 转换子程序
;R1 D/A转换数据指针,初值为50H。
;R2 存放D/A转换数据个数。
;========================================================
PCF_DA:
NOP
LCALL STR
MOV A,#90H ;写PCF8591 A/D 寻址字
LCALL WR0
LCALL CHEK
JB F0,PCF_DA
WRD1:
MOV A,#40H
MOV R1,#50H
WRD2:
LCALL WR0
LCALL CHEK
JB F0,PCF_DA
MOV A,@R1
INC R1
DJNZ R2,WRD2
LCALL STOP
RET
;=======================================================
;A/D 转换子程序
;R1 A/D转换数据指针,初值为60H。
;60H-63H 存放4路A/D转换值
;R2 存放A/D转换数据个数。
;=======================================================
PCF_AD:
NOP
LCALL STR
MOV A,#90H ;写PCF8591 A/D 寻址字
LCALL WR0
LCALL CHEK
JB F0,PCF_AD ;错误,重发。
MOV A,#04H ;A/D控制字
LCALL WR0
LCALL CHEK
JB F0,PCF_AD ;错误,重发。
PCF_AD1:
LCALL STR
MOV A,#91H ;读PCF8591 A/D 寻址字
LCALL WR0
LCALL CHEK
JB F0,PCF_AD1
MOV R1,#AD_DATA ;数据存储区首地址
; lcall rd0 ;空读一次,调整读顺序
;lcall yida
WRD3:
LCALL RD0
MOV @R1,A
DJNZ R2,WRD4
LCALL YIDAF
LCALL STOP
RET
WRD4:
LCALL YIDA
INC R1
LJMP WRD3
;**************************************************
;* IIC 总线驱动程序 *
;**************************************************
;==================================================
;总线启动子程序
;==================================================
STR:
NOP
SETB SDA
NOP
SETB SCL ;起始条件建立时间大于4.7us
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP ;起始条件锁定时间大于4.7us
NOP
NOP
NOP
NOP
CLR SCL ;钳住总线,准备发数据
NOP
RET
;==================================================
;发送一个字节子程序
;字节数据放入ACC
;==================================================
WR0:
NOP
MOV R3,#08H
CLR SCL
CLR C
LL0:
RLC A
JC LL1
LJMP LL2
LL4:
DJNZ R3,LL0
RET
LL1:
NOP
SETB SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
;CLR SDA
LJMP LL4
LL2:
NOP
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
LJMP LL4
;=======================================================
;发送应答信号子程序
;=======================================================
YIDA:
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;======================================================
;发送非应答信号子程序
;======================================================
YIDAF:
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;======================================================
;接收一个字节子程序
;======================================================
RD0:
MOV R3,#08H
SS0:
SETB SDA ;置P1.1为输入
NOP
NOP
SETB SCL ;时钟线为高,接收数据位。
NOP
NOP
MOV A,P1 ;读取数据位
JNB ACC.3,SS1
LJMP SS2
SS3:
DJNZ R3,SS0
CLR SDA
NOP
NOP
SETB SCL
RET
SS1:
NOP
CLR C
MOV A,R4
RLC A
MOV R4,A
CLR SCL
LJMP SS3
SS2:
SETB C
MOV A,R4
RLC A
MOV R4,A
CLR SCL
LJMP SS3
;==================================================
;应答位查询子程序
;==================================================
CHEK:
SETB SDA ;设P1.1为输入
NOP
NOP
SETB SCL
CLR F0
NOP
NOP
;MOV C,SDA
;JC GEND
MOV A,P1
JNB ACC.3,GEND
SETB F0
GEND:
NOP
CLR SCL
NOP
RET
;==================================================
;停止子程序
;==================================================
STOP:
NOP
CLR SDA
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
NOP
CLR SCL
RET
;==============================================================
END ;结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -