单片机内存分配申明!
TEMPER_L EQU 29H用于保存读出温度的低8位
TEMPER_H EQU 28H用于保存读出温度的高8位
FLAG1EQU 38H是否检测到DS18B20标志位
a_bitequ 20h 数码管个位数存放内存位置
b_bitequ 21h 数码管十位数存放内存位置
进行温度显示缺毁拦,这里我们考虑用网站提供的两位数码管来显示温度
显示范围00到99度,显示精度为1度
因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
这个转化温度的方法非常简洁无需乘于0.0625系数
MAIN: LCALL GET_TEMPER调用读温度子程序
MOV A,29H
MOV C,40H将28H中伏胡的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL DISPLAY调用数码管显示子程序
JNB FLAG1,MM1
CLR P1.0
SJMP MAIN
MM1:SETB P1.0
SJMP MAIN
INIT_1820: SETB P2.2 这是DS18B20复位初始化子程序
NOP
CLR P2.2
MOV R1,#3 主机发出延时537微秒的复位低脉冲
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P2.2 然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB P2.2,TSR3 等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 延时
TSR3: SETB FLAG1 置标志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1 清标志位,表示DS1820不存在
LJMP TSR7
TSR5: MOV R0,#70
TSR6: DJNZ R0,TSR6 时序要求延时一段时间
TSR7: SETB P2.2
RET
GET_TEMPER: SETB P2.2 读出转换后的温度值
LCALL INIT_1820先复位DS18B20
JB FLAG1,TSS2
RET 判断DS1820是否存在?若DS18B20不存在则返回
TSS2: MOV A,#0CCH 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H 发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY 这余尘里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
LCALL INIT_1820准备读温度前先复位
MOV A,#0CCH 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200将读出的温度数据保存到35H/36H
RET
WRITE_1820: MOV R2,#8写DS18B20的子程序(有具体的时序要求),一共8位数据
CLR C
WR1:CLR P2.2
MOV R3,#5
DJNZ R3,$
RRC A
MOV P2.2,C
MOV R3,#21
DJNZ R3,$
SETB P2.2
NOP
DJNZ R2,WR1
SETB P2.2
RET
READ_18200: MOV R4,#2 读DS18B20的程序,从DS18B20中读出两个字节的温度数据,将温度高位和低位从DS18B20中读出
MOV R1,#29H 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00: MOV R2,#8数据一共有8位
RE01: CLR C
SETB P2.2
NOP
NOP
CLR P2.2
NOP
NOP
NOP
SETB P2.2
MOV R3,#8
RE10: DJNZ R3,RE10
MOV C,P2.2
MOV R3,#21
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
display:mov a,29H显示子程序将29H中的十六进制数转换成10进制
mov b,#10 10进制/10=10进制
div ab
mov b_bit,a 十位在a
mov a_bit,b 个位在b
mov dptr,#numtab 指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 显示1000次
dplop: mov a,a_bit 取个位数
MOVC A,@A+DPTR 查个位数的7段代码
mov p0,a 送出个位的7段代码
clr p2.6 开个位显示
acall d1ms 显示1ms
setb p2.6
mov a,b_bit 取十位数
MOVC A,@A+DPTR 查十位数的7段代码
mov p0,a 送出十位的7段代码
clr p2.7 开十位显示
acall d1ms 显示1ms
setb p2.7
djnz r1,dplop 100次没完循环
djnz r0,dpl1 4个100次没完循环
ret
D1MS: MOV R7,#80 1MS延时
DJNZ R7,$
RET
numtab: DB 0C0H,0F9H,0A4H,0B0H, 099H, 092H, 082H,0F8H 080H, 090H 实验板上的7段数码管0~9数字的共阴显示代码
end
要键盘干什么#include <msp430x44x.h>
#define CPU_F ((double)1048500)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define SEGE 0X80
#define SEGH 0X40
#define SEGF 0X20
#define SEGC 0X10
#define SEGG 0X08
#define SEGD 0X04
#define SEGB 0X02
#define SEGA 0X01
const unsigned char digit[10] = {
SEGA|SEGB|SEGC|SEGD|SEGE|SEGF, /* "0" LCD segments a+b+c+d+e+f */
0x12, /* "1" */
0x8F, /* "2" */
0x1F, /* "3" */
0x3A, /* "4" */
0x3D, /* "5" */
0xBD, /* "6" */
0x13, /* "7" */
0xBF, /* "8" */
0x3F /隐誉灶* "虚蔽9" */
}
#define DQ1 P3OUT|=BIT4
#define DQ0 P3OUT&=~BIT4
float Temper=0.0
int temperature=0
unsigned char Error = 0
//----------------------------------
//功能:us 级别延时
// n=10,则延时10*5+6=56uS
//----------------------------------
void DelayNus(unsigned int n)
{
while(n--){}
}
//-----------------------------------
//功能:写18B20
//-----------------------------------
void Write_18B20(unsigned char n)
{
unsigned char i
for(i=0i<8i++)
{ P3DIR |= BIT4
DQ0
delay_us(13)//延时13us 左右
if((n&0X01)==0X01) DQ1
else DQ0
n=n>>1
delay_us(50)//延灶扮时50us 以上
DQ1
}
}
//------------------------------------
//功能:读取18B20
//------------------------------------
unsigned char Read_18B20(void)
{
unsigned char i
unsigned char temp
for(i=0i<8i++)
{
temp=temp>>1
DQ0
_NOP()//延时1us
DQ1
_NOP()_NOP()//延时5us
_NOP()_NOP()_NOP()
P3DIR&=~BIT4
if((P3IN&BIT4)==0)
{
temp=temp&0x7F
}else
{
temp=temp|0x80
}
delay_us(40)//延时40us
P3DIR|=BIT4
DQ1
}
returntemp
}
//-----------------------------------
void Init (void)
{
DQ0
delay_us(600)//延时500us
DQ1
delay_us(100)//延时90us
P3DIR&=~BIT4
if((P3IN&BIT4)==BIT4)//0001 1111b=1f
{
Error =1 //失败1
P4DIR|=BIT4
}else
{
Error = 0//初始化成功
P4DIR|=BIT4
DQ1
}
}
//----------------------------------
void Skip(void)
{
Write_18B20(0xcc)
}
//----------------------------------
void Convert (void)
{
Write_18B20(0x44)
}
//----------------------------------
void ReadDo (void)
{
Write_18B20(0xbe)
}
//----------------------------------
void ReadTemp (void)
{
char temp_low,temp_high//温度值
temp_low=Read_18B20()//读低位
temp_high=Read_18B20()//读高位
temperature=(temp_high&0x0f)
temperature<<=8
temperature|=temp_low
Temper=temperature*0.0625
}
void GetTemp(void){
Init()
Skip()
Convert()
delay_ms(500)
delay_ms(500)
delay_ms(500)//延时1s以上
Init()
Skip()
ReadDo()
ReadTemp()
}
void InitLcd(void){
LCDCTL = LCDON + LCD4MUX + LCDSG0_1 // LCD on, 4-Mux, segments S0-S15
BTCTL = BT_fLCD_DIV128 // LCD clock freq is ACLK/128
P5SEL = 0xFC// Select P5.2-7 as Com and Rxx
}
void display_number(unsigned long value, int start, int width)
{
int i
for (i = 0 i <width i++)
{
LCDMEM[7 + i - start] = digit[value%10]// remainder = character in table to display
value /= 10
}
}
void Lcd_Clr(void)
{
volatile unsigned char i
for (i=0i<7i++)
{
LCDMEM[i] = 0
}
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD// 停狗
P3DIR |=BIT4
DQ1
InitLcd()
Lcd_Clr()
while(1)
{
GetTemp()
display_number((unsigned long int)(Temper*1000),7,5)
LCDMEM[3] |= SEGH
}
}
********************************************************************************显视温度************************
********************************************************
COUNT DATA30H 地址计数常数
WENDU DATA32H 实际温度地址
WENDUD DATA33H 温度低位地址
WENDUG DATA34H 温度高位地址
SDWDG DATA35H 设定高温度地址
SDWDD DATA36H 设定低温度地址
----------------------------------------------------------------
RS EQUP2.0
RW EQUP2.1
E EQUP2.2
PSB EQUP2.3
RST EQUP2.5
SHUJU EQUP3.3
K1 EQUP1.4 按键1,设定温度值老升腊减1
K2 EQUP1.5 按键2,设定温度笑培值加1
K3 EQUP1.6 按键3,确定修改和确定退出
============================================================
ORG 0000H
JMP MAIN
ORG 0040H
============================================================
MAIN: CLR P3.7
LCALL SET_LCD 初始化 LCD 12864
LCALL W18B20 初始化18B20
LCALL CWD
********************************************************
WANG: LCALL W18B20 初始化18B20
LCALL DU18B20 读18B20温度
LCALL S18B20 送温度显视
LCALL ANJIAN 按键程序
LJMPWANG
==============================================================
对 LCD12864 做初始化侍滑设置
==============================================================
SET_LCD:
SETB PSB 通讯方式为8位数据并口
MOV A,#34H34H--扩充指令 *** 作
LCALL SEND_I
MOV A,#30H30H--8bit控制界面,基本指令 *** 作
LCALL SEND_I
MOV A,#01H清除显示
LCALL SEND_I
MOV A,#06H指定在资料写入或读取时,光标的移动方向
LCALL SEND_I DDRAM 的地址计数器(AC)加1
MOV A,#0CH开显示,关光标,不闪烁
LCALL SEND_I
RET
==============================================================
写指令子程序
RS=0,RW=0,E=高脉冲,D0-D7=指令码
==============================================================
SEND_I: LCALL CHK_BUSY
CLR RS
CLR RW
MOV P0,A
SETB E
NOP
NOP
CLR E
RET
==============================================================
测忙碌子程序
RS=0,RW=1,E=H,D0-D7=状态字
==============================================================
CHK_BUSY:
MOV P0,#0FFH测忙碌子程序
CLR RS
SETB RW
SETB E
JB P0.7,$
CLR E
RET
==============================================================
把 DS18B20 EEROM 里的温度报警值拷贝回暂存器(暂时用不到)
==============================================================
CWD: LCALL W18B20
MOV A,#0CCH跳过ROM匹配
LCALL XIEB20
MOV A,#0B8H把EEROM里的温度报警值拷贝回暂存器
LCALL XIEB20
RET
***************************************************
DS18B20 复位与检测子程序
SHUJU=1 OK, SHUJU=0 ERROR
****************************************************
W18B20: SETBSHUJU
NOP
CLR SHUJU
MOV R0,#64H 主机发出延时600微秒的复位低脉冲
MOV R1,#03H
W11: DJNZR0,$
MOV R0,#64H
DJNZR1,W11
SETBSHUJU 然后拉高数据线
NOP
MOV R0,#25H
WW2: JNB SHUJU,WW3 等待DS18B20回应
DJNZR0,WW2
JMP WW4 延时
WW3:SETB20H.0 置标志位,表示DS1820存在
JMP WW5
WW4: CLR 20H.0 清标志位,表示DS1820不存在
JMP WW6
WW5: MOV R0,#064H
DJNZR0,$时序要求延时一段时间
WW6: SETBSHUJU
JNB 20H.0,AAAA DS18B20出错
RET
==============================================================
DS18B20错误时LCD显示子程序
==============================================================
AAAA: MOV DPTR,#M_ERROR1 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#80H 第一行起始地址
LCALL SEND_I调用写指令子程序
LCALL QUSHU
MOV DPTR,#M_ERROR2 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#90H 第二行起始地址
LCALL SEND_I调用写指令子程序
LCALL QUSHU
MOV DPTR,#M_ERROR3 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#88H 第三行起始地址
LCALL SEND_I调用写指令子程序
LCALL QUSHU
MOV DPTR,#M_ERROR4 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#98H 第四行起始地址
LCALL SEND_I调用写指令子程序
LCALL QUSHU
LCALL MING1
RET
--------------------------------------------------------------
读18B20温度
***********************************************************
DU18B20:
MOV A,#0CCH
LCALL XIEB20
MOV A,#44H 发出温度转换命令
LCALL XIEB20
LCALL W18B20
MOV A,#0CCH
LCALL XIEB20 写18B20指令
MOV A,#0BEH 发出读温度命令
LCALL XIEB20
LCALL WDSJ温度数据
RET
===========================================================
写入18B20指令
===========================================================
XIEB20: MOV R2,#8 一共8位数据
CLR CY
XIE: CLR SHUJU 开始写入DS18B20总线要处于复位(低)状态
MOV R3,#09
DJNZR3,$总线复位保持18微妙以上
RRC A 把一个字节DATA 分成8个BIT环移给C
MOV SHUJU,C 写入一个BIT
MOV R3,#23
DJNZR3,$等待46微妙
SETBSHUJU 重新释放总线
NOP
DJNZR2,XIE 写入下一个BIT
SETBSHUJU
RET
******************************************************
读温度子程序
从DS18B20中读出温度低位、高位,
存入33H,34H,35H,36H
****************************************************
WDSJ: MOV R4,#04H
MOV R1,#33H 存入33H,34H
RE00: MOV R2,#8
RE01: CLR C
SETBSHUJU
NOP
NOP
CLR SHUJU读前总线保持为低
NOP
NOP
NOP
SETBSHUJU开始读总线释放
MOV R3,#07 延时15微妙
DJNZR3,$
MOV C,SHUJU 从DS18B20总线读得一个BIT
MOV R3,#23
DJNZR3,$ 等待46微妙
RRC A把读得的位值环移给A
DJNZR2,RE01 读下一个BIT
MOV @R1,A
INC R1
DJNZR4,RE00
LCALL WDCZ
RET
==============================================================
处理入水口实际水温度 BCD 码子程序(未考虑百位和负温度值)
整数部分:取出 WENDUD 高四位和 WENDUG 低四位进行重新组合
小数部分:取出 TEMPL1 低四位,查小数码表
小数部分:73H;个位:74H;十位:75H
==============================================================
WDCZ:
MOV A,WENDUD
ANL A,#0FH 取出小数部分
MOV B,#10 将TEMP_L的低四位X10/16得小数后一位数.
MUL AB
MOV B,#16
DIV AB
MOV 73H,A 小数部分 BCD
MOV A,WENDUD整数部分
ANL A,#0F0H 取出高四位
SWAP A
MOV WENDUD,A
MOV A,WENDUG取出低四位
ANL A,#0FH
SWAP A
ORL A,WENDUD重新组合温度数据
MOV WENDU,A 重新组合的温度数据存入WENDU
LCALL HEX2BCD1
MOV WENDUD,A(A)=十位数和个位数
ANL A,#0F0H
SWAP A
MOV 75H,A 十位数 BCD
MOV A,WENDUD
ANL A,#0FH
MOV 74H,A 个位数 BCD
RET
==============================================================
单字节十六进制转BCD
入口:(A)=单字节十六进制的温度值
出口:(A)=十位数和个位数
==============================================================
HEX2BCD1:
MOV B,#0AH
DIV AB
SWAP A
ORL A,B (A)=个位数和十位数
RET
**********************************************************
**********************送显示******************************
**********************************************************
S18B20:
MOV DPTR,#M_OK2 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#80H第一行起始地址
LCALL SEND_I 调用写指令子程序
LCALL QUSHU
LCALL SHOW_D 显示设定的恒温水温度值
MOV DPTR,#M_OK1 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#90H第二行起始地址
LCALL SEND_I 调用写指令子程序
LCALL QUSHU
LCALL SHOW_G 显示设定的恒温水温度值
MOV DPTR,#M_OK3 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#88H第三行起始地址
LCALL SEND_I 调用写指令子程序
LCALL QUSHU
LCALL SHOW_S 显示实际温度值
MOV DPTR,#M_OK4指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#98H 第四行起始地址
LCALL SEND_I 调用写指令子程序
LCALL QUSHU
RET
==============================================================
显示恒温水温度值子程序
==============================================================
SHOW_G: MOV A,#86H设置显示位置
LCALL SEND_I
MOV A,SDWDG
MOV B,#0AH
DIV AB
ADD A,#30H十位数转换为 ASCII 码
LCALL SEND_D 送显示
MOV A,B 个位数
ADD A,#30H个位数转换为 ASCII 码
LCALL SEND_D 送显示显示恒温水温度值子程序
MOV A,#87H设置显示位置
LCALL SEND_I
MOV A,#0A1H 显示温度标记℃
LCALL SEND_D
MOV A,#0E6H
LCALL SEND_D
SHOW_D: MOV A,#96H设置显示位置
LCALL SEND_I
MOV A,SDWDD
MOV B,#0AH
DIV AB
ADD A,#30H十位数转换为 ASCII 码
LCALL SEND_D 送显示
MOV A,B 个位数
ADD A,#30H个位数转换为 ASCII 码
LCALL SEND_D 送显示显示恒温水温度值子程序
MOV A,#97H设置显示位置
LCALL SEND_I
MOV A,#0A1H 显示温度标记℃
LCALL SEND_D
MOV A,#0E6H
LCALL SEND_D
RET
==============================================================
LCD12864 显示实际温度值子程序
==============================================================
SHOW_S: MOV A,#8DH设置显示位置
LCALL SEND_I
MOV A,75H 加载十位数据
CJNE A,#00H,CONV2
CONV1: MOV A,#" "十位数等于0显示空格
LCALL SEND_D 送显示
JMP CONV3
CONV2: ADD A,#30H 十位数转换成ASCII码
LCALL SEND_D 显示数据
CONV3: MOV A,74H 个位
ADD A,#30H个位数转换成ASCII码
CALL SEND_D 送显示
MOV A,#'.'
CALL SEND_D 送显示
MOV A,73H 加载小数位
ADD A,#30H小数位转换成ASCII码
CALL SEND_D 送显示
MOV A,#8FH显示温度标记℃
CALL SEND_I
MOV A,#0A1H
CALL SEND_D
MOV A,#0E6H
CALL SEND_D
RET
==============================================================
取数子程序
==============================================================
QUSHU: CLR A
MOVC A,@A+DPTR 查表取数据
LCALL SEND_D 送显示
INC DPTR
DJNZ COUNT,QUSHU
RET
==============================================================
写数据子程序
RS=1,RW=0,E=高脉冲,D0-D7=数据
==============================================================
SEND_D: LCALL CHK_BUSY 写数据子程序
SETB RS
CLR RW
MOV P0,A
SETB E
NOP
NOP
CLR E
RET
--------------------------------------------------------------
MING1: SETB P3.7
LCALL YS
CLR P3.7
RET
YS:MOV R5,#8FH
YS1: MOV R6,#0FFH
YS2: DJNZR6,$
DJNZR5,YS1
RET
************************按键程序***********************
ANJIAN: JB K3,ANJIAN_0 按键K3确定修改
LCALL YS 防抖动
JB K3,ANJIAN_0
LCALL MING1
LCALL BBBB
JNB K3,$
ANJI_1: JB K2,JIAN_2 按键K2设定值加1
LCALL YS 防抖动
JB K2,JIAN_2
LCALL MING1
MOV A,SDWDG
INC A
MOV SDWDG,A
CLR C
CJNE A,#63H,JIAN_01
JMP JIAN_02
JIAN_01:JC JIAN_02
MOV SDWDG,#00H
JIAN_02:
LCALL BBBB
JNB K2,$
JIAN_2: JB K1,ANJI_3 按键K1设定值减1
LCALL YS 防抖动
JB K1,ANJI_3
LCALL MING1
MOV A,SDWDG
DEC A
MOV SDWDG,A
CLR C
CJNE A,#63H,JIAN_21
JIAN_21:JC JIAN_22
MOV SDWDG,#63H
JIAN_22:JNB K1,$
LCALL BBBB
ANJI_3: JB K3,ANJI_1 按键K3确定退出
LCALL YS 防抖动
JB K3,ANJI_1
LCALL MING1
LCALL CCCC
JNB K3,$
LJMP ANJI_4
ANJIAN_0:LJMP ANJIAN_9
ANJI_4: JB K2,JIAN_5 按键K2设定值加1
LCALL YS 防抖动
JB K2,JIAN_5
LCALL MING1
MOV A,SDWDD
INC A
MOV SDWDD,A
CLR C
CJNE A,#63H,JIAN_31
JMP JIAN_32
JIAN_31:JC JIAN_32
MOV SDWDD,#00H
JIAN_32:LCALL CCCC
JNB K2,$
JIAN_5: JB K1,ANJI_6 按键K1设定值减1
LCALL YS 防抖动
JB K1,ANJI_6
LCALL MING1
MOV A,SDWDD
DEC A
MOV SDWDD,A
CLR C
CJNE A,#63H,JIAN_41
JIAN_41:JC JIAN_42
MOV SDWDD,#63H
JIAN_42:JNB K1,$
LCALL CCCC
ANJI_6: JB K3,ANJI_4 按键K3确定退出
LCALL YS 防抖动
JB K3,ANJI_4
LCALL MING1
JNB K3,$
ANJIAN_9:LCALL CUN
RET
==============================================================
重新对 DS18B20 初始化
将设定的温度报警值写入 DS18B20
==============================================================
CUN:LCALL W18b20
MOV A,#0CCH 跳过ROM匹配
LCALL XIEB20
MOV A,#4EH写暂存寄存器
LCALL XIEB20
MOV A,SDWDG
LCALL XIEB20
MOV A,SDWDD
LCALL XIEB20
MOV A,#7FH12位精确度
LCALL XIEB20
LCALL W18B20 把 DS18B20 暂存器里的温度报警值拷贝到EEROM
MOV A,#0CCH跳过ROM匹配
LCALL XIEB20
MOV A,#48H 把暂存器里的温度报警值拷贝到EEROM
LCALL XIEB20
RET
--------------------------------------------------------------
show_g1:MOV A,#93H设置显示位置
LCALL SEND_I
MOV A,SDWDG
MOV B,#0AH
DIV AB
ADD A,#30H十位数转换为 ASCII 码
LCALL SEND_D 送显示
MOV A,B 个位数
ADD A,#30H个位数转换为 ASCII 码
LCALL SEND_D 送显示显示恒温水温度值子程序
MOV A,#94H设置显示位置
LCALL SEND_I
MOV A,#0A1H 显示温度标记℃
LCALL SEND_D
MOV A,#0E6H
LCALL SEND_D
RET
BBBB:
MOV DPTR,#M_ERRORA 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#80H 第一行起始地址
LCALL SEND_I调用写指令子程序
LCALL QUSHU
MOV DPTR,#M_ERRORB 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#90H 第二行起始地址
LCALL SEND_I调用写指令子程序
LCALL QUSHU
lcall show_g1
LJMP DDDD
CCCC:
MOV DPTR,#M_ERRORC 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#80H 第一行起始地址
LCALL SEND_I调用写指令子程序
LCALL QUSHU
MOV DPTR,#M_ERRORD 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#90H 第二行起始地址
LCALL SEND_I调用写指令子程序
LCALL QUSHU
lcall show_d
DDDD: MOV DPTR,#M_ERROR3 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#88H 第三行起始地址
LCALL SEND_I调用写指令子程序
LCALL QUSHU
MOV DPTR,#M_ERROR4 指针指到显示信息区
MOV COUNT,#10H 地址计数器设为16
MOV A,#98H 第四行起始地址
LCALL SEND_I调用写指令子程序
LCALL QUSHU
RET
--------------------------------------------------------------
M_OK1: DB '设定低温度:' 显示在第一行
M_OK2: DB '设定高温度:' 显示在第二行
M_OK3: DB '实际温度: ' 显示在第三行
M_OK4: DB ' QQ:80908900 ' 显示在第四行
M_ERRORA: DB ' 设定高温度! ' 显示在第一行
M_ERRORB: DB '' 显示在第二行
M_ERRORC: DB ' 设定低温度! ' 显示在第一行
M_ERRORD: DB ' ' 显示在第二行
M_ERROR1: DB ' 温度探头错误!' 显示在第一行
M_ERROR2: DB '请检查!' 显示在第二行
M_ERROR3: DB '风也有情' 显示在第三行
M_ERROR4: DB ' QQ:80908900 ' 显示在第四行
*************************************************************
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)