📄 theat.asm
字号:
;*************************************************
;* heat.asm **
;*************************************************
;* 本程序为热敏电阻输入处理模块程序
;* 将温度值在LCD特定位置显示
;* 占用I/O RA1
;* 使用RAM 3个字节
;* 程序包括:
;* - TempM 热敏电阻输入处理子程序
;* - CalTable 温度值校准处理子程序
;* - Bin2BCDT -二进制数转两位ASCII码子程序
;* 入口参数 无
;* 出口参数 TempH,TempL (温度值)
;*************************************************
#include p16f877A.inc ;定义所用单片机的头文件
Temp EQU 0X20
TempH EQU 0X21
TempL EQU 0X22
LED_DATA EQU 0X24 ;要显示的数值
CLKCOUNT EQU 0X25 ;脉冲记数器
COUNT EQU 0X25 ;
COUNT1 EQU 0X26 ;
COUNT2 EQU 0X27 ;
#DEFINE SRCLK PORTB,5; SPI CLK
#DEFINE RCLK PORTB,4; 完成脉冲线
#DEFINE SER PORTB,3; SPI SDO
ORG 0X0
CALL PRELED;
CALL TEMPM;
MOVF TEMPL,W;
MOVWF LED_DATA;
CALL MONILED
MOVF TEMPH,W;
MOVWF LED_DATA;
CALL MONILED;
CALL DELAY;
GOTO 0X0;
CalTable ;温度校正函数
bcf STATUS,RP0
movlw 0x3A ;进行校准处理(调整该处值以得到正确的温度值)
subwf Temp,w ;
addwf PCL,f ;将补偿结果与 PCL相加
;*注意:要通过反汇编查看CalTable函数是否跨页(这里的跨页指PCL溢出),若跨页则要调整该函数位置
dt 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5
dt 6,6,6,7,7,7,8,8,8,9,9,0xa,0xa,0xb,0xb,0xc,0xc
dt 0xd,0xd,0xe,0xe,0xf,0xf,0xf,0x10,0x10,0x10
dt 0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x14,0x14,0x14
dt 0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x18,0x18
dt 0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1c
dt 0x1d,0x1d,0x1d,0x1e,0x1e,0x1f,0x1f,0x20,0x20
dt 0x21,0x21,0x22,0x22,0x23,0x23,0x24,0x24,0x25,0x25
dt 0x26,0x26,0x27,0x28,0x29,0x29,0x2a,0x2a,0x2b,0x2b
dt 0x2c,0x2d,0x2e,0x2f,0x30,0x32
;********************************************************
TEMPM ;热敏电阻输入处理
bsf STATUS,RP0 ;初始化RA2
movlw 0x02
movwf ADCON1 ;ADRESH all 8-bit
bcf STATUS,RP0
movlw b'01001001' ;select AD1,FOSC/8
movwf ADCON0 ;
movlw 0x10 ;延时
movwf Temp
decfsz Temp,F
goto $-1
bsf ADCON0,GO ;启动转换
btfsc ADCON0,GO
goto $-1
movf ADRESH,W ;读取转换结果的高8位
movwf Temp
movlw HIGH CalTable ;进行校正
movwf PCLATH
call CalTable
movwf Temp
call Bin2BCDT ;进行BCD码调整
return
;************************************************
;* Bin2BCDT - 将 Temp 寄存器内的二进制数转 *
;* 换为相应的 ASCII 码并存为 TempH:TempL 的形式 *
;************************************************
Bin2BCDT
bcf STATUS,RP0
clrf TempH ;Initialize variables
movf Temp,W
movwf TempL
Ttenth ;Subtract 10 from low variable
movlw .10 ;until result is < 0. On each
subwf TempL,W ;subtraction, increment the
btfss STATUS,C ;temperature high byte.
goto Over0
movwf TempL
incf TempH,F
goto Ttenth
Over0
movlw 0x30 ;Make decimal ASCII by adding
iorwf TempH,F ;'0' to high and low byte
iorwf TempL,F
return
;**************************************************************
PRELED
CLRF PORTB;
MOVLW 0X8
MOVWF CLKCOUNT;
BSF STATUS,RP0;
;BCF ANSEL,7; MAKE RC3 DIGITAL IO;use for 16f676
CLRF TRISB; MAKE RC3,RC4,RC5 OUTPUT
BCF STATUS,RP0;
RETURN
MONILED; 入口参数LED_DATA,为0-9ASCALL码
;芯片全部在时钟上升沿完成动作,故需在低电平期间完成数据的变化。
MOVLW 0X0F;
ANDWF LED_DATA,F;得到0-9;
MOVF LED_DATA,W;
CALL LED_TABLE;
MOVWF LED_DATA; 得到0-9对应的LED段码;该码表与SPI主模式下码表一致,故模拟时,高位 ; 先送出,芯片最高工作频率30M故不需要特别的延时
BCF RCLK;
GOGOGO
BCF SRCLK;
RLF LED_DATA,F;
BTFSC STATUS,C;
GOTO SETSER;
GOTO CLRSER;
SETSER
BSF SER;
GOTO SETSRCLK;
CLRSER
BCF SER;
SETSRCLK
NOP
NOP
BSF SRCLK
NOP
DECFSZ CLKCOUNT,F;
GOTO GOGOGO;
BCF RCLK;干扰太厉害,必须在这清0,然后制造上升沿
NOP
NOP
BSF RCLK;
MOVLW 0X8;
MOVWF CLKCOUNT;
RETURN
LED_TABLE ;七段码调整 如果表出现PCL溢出,要调整表的位置
ADDWF PCL,F
DT 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F
Delay ;1S延时(4M下)
; call指令占用2个指令周期
clrf Count ; 清 Count占用1个指令周期
clrf Count1 ; 清 Count1占用1个指令周期
movlw 0x06 ;占用1个指令周期
movwf Count2 ;占用1个指令周期
LDloop
decfsz Count,f ; 这两行指令将延时
goto LDloop ; (256 * 3) -1 个指令周期
decfsz Count1,f
goto LDloop
decfsz Count2,f
goto LDloop
return
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -