📄 zhouyi.c
字号:
LCD_E=1;
//DelayNS(1);
LCD_E=0;
//dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)
}
//while(1);
}
void SendCommandToLCD(uchar command) //写命令到LCD中
{
CheckState();
LCD_RS=0; //向LCD发送命令
LCD_RW=0;
data_IO=(data_IO & 0x00) | command; //command :命令
LCD_E=1;
LCD_E=0;
}
void SetLine(uchar page) //设置页 0xb8是页的首地址
{
page=0xb8|page; //1011 1xxx 0<=page<=7 设定页地址--X 0-7,8行为一页64/8=8,共8页
SendCommandToLCD(page);
}
void SetStartLine(uchar idata startline) //设定显示开始行,0xc0是行的首地址
{
startline=0xc0|startline; //1100 0000
SendCommandToLCD(startline); //设置从哪行开始:0--63,一般从0 行开始显示
}
void SetColumn(uchar idata column) //设定列地址--Y 0-63 ,0x40是列的首地址
{
column=column &0x3f; //column最大值为64,越出 0=<column<=63
column= 0x40|column; //01xx xxxx
SendCommandToLCD(column);
}
void SetOnOff(uchar idata onoff) //开关显示,0x3f是开显示,0x3e是关显示
{
onoff=0x3e|onoff; //0011 111x,onoff只能为0或者1
SendCommandToLCD(onoff);
}
void WriteByte(uchar idata dat) //写显示数据
{
CheckState();
LCD_RS=1;
LCD_RW=0;
data_IO=(data_IO & 0x00) | dat; //dat:显示数据
LCD_E=1;
LCD_E=0;
}
void SelectScreen(uchar idata screen) //选择屏幕screen: 0-全屏,1-左屏,2-右屏
{
switch(screen)
{ case 0: cs1=0;//全屏
// _nop_(); _nop_(); _nop_();
cs2=0;
// _nop_(); _nop_(); _nop_();
break;
case 1: cs1=0;//左屏
// _nop_(); _nop_(); _nop_();
cs2=1;
//_nop_(); _nop_(); _nop_();
break;
case 2: cs1=1;//右屏
// _nop_(); _nop_(); _nop_();
cs2=0;
//_nop_(); _nop_(); _nop_();
break;
}
}
void ClearScreen(uchar idata screen) //清屏screen: 0-全屏,1-左屏,2-右
{
uchar idata i,j;
SelectScreen(screen);
for(i=0;i<8;i++) //控制页数0-7,共8页
{
SetLine(i);
SetColumn(0);
for(j=0;j<64;j++) //控制列数0-63,共64列
{
WriteByte(0x00); //写点内容,列地址自动加1
}
}
}
void InitLCD() //初始化LCD
{
CheckState();
SelectScreen(0);
SetOnOff(0); //关显示
SelectScreen(0);
SetOnOff(1); //开显示
SelectScreen(0);
ClearScreen(0);//清屏
SetStartLine(0); //开始行:0
}
void WriteChinese(uchar ss,uchar page,uchar column,uchar menu,uchar hz[])
{
uchar i; //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出,menu为菜单选项
SelectScreen(ss);
column=16*column; //汉字是16X16的,每隔16列扫描
column=column&0x3f;
SetLine(page); //写上半页
SetColumn(column); //控制列
if(menu==1)
for(i=0;i<16;i++) //控制16列的数据输出
{
//WriteByte(Hzk[i+32*number]); //i+32*number汉字的前16个数据输出
WriteByte(0xff-hz[i]);
}
else
for(i=0;i<16;i++) //控制16列的数据输出
{
//WriteByte(Hzk[i+32*number]); //i+32*number汉字的前16个数据输出
WriteByte(hz[i]);
}
SetLine(page+1); //写下半页
SetColumn(column); //控制列
if(menu==1)
for(i=0;i<16;i++) //控制16列的数据输出
{
//WriteByte(Hzk[i+32*number+16]); //i+32*number+16汉字的后16个数据输出
WriteByte(0xff-hz[i+16]);
}
else
for(i=0;i<16;i++) //控制16列的数据输出
{
//WriteByte(Hzk[i+32*number+16]); //i+32*number+16汉字的后16个数据输出
WriteByte(hz[i+16]);
}
}
void WriteDigit(uchar ss,uchar page,uchar column,uchar digit[])
{
uchar i; //选屏参数,pagr选页参数,column选列参数,number选第几汉字输出
SelectScreen(ss);
column=8*column; //数字是8X16的,每隔8列扫描
column=column&0x3f;
SetLine(page); //写上半页
SetColumn(column); //控制列
for(i=0;i<8;i++) //控制16列的数据输出
{
//WriteByte(Hzk[i+32*number]); //i+32*number汉字的前16个数据输出
WriteByte(digit[i]);
}
SetLine(page+1); //写下半页
SetColumn(column); //控制列
for(i=0;i<8;i++) //控制16列的数据输出
{
//WriteByte(Hzk[i+32*number+16]); //i+32*number+16汉字的后16个数据输出
WriteByte(digit[i+8]);
}
}
void delay(int num)//延时函数
{
while(num--) ;
}
Init_DS18B20(void)//初始化ds1820
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
ReadOneChar(void)//读一个字节
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
WriteOneChar(unsigned char dat)//写一个字节
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
}
unsigned char *ReadTemperature(void)//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned char Temper[2]={0};
//unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //数据位
b=ReadOneChar(); //负数标志位b为0温度为正,b为0xff,温度为负
//t=a;
//t<<=8;为什么要移动8位???
// t=t|a;
//tt=t*0.0625;
//t= tt*10+0.5; //放大10倍输出并四舍五入
a=a*0.5;
Temper[0]=a;
Temper[1]=b;
return(Temper);
}
main()
{
uchar j=0,key=0,PressSign=1;
InitLCD();
ClearScreen(0);//清屏
SetStartLine(0);
//for(j=0;;j++)
//{
//SetStartLine(j);
WriteChinese(LiftHalf,Page0,0,MenuOff,liang);
WriteChinese(LiftHalf,Page0,1,MenuOff,ku);
WriteChinese(LiftHalf,Page0,2,MenuOff,jian);
WriteChinese(LiftHalf,Page0,3,MenuOff,kong);
WriteChinese(RightHalf,Page0,0,MenuOff,xi);
WriteChinese(RightHalf,Page0,1,MenuOff,tong);
//WriteChinese(RightHalf,Page0,2,MenuOn,lu);
//WriteChinese(RightHalf,Page0,2,yong);
//WriteChinese(RightHalf,Page0,3,yuan3);
WriteChinese(LiftHalf,Page2,0,MenuOff,di);
WriteChinese(LiftHalf,Page2,1,MenuOff,cone);
WriteChinese(LiftHalf,Page2,2,MenuOff,dian);
WriteChinese(LiftHalf,Page2,3,MenuOff,wen);
WriteChinese(RightHalf,Page2,0,MenuOff,du);
//WriteDigit(RightHalf,Page2,2,maohao);
WriteChinese(RightHalf,Page2,3,MenuOff,TemperatureSign);
//SetStartLine(j);
WriteChinese(LiftHalf,Page4,0,MenuOff,huang);
WriteChinese(LiftHalf,Page4,1,MenuOff,shi);
WriteChinese(LiftHalf,Page4,2,MenuOff,li);
WriteChinese(LiftHalf,Page4,3,MenuOff,gong);
//SetStartLine(j);
WriteChinese(RightHalf,Page4,0,MenuOff,xue);
WriteChinese(RightHalf,Page4,1,MenuOff,yuan4);
WriteChinese(RightHalf,Page4,2,MenuOff,zhou);
WriteChinese(RightHalf,Page4,3,MenuOff,yi);
//}
/*while(1)
{
if(P0^0==1)
{void delay();
if(P0^0==1)
{key++;PressSign=1;
if(key==5)
{
key=1;
}
}
while(P0^0==1);
}
}*/
while(1)//主循环
{ unsigned char *Temper;
unsigned char a=0,b=0,c=0,f=0,i=0;
Temper=ReadTemperature();//读温度
i=Temper[0];
a=i/100;
WriteDigit(RightHalf,Page2,3,zero+a*16);
b=i/10-a*10;
WriteDigit(RightHalf,Page2,4,zero+b*16);
c=i-a*100-b*10;
WriteDigit(RightHalf,Page2,5,zero+c*16);
if(Temper[1]==0)
WriteDigit(RightHalf,Page6,6,zero);
else
WriteDigit(RightHalf,Page6,6,zero+1*16);
DelayNS(200);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -