📄 adc.asm
字号:
;实验目的:熟悉A/D转换
;软件思路:选择RAO做为模拟输入通道;
; 连续转换4次再求平均值做为转换结果
; 最后结构只取低8位
; 结果送数码管的低3位显示
;硬件要求:拨码开关S14第2位置ON,第1位置OFF
; 拨码开关S6全部置ON,S5第4-6位置ON,第1-3位置OFF
; 为不影响结果,其他拨码开关置OFF。
#INCLUDE<P16F616.INC> ;包含芯片头文件
__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC
;芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
;*********************寄存器定义*********************
TEMP EQU 20H ;临时寄存器
BAI EQU 21H ;转换结果的百位
SHI EQU 22H ;转换结果的十位
GE EQU 23H ;转换结果的个位
;****************************************************
ORG 00H ;复位入口地址
NOP ;ICD需要的空指令
GOTO MAIN ;跳转到主程序入口
ORG 04H ;中断入口地址
RETFIE ;放置一条中断返回指令,防止以外中断发生
;***********************主程序***********************
MAIN
MOVLW 30H
MOVWF FSR ;转换结果存放起始地址,文件选择寄存器f4-(FSR),(可直接寻址或间接寻址)
LOOP
BSF STATUS,RP0 ;选择体1, STATUS--RP2,RP1,RP0,T0, PD,Z,DC,C RP1,RP0: 01
MOVLW 07H ;A口高3位为输出,低3位输入 00 0111
MOVWF TRISA ;A口,共6位I/0口
CLRF TRISD ;D口设8位,为输出
MOVLW 8EH
MOVWF ADCON1 ;结果右对齐,只选择RA0做ADC口,其余做普通数字口 1000 1110
;TRISA,TRISD,ADCON1, 在体1中.
BCF STATUS,RP0 ;回体0
MOVLW 41H
MOVWF ADCON0 ;选择时钟源为fosc/8,起用ADC, 0100 0001 ADCON0, 在体0中
; CALL DELAY ;调用延时程序,保证足够的采样时间
BSF ADCON0,GO ;启动ADC转换
WAIT
BTFSS PIR1,ADIF ;转换是否完成(中断方式)
GOTO WAIT ;等待转换的完成
BSF STATUS,RP0 ;选择体1
MOVFW ADRESL ;读取转换的结果送入W
BCF STATUS,RP0 ;回体0
MOVWF INDF ;保存到临时寄存器30H中. (f0=INDF间接寻址)
INCF FSR,1
BTFSS FSR,2 ;连续转换4次,求平均值,(bit2=0000 0100) ;位=1跳过下一行
GOTO LOOP
CALL CHANGE ;调用结果转换程序
CALL DISPLAY ;调用显示程序
GOTO MAIN ;循环工作
;************************转换程序*********************
;入口参数:30H---33H
;出口参数:BAI,SHI,GE
CHANGE
CLRF 2AH
CLRF BAI
CLRF SHI
CLRF GE ;先清除结果寄存器
MOVFW 31H ;以下8条指令求4次转换结果的平均值
ADDWF 30H,1 ;(31H)+(30H)--(30H) d=1存入f,d=0存入w
BTFSC STATUS,C ;位=0跳过下一行
INCF 2AH
MOVFW 32H
ADDWF 30H,1
BTFSC STATUS,C
INCF 2AH,1
MOVFW 33H
ADDWF 30H,1 ;(33H)+(32H)+(31H)+(30H)--(30H) d=1存入f
BTFSC STATUS,C
INCF 2AH,1
RRF 2AH,1 ;除以2,结果送入2AH
RRF 30H,1 ;除以2,结果送入30H
RRF 2AH,0 ;=除以4,结果送入W.
RRF 30H,0 ;=除以4,结果送入W.
MOVWF TEMP ;4次转换结果的平均值送入 TEMP
;*********************************************************
END ;程序结束
;***********************查表程序*********************
;入口参数:W
;出口参数:W
TABLE
ADDWF PCL,1 ;指令寄存器加上偏移地址 (偏移地址W)+PCL--PCL, d=1存入PCL,
RETLW 0C0H ;0的编码(公阳极数码管) K--W
RETLW 0F9H ;1的编码
RETLW 0A4H ;2的编码
RETLW 0B0H ;3的编码
RETLW 99H ;4的编码
RETLW 92H ;5的编码
RETLW 082H ;6
RETLW 0F8H ;7
RETLW 080H ;8
RETLW 090H ;9
MOVLW 64H ;减100,结果保留在W中
SUBWF TEMP,0 ;TEMP-100 --W
BTFSS STATUS,C ;判断是否大于100 ;位=1跳过下一行====(原程序)
;BTFSC STATUS,C ;判断是否大于100 ;位=0跳过下一行====(应改为)
GOTO SHI_VAL ;否,转求十位结果
MOVWF TEMP ;是,差送回TEMP中
INCF BAI,1 ;百位加1
GOTO $-6 ;返回继续求百位的值
SHI_VAL
MOVLW 0AH ;减10,结果保留在W中
SUBWF TEMP,0
BTFSS STATUS,C ;判断是否大于10 ====(原程序)
;BTFSC STATUS,C ;判断是否大于10 ;位=0跳过下一行====(应改为)
GOTO GE_VAL ;否,转去判断个位结果
MOVWF TEMP ;是,差送回TEMP中
INCF SHI,1 ;十位值加1
GOTO $-6 ;转会继续求十位的值
GE_VAL
MOVFW TEMP
MOVWF GE ;个位的值
RETURN ;子程序返回
;**************************显示程序********************
;入口参数:BAI,SHI,GE
;出口参数:无
DISPLAY
MOVFW BAI ;显示百位 BAI送入W(偏移地址)
CALL TABLE ;调用查表程序
MOVWF PORTD
BCF PORTA,3 ;打开百位显示
; CALL DELAY
; CALL DELAY
BSF PORTA,3 ;关闭百位显示
MOVFW SHI ;显示十位
CALL TABLE
MOVWF PORTD
BCF PORTA,4
; CALL DELAY
; CALL DELAY
BSF PORTA,4
MOVFW GE ;显示个位
CALL TABLE
MOVWF PORTD
BCF PORTA,5
; CALL DELAY
; CALL DELAY
BSF PORTA,5
RETURN
;***************************延时程序***********************
;入口参数:无
;出口参数:无
DELAY
MOVLW 5FH
MOVWF TEMP
DECFSZ TEMP,1
GOTO $-1
RETURN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -