📄 1113752222.asm
字号:
;*************************************************
;************************************************
;* 说明:这只是一个程序构架,您应按此构架的提示 *
;* 合理添加程序,以使其正常运行。 *
;************************************************
;*************************************************
;* 本实验使用 A/D 转换来对一个桥式结构的热敏元件 *
;* 电路采样,然后将其结果送至一校准表中。校准后 *
;* 得出其实际温度值,并将校准值转换成 ASCII码显示*
;* 在LCD上。 *
;*************************************************
include <p16f877.inc>
; 定义 LCD数据& 控制I/O口
LCD_DATA equ PORTB
LCD_CNTL1 equ PORTB
LCD_CNTL2 equ PORTA
; 定义 LCD控制相应的I/O引脚
RS equ 1
E equ 5
; LCD 模块命令代码
DISP_ON EQU 0x00C ; 开显示
DISP_ON_C EQU 0x00E ; 开显示, 开指针
DISP_ON_B EQU 0x00F ; 开显示, 开指针,开闪烁
DISP_OFF EQU 0x008 ; 关显示
CLR_DISP EQU 0x001 ; 清显示的操作数
ENTRY_INC EQU 0x006 ; 操作数,由左向右显示
ENTRY_INC_S EQU 0x007 ; 操作数,显示和读取均向右
ENTRY_DEC EQU 0x004 ; 操作数,由右向左显示
ENTRY_DEC_S EQU 0x005 ; 操作数,显示和读取均向左
DD_RAM_ADDR EQU 0x080 ; 初始化第一行显示的操作数
DD_RAM_UL EQU 0x0c0 ; 初始化第二行显示的操作数
;
;**************************************
; 请设置显示相关寄存器 *
;**************************************
Byte RES 1
Count RES 1
Count1 RES 1
Count2 RES 1
LCD_DATA1 RES 1
;*******************************************
;提示:您需要定义下列寄存器用做变量寄存器
;*******************************************
Temp res 1
TempH res 1
TempL res 1
Count res 1
org 0
goto Start
CalTable
movwf Temp ; 存A/D转换结果至Temp
movlw 0x66 ; 进行校准处理
subwf Temp,w ;
addwf PCL,f ; 将补偿结果与 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
Start
call InitLCD ; 初始化 LCD 显示
;**************************************************
;* 提示:将code1替换成你的程序,依次完成以下功能: *
;* - 初始化 A/D 转换器 *
;* - 设置转换速率为Fosc/8 *
;* - 选定通道1 *
;* - A/D使能 *
;**************************************************
code1
Main
;**************************************************
;* 提示:将code2替换成你的程序,依次完成以下功能:*
;* - 调用子程序延时 20us *
;* - 开始 A/D 转换 *
;* - 等待转换完成 *
;* - 送转换结果(高8位)到校准表CalTable *
;* - 存校准后结果至 Temp *
;**************************************************
code2
;**************************************************
call Bin2BCD ; 进行BCD码调整
call L1homeLCD ; 显示指针指向第1行
movf TempH,W ; 显示温度
call putcLCD
movf TempL,W
call putcLCD
movlw 'C' ; 显示“C”(表示摄氏度)
call putcLCD
goto Main
;********************************************************
;* Delay20 - 将call及return指令计算在内,准确的延时20us*
;********************************************************
Delay20
;************************************************
;* 提示:将code3替换成你的程序,完成以下功能: *
;* - code2将是一个能准确延时20us 的子程序(包*
;* 括call 和 return指令在内)。 *
;* -用变量 Count 来进行循环次数计数 *
;************************************************
code3
return
;************************************************
;* Bin2BCD - 将 Temp 寄存器内的二进制数转 *
;* 换为相应的 ASCII 码并存为 TempH:TempL 的形式 *
;************************************************
Bin2BCD
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 Over
movwf TempL
incf TempH,F
goto Ttenth
Over
movlw 0x30 ; Make decimal ASCII by adding
addwf TempH,F ; '0' to high and low byte
addwf TempL,F
return
;****************************************************
;提示:要将code4替换成以下子程序以供调用: *
; - InitLCD 初始化面板子程序 *
; - putcLCD 写入字符子程序 *
; - clrLCD 清显示子程序 *
; - L1homeLCD定位指针在第一行 *
; - L2homeLCD定位指针在第二行 *
;****************************************************
code4
end
;****************************************************
;Written by : Yamato Tel:0591-3375855-721 *
;****************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -