📄 temp_dis.asm
字号:
;******************************************************************
;《智能温度显示仪》程序清单
;程序文件名为: TEMP_DIS.ASM
;******************************************************************
;==============================寄存器定义===================================
STATUS EQU 03H ;定义状态寄存器地址
PORTA EQU 05H ;定义端口RA的数据寄存器地址
PORTB EQU 06H ;定义端口RB的数据寄存器地址
PORTC EQU 07H ;定义端口RC的数据寄存器地址
TRISA EQU 85H ;定义端口RA的方向控制寄存器地址
TRISB EQU 86H ;定义端口RB的方向控制寄存器地址
TRISC EQU 87H ;定义端口RC的方向控制寄存器地址
OPTION_REG EQU 80H ;定义选项寄存器地址
INTCON EQU 0BH ;定义中断控制寄存器地址
TMR0 EQU 01H ;定义TMR0寄存器地址
PIR1 EQU 0CH ;定义第一外设中断标志寄存器地址
ADRESH EQU 1EH ;定义ADC结果寄存器高字节地址
ADCON0 EQU 1FH ;定义ADC控制寄存器0地址
ADCON1 EQU 9FH ;定义ADC控制寄存器1地址
T1CON EQU 10H ;定义TMR1控制寄存器地址
TMR1L EQU 0EH ;定义TMR1低字节地址
TMR1H EQU 0FH ;定义TMR1高字节地址
;==============================变量声明=======================================
ADR EQU 20H ;存放标度变换结果
ADR_deci EQU 21H ;存放标度变换小数部分进位
ADR_int EQU 22H ;存放标度变换整数部分
TEMP1 EQU 23H ;暂存寄存器1
TEMP2 EQU 24H ;暂存寄存器2
BCD_count EQU 25H ;存放BCD码转换计数
DISP_count EQU 26H ;数码管显示移位计数
TMR1_count EQU 27H ;15秒中断外循环计数值
MAX EQU 28H ;报警上限值
MIN EQU 29H ;报警下限值
MAX?_temp EQU 30H ;报警上限值暂存寄存器
MIN_temp EQU 31H ;报警下限值暂存寄存器
DISP_dig EQU 32H ;显示"位"寄存器
DISP_seg EQU 33H ;显示"段"寄存器
;==============================常量声明=======================================
TMR1LB EQU 0DCH ;定义TMR1低字节寄存器初始值 (定时500毫秒)
TMR1HB EQU 0BH ;定义TMR1高字节寄存器初始值
;****************************复位矢量和中断矢量**************************
ORG 000H
NOP
GOTO MAIN
ORG 004H
;*****************************TMR1中断服务程序***************************
TMR1_int BCF PIR1,0 ;清中断溢出标志位
BCF T1CON,0 ;关闭TMR1定时器
MOVLW TMR1LB ;500ms定时初值
MOVWF TMR1L
MOVLW TMR1HB
MOVWF TMR1H
DECFSZ TMR1_count,1 ;外循环数减到零?
RETFIE ;否,中断返回
GOTO AGAIN ;是,转至正常显示
;******************************主程序************************************
MAIN CALL INITIAL ;调用初始化子程序
AGAIN BTFSC PORTB,0 ;K1键是否按下
GOTO NEXT1 ;否,转检测K2
CALL DELAY10 ;调10ms延时子程序,消除抖动影响
BTFSC PORTB,0 ;再次检测K1键是否按下
GOTO NEXT1 ;否,转检测K2
CALL Change_Max ;是,调上限修改子程序
NEXT1 BTFSC PORTB,1 ;K2键是否按下
GOTO NEXT2 ;否,转采样子程序
CALL DELAY10 ;是,调10ms延时子程序,消除抖动影响
BTFSC PORTB,1 ;再次检测K2键是否按下
GOTO NEXT2 ;否,转采样子程序
CALL Change_Min ;是,调下限修改子程序
NEXT2 CALL AD_trans ;调采样转换子程序
;========================判断温度是否为100℃================================
MOVF ADR,0
SUBLW 0FEH
BTFSC STATUS,0 ;采样结果大于0FEH(对应100℃)?
CALL BCD_trans ;否,调标度转换子程序
BSF PORTA,3 ;是,点亮上限报警灯
MOVLW 01H
MOVWF DISP_dig ;数码管第一位显示
MOVLW 00H
MOVWF DISP_seg ;数码管第一位显示数值
CALL Display ;调显示子程序显示这一位(个位)
MOVLW 02H
MOVWF DISP_dig
MOVLW 00H
MOVWF DISP_seg
CALL Display ;显示十位
MOVLW 03H
MOVWF DISP_dig
MOVLW 01H
MOVWF DISP_seg
CALL Display ;显示百位
MOVLW 04H
MOVWF DISP_dig
MOVLW 00H
MOVWF DISP_seg
CALL Display ;显示最高位
;==========================上下限报警及数据显示==========================
MOVF MAX,0
SUBWF ADR,0 ;采样结果是否大于上限值
BTFSS STATUS,0
GOTO NEXT3 ;否;转NEXT2
BSF PORTA,3 ;是;点亮上限报警灯
GOTO NEXT5
NEXT3 MOVF ADR,0
SUBWF MIN,0 ;采样结果是否低于下限值
BTFSS STATUS,0
GOTO NEXT4 ;否,转NEXT3
BSF PORTA,5 ;是,点亮下限报警灯
GOTO NEXT5
NEXT4 BCF PORTA,3 ;熄灭上限报警灯
BCF PORTA,5 ;熄灭下限报警灯
NEXT5 MOVLW 01H
MOVWF DISP_dig ;显示个位
MOVF ADR,0
ANDLW 0FH ;显示ADR中低四位值(BCD码的个位值)
MOVWF DISP_seg
CALL Display
SWAPF ADR,0 ;交换ADR的高四位和低四位值
ANDLW 0FH
MOVWF DISP_seg ;显示ADR中高四位值(BCD码的十位值)
MOVLW 02H
MOVWF DISP_dig
CALL Display ;显示十位
MOVLW 03H
MOVWF DISP_dig
MOVLW 00H
MOVWF DISP_seg
CALL Display ;显示百位
MOVLW 04H
MOVWF DISP_dig
MOVLW 00H
MOVWF DISP_seg
CALL Display ;显示最高位
CALL DELAY30 ;延时
CALL DELAY30
CALL DELAY30
GOTO AGAIN
;******************************延时10ms子程序***************************
DELAY10 BCF INTCON,2 ;TMR0溢出标志位清零
MOVLW 0B2H
MOVWF TMR0 ;装入初值,启动计时
L1 BTFSS INTCON,2 ;定时溢出?
GOTO L1 ;否,循环检测标志位
RETURN ;是,返回
;*******************************延时30ms子程序**************************
DELAY30 BCF INTCON,2 ;TMR0溢出标志位清零
MOVLW 16H
MOVWF TMR0 ;赋初值,启动计时
L2 BTFSS INTCON,2 ;检测溢出标志位
GOTO L2
RETURN
;*******************************初始化子程序******************************
INITIAL
;=============================输入输出口初始化============================
BSF STATUS,5
MOVLW 01H
MOVWF TRISA ;置RA0输入,RA4、RA5输出
MOVLW 17H
MOVWF TRISB ;置RB输入方式
MOVLW 00H
MOVWF TRISC ;置RC输出方式
MOVLW 07H
MOVWF OPTION_REG ;TMR0初始化,预设分频比1:256
;==============================TMR1初始化==============================
BSF PIR1,0 ;开放TMR1中断使能位
BCF STATUS,5
MOVLW 34H ;设置分频比为1:8
MOVWF T1CON
MOVLW 0C0H ;开放总中断和外设中断使能位
MOVWF INTCON
MOVLW TMR1LB ;TMR1低字节赋初值
MOVWF TMR1L
MOVLW TMR1HB ;TMR1高字节赋初值
MOVWF TMR1H
MOVLW 1EH ;TMR1中断"30"次则自动跳出上下限值修改
MOVWF TMR1_count
MOVLW 60H ;报警上限赋初值
MOVWF MAX
MOVLW 20H ;报警下限赋初值
MOVWF MIN
;===============================7219初始化================================
MOVLW 0CH
MOVWF DISP_dig ;选中寄存器"SHUTDOWN",其地址为0CH
MOVLW 01H
MOVWF DISP_seg ;寄存器"SHUTDOWN"赋初值
CALL Display ;设为正常显示状态
MOVLW 0FH
MOVWF DISP_dig ;选中寄存器"DISPLAY TEST",其地址为0FH
MOVLW 00H
MOVWF DISP_seg ;寄存器"DISPLAY TEST"赋初值
CALL Display ;设为正常显示状态
MOVLW 0BH
MOVWF DISP_dig ;选中寄存器"SCAN LIMIT",其地址为0BH
MOVLW 03H
MOVWF DISP_seg ;寄存器"SCAN LIMIT"赋初值
CALL Display ;点亮0-3四个数码管
MOVLW 09H
MOVWF DISP_dig ;选中寄存器"DECODE MODE",其地址为09H
MOVLW 0FFH
MOVWF DISP_seg ;寄存器"DECODE MODE"赋初值
CALL Display ;选B码译码方式
MOVLW 0AH
MOVWF DISP_dig ;选中寄存器"INTENSITY",其地址为0AH
MOVLW 0FH
MOVWF DISP_seg ;寄存器"INTENSITY"赋初值
CALL Display ;显示亮度选择最亮
RETURN
;***************************A/D转换子程序************************************
AD_trans BSF STATUS,5
MOVLW 0EH
MOVWF ADCON1 ;设RA0为模拟输入,采样结果左对齐
BCF STATUS,5
MOVLW 41H
MOVWF ADCON0 ;选择A/D转换时钟,选择采样通道0,开
;采样允许位
BSF ADCON0,2 ;采样开始
LOOP_AD NOP
BTFSC ADCON0,2 ;采样结束?
GOTO LOOP_AD ;否,转LOOP_AD
MOVF ADRESH,0 ;是,读取采样结果
MOVWF ADR
RETURN
;***************************标度变换转换子程序*******************************
BCD_trans
;===========================小数进位部分处理=================================
MOVF ADR,0
MOVWF TEMP1
MOVWF TEMP2
RLF TEMP1,1
RLF TEMP1,1
RLF TEMP1,1
MOVF TEMP1,0
MOVWF TEMP2 ;采样结果左移3位送TEMP2
RLF TEMP1,1 ;采样结果左移4位送TEMP1
MOVLW 30H
ANDWF TEMP1,1 ;左移4位结果屏蔽高2位和低4位
MOVLW 38H
ANDWF TEMP2,1 ;左移3位结果屏蔽高2位和低3位
MOVF TEMP2,0
ADDWF TEMP1,1
MOVF ADR,0
MOVWF TEMP2
MOVLW 3FH
ANDWF TEMP2,1 ;采样结果屏蔽高2位
MOVF TEMP2,0
ADDWF TEMP1,0
MOVWF ADR_deci
;=============================整数部分处理===============================
MOVF ADR,0
MOVWF TEMP1
MOVWF TEMP2
RRF TEMP1,1
RRF TEMP1,1 ;采样结果右移2位送TEMP1
MOVLW 3FH
ANDWF TEMP1,1 ;屏蔽高2位
RRF TEMP2,1
RRF TEMP2,1
RRF TEMP2,1 ;采样结果右移3位送TEMP2
MOVLW 1FH
ANDWF TEMP2,1 ;屏蔽高3位
MOVF TEMP2,0
ADDWF TEMP1,1
MOVF ADR,0
MOVWF TEMP2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -