📄 pcf8591-da-lcd1602-asm.asm
字号:
DEL4:
MOV R6,#200
DEL5:
MOV R7,#250
DJNZ R7,$
DJNZ R6,DEL5
RET
;==========================================================
;延时100MS =
;==========================================================
DELAY:
MOV R6,#200
DEL6:
MOV R7,#250
DJNZ R7,$
DJNZ R6,DEL6
RET
;==========================================================
;D/A 转换子程序
;R1 D/A转换数据指针,初值为DA_DATA。
;R2 存放D/A转换数据个数。
;==========================================================
PCF_DA:
NOP
LCALL STR ;启动I2C总线
MOV A,#90H ;写PCF8591 A/D 寻址字
LCALL WR0
LCALL CHEK
JB F0,PCF_DA
MOV A,#DACOM ;PCF8591 D/A的控制命令(40H)
LCALL WR0
LCALL CHEK
JB F0,PCF_DA
RET
PCF_DA1:
MOV A,@R1
LCALL WR0
LCALL CHEK
JB F0,PCF_DA1
;LCALL STOP
RET
;=========================================================
;程序功能:正弦信号发生
;出口:从D/A通道输出正弦电压信号
;=========================================================
SINE:
MOV B,#00H
ACALL PCF_DA
SIN1:
JNB K4,SIN_END ;退出
MOV A,B
MOV DPTR,#SIN_TAB
MOVC A,@A+DPTR
MOV @R1,A
ACALL PCF_DA1 ;DA转换
INC B
AJMP SIN1
SIN_END:
LCALL STOP
SETB 20H.1
LCALL BEEP_BL
RET
;---------------------------------------------------------
SIN_TAB:
DB 80H,83H,86H,89H,8DH,90H,93H,96H,99H,9CH,9FH,0A2H,0A5H,0A8H,0ABH,0AEH
DB 0B1H,0B4H,0B7H,0BAH,0BCH,0BFH,0C2H,0C5H,0C7H,0CAH,0CCH,0CFH,0D1H,0D4H,0D6H,0D8H
DB 0DAH,0DDH,0DFH,0E1H,0E3H,0E5H,0E7H,0E9H,0EAH,0ECH,0EEH,0EFH,0F1H,0F2H,0F4H,0F5H
DB 0F6H,0F7H,0F8H,0F9H,0FAH,0FBH,0FCH,0FDH,0FDH,0FEH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FEH,0FDH,0FDH,0FCH,0FBH,0FAH,0F9H,0F8H,0F7H,0F6H
DB 0F5H,0F4H,0F2H,0F1H,0EFH,0EEH,0ECH,0EAH,0E9H,0E7H,0E5H,0E3H,0E1H,0DFH,0DDH,0DAH
DB 0D8H,0D6H,0D4H,0D1H,0CFH,0CCH,0CAH,0C7H,0C5H,0C2H,0BFH,0BCH,0BAH,0B7H,0B4H,0B1H
DB 0AEH,0ABH,0A8H,0A5H,0A2H,9FH,9CH,99H,96H,93H,90H,8DH,89H,86H,83H,80H
DB 80H,7CH,79H,76H,72H,6FH,6CH,69H,66H,63H,60H,5DH,5AH,57H,55H,51H
DB 4EH,4CH,48H,45H,43H,40H,3DH,3AH,38H,35H,33H,30H,2EH,2BH,29H,27H
DB 25H,22H,20H,1EH,1CH,1AH,18H,16H,15H,13H,11H,10H,0EH,0DH,0BH,0AH
DB 09H,08H,07H,06H,05H,04H,03H,02H,02H,01H,00H,00H,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,01H,02H,02H,03H,04H,05H,06H,07H,08H,09H
DB 0AH,0BH,0DH,0EH,10H,11H,13H,15H,16H,18H,1AH,1CH,1EH,20H,22H,25H
DB 27H,29H,2BH,2EH,30H,33H,35H,38H,3AH,3DH,40H,43H,45H,48H,4CH,4EH
DB 51H,55H,57H,5AH,5DH,60H,63H,66H,69H,6CH,6FH,72H,76H,79H,7CH,7EH
;==========================================================
;DAC输出方波子程序:用示波器观察输出的信号。
;==========================================================
Square:
MOV A,#00H
MOV B,A
LCALL PCF_DA ;启动DA转换
SQU1:
JNB K4,SQU2 ;退出
MOV @R1,A
LCALL PCF_DA1 ;DA转换
LCALL DELAY
MOV A,B
CPL A
MOV B,A
AJMP SQU1
SQU2:
LCALL STOP
SETB 20H.1
LCALL BEEP_BL
RET
;===================================================
;DAC输出三角波子程序
;单片机从数字量0开始,逐次加1直到255,然后从输出
;255逐次减1直至为0,即可输出连续三角波。
;===================================================
Triangle:
MOV A,#00H
MOV B,A
LCALL PCF_DA ;启动DA转换
SJ_UP:
MOV @R1,A
LCALL PCF_DA1 ;启动DA转换
JNB K4,SJ_END
INC B ;上升沿
MOV A,B
CJNE A,#0FFH,SJ_UP
SJ_DOWN:
MOV @R1,A
LCALL PCF_DA1 ;启动DA转换
JNB K4,SJ_END
DEC B ;下降沿
MOV A,B
CJNE A,#00H,SJ_DOWN
AJMP SJ_UP ;连续输出波型
SJ_END:
LCALL STOP
SETB 20H.1
LCALL BEEP_BL
RET
;=========================================================
;DAC输出梯形波
;单片机从数字量0开始,逐次加1直到255,保持255次,
;然后从输出255逐次减1直至为0,如此重复,即可输出连续梯形波。
;=========================================================
Echelon:
MOV A,#00H
MOV B,A
LCALL PCF_DA ;启动DA转换
TX_UP:
MOV @R1,A
LCALL PCF_DA1 ;DA转换
INC B ;上升沿
MOV A,B
CJNE A,#0FFH,TX_UP
MOV R4,#0FFH
TX_BEEP:
JNB K4,TX_END
MOV A,B
MOV @R1,A ;保持高电平
LCALL PCF_DA1 ;DA转换
DJNZ R4,TX_BEEP
MOV A,B
TX_DOWN:
MOV @R1,A
LCALL PCF_DA1 ;DA转换
DEC B ;下降沿
MOV A,B
CJNE A,#00H,TX_DOWN
AJMP TX_UP
TX_END:
LCALL STOP
SETB 20H.1
LCALL BEEP_BL
RET
;====================================================
;DAC输出锯齿波子程序:用示波器观察输出的信号。
;====================================================
Sawtooth:
MOV A,#0
MOV B,A
LCALL PCF_DA ;启动DA转换
JUCHI1:
JNB K4,JUCHI_END
MOV @R1,A
LCALL PCF_DA1 ;DA转换
MOV A,B
INC B
AJMP JUCHI1
JUCHI_END:
LCALL STOP
SETB 20H.1
LCALL BEEP_BL
RET
;**************************************************
;* 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
CLR SDA
NOP
NOP
NOP
CLR SCL
NOP
NOP
RET
;======================================================
;接收一个字节子程序
;======================================================
RD0:
MOV R3,#08H
SS0:
SETB SDA ;置P1.3为输入
NOP
NOP
SETB SCL ;时钟线为高,接收数据位。
NOP
NOP
;MOV A,P1 ;读取数据位
;JNB ACC.3,SS1
MOV C,SDA
JNC 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.3为输入
NOP
NOP
SETB SCL
CLR F0
NOP
NOP
MOV C,SDA
JNC 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 + -