📄 all.c
字号:
{
ISP_ADDRL=0x00+i; //送地址低字节,均从每个扇区的起始地址开始
ISP_TRIG=0x46;
ISP_TRIG=0xB9; //触发ISP指令
Delay_short(1); //短暂延时
ID[Num][i]=ISP_DATA; //读一个字节
}
ISP_CONTR=0x00; //关ISP功能
}
/*ISP写DS18B20 ID程序 */
/*入口参数:1,DS18b20编号(0-4) */
/*全局变量:DS18B20的ID号存储区:ID[5][8] */
/*功 能:将某个DS18B20的8字节ID写入某个扇区内(扇区必须为空)*/
void ISP_Write8(unsigned char Num)
{
unsigned char i;
ISP_CONTR=0x81; //允许ISP功能,并配制等待时间
ISP_CMD=ISP_WeiteByte ; //送ISP字节写指令
ISP_ADDRH=0x20+Num*0x02; //送地址高字节
for(i=0;i<8;i++) //写8字节
{
ISP_ADDRL=0x00+i; //送地址低字节,均从每个扇区的起始地址开始
ISP_DATA=ID[Num][i]; //送待写入的一个字节
ISP_TRIG=0x46;
ISP_TRIG=0xB9; //触发ISP指令
Delay_short(1); //短暂延时
}
ISP_CONTR=0x00; //关ISP功能
}
/*ISP擦除扇区指令 */
/*入口参数:对应扇区的器件号(0-4) */
/*全局变量:无 */
/*功 能:将某个扇区擦除 */
void ISP_Eraser(unsigned char Num)
{
ISP_CONTR=0x81; //允许ISP功能,并配制等待时间
ISP_CMD=ISP_Erase ; //送ISP擦除扇区指令
ISP_ADDRH=0x20+Num*0x02; //送地址高字节
ISP_ADDRL=0x00; //送地址低字节,均从每个扇区的起始地址开始
ISP_TRIG=0x46;
ISP_TRIG=0xB9; //触发ISP指令
Delay_short(1); //短暂延时
ISP_CONTR=0x00; //关ISP功能
}
////////////////////////////////////////////////
/******************程序预定义******************/
////////////////////////////////////////////////
void Auto_Mode(void); //自动模式程序
void Hand_Mode(viod); //手动模式程序
void ID_Mode(void); //显示ID模式程序
void Alarm_Set(void); //报警设置程序
void Menu_Function(void);//菜单处理功能
/****自动切换温度显示模式程序****/
/*功能:自动从切换显示温度 */
void Auto_Mode()
{ unsigned char i;
LCD_Initial();
GotoXY(12,1);
Print("Auto");
while(1)
{
for(i=0;i<5;i++)
{
DS_ReadTemp(i); //循环显示温度和TH,TL
TempDisp(i);
ThTlDisp(i,2);
Alarm();
Menu_Function(); //菜单处理
Delay_long(200); //延时
Delay_long(200);
Delay_long(200);
Delay_long(200);
}
}
}
/****手动切换温度显示模式程序****/
/*功能:按Down键切换显示 */
void Hand_Mode()
{
LCD_Initial();
GotoXY(0,1);
Print("Hand Mode");
GotoXY(9,2);
Print("S U D Q");
while(1) //主菜单循环
{
unsigned char Key1=Key_scan();
if(Key1==SET) //如果按SET键
{Delay_long(50); //延时0.25S等待释放按键
if(Key_scan()==0) //释放后操作
{
unsigned char i=0;
LCD_Initial();
GotoXY(12,1);
Print("Hand"); //显示模式
while(1)
{
unsigned char Key2=Key_scan();
DS_ReadTemp(i);
TempDisp(i); //显示NO.i的温度
ThTlDisp(i,2);
Alarm();
if(Key2==DOWN) //如果按DOWN键
{
Delay_long(50); //延时0.25S等待释放按键
if(Key_scan()==0) //按键抬起后执行
{
i=i+1; //指针加1
if(i>4)
i=0;
}
}
else if(Key2==QUIT) //按QUIT返回自动模式
{Delay_long(50);
if(Key_scan()==0)
{
Auto_Mode();
}
}
}
}
}
else if(Key1==DOWN)
{Delay_long(50);
if(Key_scan()==0)
{
ID_Mode();
}
}
else if(Key1==UP)
{Delay_long(50);
if(Key_scan()==0)
{
Alarm_Set();
}
}
else if(Key1==QUIT)
{Delay_long(50); //延时0.25S等待释放按键
if(Key_scan()==0) //释放后操作
{
Auto_Mode();
}
}
}
}
/****显示DS18B20序列号模式程序****/
/*功能:显示或替换器件ID */
void ID_Mode(void)
{
LCD_Initial();
GotoXY(0,1);
Print(" ID Mode ");
GotoXY(9,2);
Print("S U D Q") ;
while(1) //主菜单循环
{
unsigned char Key1=Key_scan();
if(Key1==SET) //如果按SET键
{Delay_long(50); //延时0.25S等待释放按键
if(Key_scan()==0) //释放后操作
{
unsigned char i=0;
LCD_Initial();
GotoXY(0,1);
Print("Please Press D");
GotoXY(10,2);
Print("C D Q "); //显示有效按键
while(1) //进入二级菜单循环
{
unsigned char Key2=Key_scan();
if(Key2==DOWN) //如果按DOWN键
{
Delay_long(50); //延时0.25S等待释放按键
if(Key_scan()==0) //按键抬起后执行
{
i=i+1;
switch(i)
{
case 1 :Show_ID(0);break;
case 2 :Show_ID(1);break;
case 3 :Show_ID(2);break;
case 4 :Show_ID(3);break;
case 5 :Show_ID(4);break;
case 6 :i=0;break;
}
}
}
else if(Key2==CHANGE) //如果按CHANGE键
{Delay_long(200);
Delay_long(200); //延时两秒
if(Key_scan()==0)
{
DS_ReadID(i-1);
Show_ID(i-1);
ISP_Eraser(i-1);
ISP_Write8(i-1);
}
}
else if(Key2==QUIT) //按QUIT返回自动模式
{Delay_long(50);
if(Key_scan()==0)
{
Auto_Mode();
}
}
}
}
}
else if(Key1==DOWN) //按DOWN键切换至报警设置模式
{Delay_long(50);
if(Key_scan()==0)
{
Alarm_Set();
}
}
else if(Key1==UP) //按DOWN键切换至报警设置模式
{Delay_long(50);
if(Key_scan()==0)
{
Hand_Mode();
}
}
else if(Key1==QUIT) //按QUIT返回自动模式
{Delay_long(50);
if(Key_scan()==0)
{
Auto_Mode();
}
}
}
}
/*修改器件TH和TL程序 */
/*入口参数:器件序号(0-4) */
/*全局变量:DS_Tl[5] DS_Th[5]*/
void SetThTl(unsigned char Num)
{
LCD_Initial();
GotoXY(5,2);
Print("S C UD LR Q"); //显示有效按键
GotoXY(0,2);
Print("NO.");
LCD_Write(LCD_DATA,Num+1+'0');
ThTlDisp(Num,1);
while(1)
{
unsigned char Key2=Key_scan(); //二级菜单扫描
if(Key2==CHANGE)
{
Delay_long(50);
if(Key_scan()==0)
{
unsigned char i=0; //左右指示
GotoXY(8,1);
LCD_Write(LCD_DATA,0x7f);
while(1)
{
unsigned char Key3=Key_scan(); //三级菜单扫描
if(Key3==LEFT)
{
Delay_long(50);
if(Key_scan()==0)
{
i=0; //选择TH
GotoXY(15,1);
LCD_Write(LCD_DATA,0x20);
GotoXY(8,1);
LCD_Write(LCD_DATA,0x7f);
}
}
else if(Key3==RIGHT)
{
Delay_long(50);
if(Key_scan()==0)
{
i=1; //选择TL
GotoXY(8,1);
LCD_Write(LCD_DATA,0x20);
GotoXY(15,1);
LCD_Write(LCD_DATA,0x7f);
}
}
else if(Key3==UP)
{
Delay_long(100);
if(i==0)
DS_Th[Num]=DS_Th[Num]+1;
else
DS_Tl[Num]=DS_Tl[Num]+1;
ThTlDisp(Num,1);
}
else if(Key3==DOWN)
{
Delay_long(100);
if(i==0)
DS_Th[Num]=DS_Th[Num]-1;
else
DS_Tl[Num]=DS_Tl[Num]-1;
ThTlDisp(Num,1);
}
else if(Key3==SET)
{
Delay_long(50);
if(Key_scan()==0)
{
DS_Reset();
Match_ID(Num); //匹配ROM
DS_WriteByte(WRITE_SCR); //
DS_WriteByte(DS_Th[Num]);
DS_WriteByte(DS_Tl[Num]);
DS_WriteByte(0x7f);
DS_Reset();
Match_ID(Num);
DS_WriteByte(COPY_SCR);
SetThTl(Num);
}
}
else if(Key3==QUIT)
{
Delay_long(50);
if(Key_scan()==0)
{
Auto_Mode();
}
}
}
}
}
else if(Key2==DOWN)
{
Delay_long(50);
if(Key_scan()==0)
{
Num=Num+1;
if(Num>4)
Num=0;
SetThTl(Num);
}
}
else if(Key2==QUIT)
{
Delay_long(50);
if(Key_scan()==0)
{
Auto_Mode();
}
}
}
}
/****报警设置模式程序*****/
/*功能:设置Th和Tl */
void Alarm_Set()
{
LCD_Initial();
GotoXY(0,1);
Print("Alarm Set");
GotoXY(9,2);
Print("S U D Q") ;
while(1) //主菜单循环
{
unsigned char Key1=Key_scan() ;
if(Key1==SET) //如果按SET键
{Delay_long(50); //延时0.25S等待释放按键
if(Key_scan()==0) //释放后操作
{
SetThTl(0);
}
}
else if(Key1==DOWN) //按DOWN键切换至手动模式
{Delay_long(50);
if(Key_scan()==0)
{
Hand_Mode();
}
}
else if(Key1==UP) //按DOWN键切换至手动模式
{Delay_long(50);
if(Key_scan()==0)
{
ID_Mode();
}
}
else if(Key1==QUIT) //按QUIT键返回AUTO模式
{Delay_long(50);
if(Key_scan()==0)
{
Auto_Mode();
}
}
}
}
/////////////////////////////////////////////////
/*****************菜单选择部分******************/
/////////////////////////////////////////////////
void Menu_Function(void)
{
if(Key_scan()==MENU) //如果菜单键按下
{
Delay_long(200);
Delay_long(200); //延时2S(长按有效)
if(Key_scan()==MENU) //菜单键有效
{
LCD_Initial(); //初始化LCD
GotoXY(0,1);
Print("Boot Menu"); //显示"Boot Menu"
GotoXY(10,2);
Print(" D Q "); //显示有效按键
while(1)
{
unsigned char Key=Key_scan() ;
if(Key==DOWN) //如果按DOWN键
{Delay_long(50); //延时0.25S等待释放按键
if(Key_scan()==0) //按键抬起后执行
{
Hand_Mode();
}
}
else if(Key==QUIT) //如果QUIT键按下
{Delay_long(50); //延时0.25S等待释放按键
if(Key_scan()==0) //按键抬起后执行AUTO模式
{
Auto_Mode(); //返回自动模式
}
}
}
}
}
}
////////////////////////////////////////////////////////
/**********************主程序**************************/
////////////////////////////////////////////////////////
main()
{
unsigned char i;
LCD_Initial();
GotoXY(2,1);
Print("Sun Yunhui");
GotoXY(3,2);
Print("04021313"); //开机显示画面
for(i=0;i<5;i++) //将EEPROM中的ID载入RAM
ISP_Read8(i);
for(i=0;i<5;i++)
DS_ReadTemp(i); //读出器件Th和Tl
Delay_long(200);
Delay_long(200);
Auto_Mode();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -