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

📄 theat.asm

📁 1
💻 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 + -