⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad_test.asm

📁 ASM 格式的PIC_AD和简单模拟量处理程序
💻 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 + -