📄 yy.c
字号:
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
#include <string.h>
#include <math.h>
sbit RS=P1^2;
sbit RW=P1^3;
sbit E=P1^4;
sbit buz=P2^7;
unsigned char XPos;
unsigned char YPos;
#define dataport P0 //LCD数据端口
#define busy 0x80 //D7忙标志
#define nop() _nop_()
#define uchar unsigned char
unsigned int q1,q2,q3,q4,q5;q6;
char m[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
char code H[]={"H:"};
char code L[]={"L:"};
char code D[]={"C:"};
char code W[]={"T:"};
unsigned char b0=0x31,b1=0x30,b2=0x30,b3=0x30,b4=0x30,b5=0x30; //b0--通道数,b1,b2,b3,b4,b5--上限温度值
unsigned char d0=0x30,d1=0x30,d2=0x30,d3=0x30,d4=0x30; //d0,d1,b2,b3,b4--上限温度值
unsigned char Rkey=0,p=1;
float CH1=0,CH2=0,CH3=0,CH4=0, CH5=0,CH6=0, CH7=0,CH8=0;
float CL1=0,CL2=0,CL3=0,CL4=0, CL5=0,CL6=0, CL7=0,CL8=0;
unsigned char Key();
//////////////////////////////////////////////////////延时
void delay5Ms(void)
{
unsigned int i=5552;
while(i--);
}
void delay(unsigned int y)
{
while(y--);
}
void delayP(unsigned int k)
{
while(k--)
{
Rkey=Key();
if((Rkey==2)||(Rkey==1)||(Rkey==4))
break;
}
}
//*********************************************************
//读忙状态函数
//功能:先检测忙状态,D7=1,LCD忙
void checkbusy(void)
{
dataport = 0xff; //P0口写1
RS=0; //选择指令寄存器
RW=1; //读模式
nop();
E=1;
nop();
nop();
while(dataport & busy);
nop();
E=0;
}
//写入IR寄存器命令函数
//功能:向LCD写入命令字符CMD
//若ac==1,检测忙信号
void writeIR( char CMD,char mang)
{
if(mang)
checkbusy();
RS=0; //选择指令寄存器
RW=0; //选择写模式
nop();
dataport=CMD; //将命令送数据端口
nop();
E=1; //使能LCD
nop(); //将D0-D7数据送入IR
nop();
E=0; //禁止LCD
}
//写入DDR显示数据寄存器函数
//功能:在当前光标显示字符
void writeDDR(char c) //void writeDDR(char c)
{
checkbusy();
RS=1; //选择数据寄存器
RW=0;
nop();
dataport=c; //将显示字符送给数据端口
nop();
E=1; //写使能
nop();
nop();
E=0;
}
//LCD初始化
//功能:向LCD写不同的命令,
void LCDreset()
{
writeIR(0x38,0); //writeIR(0x38,0); //功能设置命令,8位接口,显示两行,
delay5Ms();
writeIR(0x38,0); //writeIR(0x38,0); //功能设置命令,8位接口,显示两行,
delay5Ms();
writeIR(0x38,0); //writeIR(0x38,0); //功能设置命令,8位接口,显示两行,
delay5Ms();
writeIR(0x38,0);
writeIR(0x38,1); //writeIR(0x38,1);
writeIR(0x08,1);//显示开关控制
writeIR(0x01,1);//清屏
writeIR(0x06,1);//输入方式设置,完成一个字符发送后。地址指针AC加1
writeIR(0x0c,1); //显示光标,
}
//光标定位函数
void LCDPos(uchar XPos, uchar YPos)
{
uchar tmp;
XPos&=0x0f;
YPos&=0x01;
tmp=XPos;
if(YPos==1)
tmp+=0xc0;
else
tmp+=0x80;
writeIR(tmp,0);
}
//在指定的行列显示字符函数
void writechar( uchar XPos, uchar YPos,char c)
{
LCDPos(XPos,YPos);
writeDDR(c);
}
//显示字符串函数
void writestring(uchar XPos, uchar YPos, char s[])
{
uchar p=0;
while(p<2)
{
writechar(XPos,YPos,s[p]);
p++;
XPos++;
}
}
//********************************************************************************
void write(void)
{
writechar(2,0,b1); //上限温度值
writechar(3,0,b2);
writechar(4,0,b3);
writechar(5,0,b4);
writechar(6,0,0x2e);
writechar(7,0,b5);
writechar(10,0,d0); //下限温度
writechar(11,0,d1);
writechar(12,0,d2);
writechar(13,0,d3);
writechar(14,0,0x2e);
writechar(15,0,d4);
writechar(3,1,b0); //通道数
}
//*******按键跳转程序*****
unsigned char Key()
{
unsigned char key,i=0;
key=P2;
key=key&0x0f; //读键值
if(key!=0x0f) //有键按下?进入键值判断
{
while(1)
{
delay(10000); //延时
key=P2;
key=key&0x0f;
switch(key)
{
case 0x0e: while(1) //有键按下?
{
key=P2;
key=key&0x0f;
if(key==0x0f) ////没有键按下就跳出
break;
}
i=1;break; //加 P2.0口底电平
case 0x0b: while(1)
{ key=P2;
key=key&0x0f;
if(key==0x0f)
break;
}
i=2;break; //移 P2.2口底电平
case 0x07: while(1)
{ key=P2;
key=key&0x0f;
if(key==0x0f)
break;
}
i=3;break; //设定 P2.3口底电平
case 0x0d: while(1)
{ key=P2;
key=key&0x0f;
if(key==0x0f)
break;
}
i=4;break; //确认/停止 P2.1口底电平
default: i=0;break;
}
if(key==0x0f)
break;
}
}
return i;
}
//所需跳转的位置数目共11位
void Rey(void)
{
if(Rkey==2)
{
p++; //p位置
if(p==12)
p=1;
}
}
//读按键按的次数
void ReadKey(void)
{
while(1)
{
Rkey=Key(); //读键值 ‘确定设定键按下
if(Rkey==3)
break;
}
while(1)
{
switch(p) //移动到所在位置
{
case 1: while(1)
{
write();
delayP(8000);
if((Rkey==2)||(Rkey==4))
break;
while(Rkey==1)
{
b0++; //通道数
if(b0==0x39)
b0=0x31;
break;
}
writechar(3,1,' ');
delayP(8000);
if((Rkey==2)||(Rkey==4)) //有移位或确定键按下跳出本次循环
break;
while(Rkey==1)
{
b0++; //通道数
if(b0==0x39)
b0=0x31;
break;
}
}
if(Rkey==2)
Rey();
break;
case 2: while(1)
{
write();
delayP(8000);
if((Rkey==2)||(Rkey==4))
break;
while(Rkey==1)
{
b1++; //上限千位
if(b1==0x32)
b1=0x30;
break;
}
writechar(2,0,' '); //上限温度值
delayP(8000);
if((Rkey==2)||(Rkey==4))
break;
while(Rkey==1)
{
b1++; //通道数
if(b1==0x32)
b1=0x30;
break;
}
}
if(Rkey==2)
Rey();
break;
case 3:
while(1)
{
write();
delayP(8000);
if((Rkey==2)||(Rkey==4))
break;
while(Rkey==1)
{
b2++; //通道数
if(b2==0x3A)
b2=0x30;
break;
}
writechar(3,0,' '); //上限温度值
delayP(8000);
if((Rkey==2)||(Rkey==4))
break;
while(Rkey==1)
{
b2++; //通道数
if(b2==0x3A)
b2=0x30;
break;
}
}
if(Rkey==2)
Rey();
break;
case 4:
while(1)
{
write();
delayP(8000);
if((Rkey==2)||(Rkey==4))
break;
while(Rkey==1)
{
b3++; //通道数
if(b3==0x3A)
b3=0x30;
break;
}
writechar(4,0,' '); //上限温度值
delayP(8000);
if((Rkey==2)||(Rkey==4))
break;
while(Rkey==1)
{
b3++; //通道数
if(b3==0x3A)
b3=0x30;
break;
}
}
if(Rkey==2)
Rey();
break;
case 5:
while(1)
{
write();
delayP(8000);
if((Rkey==2)||(Rkey==4))
break;
while(Rkey==1)
{
b4++;
if(b4==0x3A)
b4=0x30;
break;
}
writechar(5,0,' '); //上限温度值
delayP(8000);
if((Rkey==2)||(Rkey==4))
break;
while(Rkey==1)
{
b4++;
if(b4==0x3A)
b4=0x30;
break;
}
}
if(Rkey==2)
Rey();
break;
case 6: while(1)
{
write();
delayP(8000);
if((Rkey==2)||(Rkey==4))
break;
while(Rkey==1)
{
b5++; //通道数
if(b5==0x3A)
b5=0x30;
break;
}
writechar(7,0,' '); //上限温度
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -