📄 ad_test.asm
字号:
;================================================
LIST P=16F873
INCLUDE "P16Fxxx.txt"
;=================== RAM 使用表 ==================
;*************** PUBLIC MEM *******************
MM0 EQU 20H
MM1 EQU MM0+1
MM2 EQU MM0+2
MM3 EQU MM0+3
AI1H EQU 24 ;新AD值高位、低位
AI1L EQU 25
AI2H EQU 26
AI2L EQU 27
count equ 28
TEMP equ 29
;*************** VARIABLE ********************
CH EQU 30H ;当前所在通道标志
CH_N EQU 31H ;AD通道总数
CHH0 EQU 32H
CHL0 EQU 33H
;-------------------------------------------------
ADD74_1 EQU B'01001000' ;74_1WRITE
ADD74_2 EQU B'01001001' ;74_1READ
ADD74_3 EQU B'01000000' ;74_1WRITE
ADD74_4 EQU B'01000001' ;74_1READ
ADD83_1 EQU B'01001000' ;83_1WRITE
ADD83_2 EQU B'01001001' ;83_1READ
ADD64_1 EQU B'01110000' ;64_1WRITE
ADD64_2 EQU B'01110001' ;64_1READ
;=================================================
;****************** START RESET ******************
ORG 00H
PWR GOTO RESET ;RESET 00H
ORG 04H
BANKSEL PIR1 ;选择外围接口中断标志寄存器体
BTFSC PIR1,SSPIF ;检测是否停止时序发送完
GOTO RTN
BCF STATUS,RP0
BTFSC PIR1,ADIF ;查AD中断标志 =1 ?
GOTO AD_INT
BCF INTCON,RBIF
BCF INTCON,INTF
RTN RETFIE
;================ AD_INT 中断处理 ===============
AD_INT BCF STATUS,RP0
BCF PIR1,ADIF ;清AD中断标志位
RETURN
;================================================
;***************** RESET 程序 *****************
;================================================
RESET NOP
CALL AD_INIT ;AD INTITAL
CALL I2C_INIT
GOTO AD_CHN ;CH_N ==> CH
;================================================
;******************* MAIN ***********************
MAIN NOP
;---------------------------------------------
DLY1 MOVLW 0FFH
MOVWF TEMP
LL2 NOP
NOP
NOP
DECFSZ TEMP,1
GOTO LL2
;---------------------------------------------
NOP
BANKSEL INTCON
BSF INTCON,GIE ;开总中断
BANKSEL ADCON0
BSF ADCON0,ADGO ;START AD
SLEEP
NOP
NOP
CLRF STATUS ; !!!
BANKSEL ADRESH ;ADH==>CHX
RRF ADRESH,1
BANKSEL ADRESL ;ADL==>CHX+1
RRF ADRESL,1
MOVLW CHH0 ;通过间接寻址保存A/D结果
MOVWF FSR
BANKSEL ADRESH
MOVF ADRESH,W
MOVWF INDF
INCF FSR
MOVF CHH0,W
MOVWF CHL0
CLRF CHH0
; The 16 bit binary number = FFFF
call AD_BCD ; After conversion the Decimal Number
; in MM0,MM1,MM2 = 06,55,35
BANKSEL ADRESL
SWAPF ADRESL,1
RRF ADRESL,1
MOVF ADRESL,W
BCF STATUS,RP0
MOVWF MM0
; CALL LAG_F ;LAG滤波处理
nop
;------------- CALL I2C_LED ---------------------------
BANKSEL INTCON
BCF INTCON,GIE ;
CALL ST_SEN ;START I2C
MOVLW ADD64_1 ;64 WRT ADD
CALL SEND
MOVLW 00H ;LED CON ADR
CALL SEND
MOVLW B'00010111' ;LED CON
CALL SEND
MOVF MM0,W
CALL CONVERT
CALL SEND
MOVF MM2,W ;LED DATA
ANDLW 0FH
CALL CONVERT
MOVWF TEMP
BSF TEMP,7 ;DT POINT
MOVF TEMP,W
CALL SEND
MOVF MM2,W
SWAPF MM2,0
ANDLW 0FH
CALL CONVERT
CALL SEND
MOVF MM1,W ;LED DATA
ANDLW 0FH
CALL CONVERT
CALL SEND
MOVF CHH0,W
SWAPF CHH0,0
ANDLW 0FH
CALL CONVERT
CALL SEND
CALL STOP
BANKSEL INTCON
BSF INTCON,GIE ;GIE
;---------------------------------------------
DLY MOVLW 0FFH
MOVWF TEMP
LL1 NOP
NOP
NOP
NOP
DECFSZ TEMP,1
GOTO LL1
NOP
;-----------------test---------------------
GOTO MAIN
;---------------------------------------------
AD_CHN MOVLW CH_N ;重新开始采样
MOVWF CH
BSF STATUS,RP0 ;允许AD中断
BSF PIE1,ADIE
GOTO MAIN
;==================================================
;****************** LED TAB 程序 *****************
CONVERT
ADDWF PCL,1
TABLE RETLW 3FH ;“0”的笔段码
RETLW 06H ;“1”的笔段码
RETLW 5BH ;“2”的笔段码
RETLW 4FH ;“3”的笔段码
RETLW 66H ;“4”的笔段码
RETLW 6DH ;“5”的笔段码
RETLW 7DH ;“6”的笔段码
RETLW 07H ;“7”的笔段码
RETLW 7FH ;“8”的笔段码
RETLW 6FH ;“9”的笔段码
RETLW 77H ;“A”的笔段码
RETLW 7CH ;“B”的笔段码
RETLW 39H ;“C”的笔段码
RETLW 5EH ;“d”的笔段码
RETLW 79H ;“E”的笔段码
RETLW 71H ;“F”的笔段码
RETLW 38H ;“L”的笔段码
RETLW 37H ;“n”的笔段码
RETLW 73H ; "P"的笔段码
RETLW 78H ;“t”的笔段码
RETLW 00H
;------------------------------------------------------
;================= AD结果 => BCD =================
AD_BCD bcf STATUS,0 ; clear the carry bit
movlw .16
movwf count
clrf MM0
clrf MM1
clrf MM2
loop16 rlf CHL0
rlf CHH0
rlf MM2
rlf MM1
rlf MM0
decfsz count
goto adjDEC
RETLW 0
adjDEC movlw MM2
movwf FSR
call adjBCD
movlw MM1
movwf FSR
call adjBCD
movlw MM0
movwf FSR
call adjBCD
;
goto loop16
;
adjBCD movlw 3
addwf 0,W
movwf TEMP
btfsc TEMP,3 ; test if result > 7
movwf 0
movlw 30
addwf 0,W
movwf TEMP
btfsc TEMP,7 ; test if result > 7
movwf 0 ; save as MSD
RETLW 0
;===========================================================
;********************* I2C SUB ************************
WR_TE
BANKSEL PIR1 ;选择外围接口中断标志寄存器体
BTFSS PIR1,SSPIF ;检测是否停止时序发送完
GOTO $ -1 ;循环检测,等待
BCF PIR1,SSPIF ;清除MSSP中断标志位
RETURN ;子程序返回
;========================================================================
ST_SEN
BANKSEL PIR1
BCF PIR1,SSPIF ;清除MSSP中断标志位
BANKSEL SSPCON2
BSF SSPCON2,SEN ;建立一个I2C总线启动信号时序
CALL WR_TE ;调用应答信号检测子
RETURN
;=======================================================================
SEND
BANKSEL SSPBUF ;W装载到发送缓冲区,同时
MOVWF SSPBUF ;开启一次字节发送操作过程
CALL WR_TE ;调用应答信号检测子
RETURN
;========================================================================
RECEIVE
BANKSEL SSPCON2
BSF SSPCON2,RCEN ;开启一次字节接受操作过程
CALL WR_TE
BANKSEL SSPBUF
MOVF SSPBUF,W ;接受缓冲器卸载给W
MOVWF MM5 ;W再转储到用户自备寄存器
CALL WR_TE ;调用应答信号检测子
RETURN
;==============================================================
STOP
BANKSEL SSPCON2
BSF SSPCON2,ACKDT ;把应答位预置为0(即非应答位)
BSF SSPCON2,ACKEN ;建立一个I应答信号时序
CALL WR_TE ;调用应答信号检测子
BANKSEL SSPCON2
BSF SSPCON2,PEN ;发停信?
CALL WR_TE ;调用应答信号检测子
RETURN ;子程
;----------------------------------------------------------
;===============================================================
;********************* AD 初始化程序 ************************
AD_INIT NOP
BCF STATUS,RP0
CLRF RA
MOVLW B'00101111' ;RB4=DO
BSF STATUS,RP0
MOVWF TRISA ;设置A端口
MOVLW B'10000001'
MOVWF TRISB ;设置B端口
MOVF RB,W
CLRF INTCON
MOVLW B'11000001' ;选RC时钟
BANKSEL ADCON0 ;打开AD模块
MOVWF ADCON0
BANKSEL ADCON1
MOVLW B'00000010' ;RA0,RA1,RA2,RA3,RA5=>AI
MOVWF ADCON1
MOVLW B'00000000' ;从CH=0开始采样
MOVWF CH_N
RETURN
;********************* I2C_INIT **************************
I2C_INIT
MOVLW B'11111111' ;定义RC4/SDA数据线为输入
BCF STATUS,RP1 ;定义RC3/SCL时钟线为输入
BSF STATUS,RP0
MOVWF TRISC ;设置C端口
MOVLW D'19' ;波特率设定为100KBD
BANKSEL SSPADD
MOVWF SSPADD ;初始化IIC波特率寄存器
BSF STATUS,RP0
BCF SSPSTAT,CKE ;选定输入电平遵循从IIC规范
BCF SSPSTAT,SMP ;关闭转换率控制
MOVLW B'00111000' ;设定同步串口控制寄存器体初始值
BANKSEL SSPCON
MOVWF SSPCON ;设定为主控方式,使能MSSP口
MOVLW B'01001000'
BANKSEL PIE1
MOVWF PIE1
; MOVLW B'11011000'
MOVLW B'11011000'
BCF STATUS,RP0
MOVWF INTCON
BSF OPTION_R,INTEDG
BCF OPTION_R,RBPU
RETURN
;=======================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -