液晶显示器通用子程序.docx
《液晶显示器通用子程序.docx》由会员分享,可在线阅读,更多相关《液晶显示器通用子程序.docx(19页珍藏版)》请在冰豆网上搜索。
液晶显示器通用子程序
#include//头文件
#include
#include//
#include//Keillibrary
//**************************************
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint//定义一下方便使用
#defineulongunsignedlong//定义一下方便使用
#defineTEMP_ML0x03//00000011温度命令
#defineHUMI_ML0x05//00000101温度命令
unsignedcharerror;//全局错误变量
unsignedcharack;//全局应答变量
//floattemp_zi;//全局应答变量
//floathumi_zi;//全局应答变量
unsignedchartemp_h;//全局应答变量
unsignedchartemp_LL;//全局应答变量
text_jishuan_temp();
text_jishuan_humi();
voidkey();
voidbujindianjiqudong();//电机执行程序
ucharp;
bitfanzhuan,zhengzhuan;
ucharnn,jishu,jishu2,rh;
signedchary;
ucharjishu1;
codedzf[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
codedzz[8]={0x08,0x09,0x01,0x03,0x02,0x06,0x04,0x0c,};
unsignedintxianzhi_t=0;//温度显值
unsignedintxianzhi_h=0;//湿度显值
ucharsetzhi_h,setzhi_l;
bitsetbz_h,setbz_l,setkey;
sbitDATA=P2^7;//数据
sbitSCK=P2^6;//时钟
//*******************************基本驱动程
uchardis_buf[32];
ucharpos_d;
uchardis_d;
sbitrs=P3^5;
sbitrw=P3^6;
sbiten=P3^7;
sbithi=P2^0;
sbitlo=P2^1;
sbittiaozheng=P2^2;
ucharhiset,loset;
//------------------------------------------------------------
bitr_busy()//测试忙状态
{
bitbusy;
rs=0;
rw=1;
en=0;
_nop_;
en=1;
//busy=(bit)(P0&0x80);
if((P0&0X80)==0X80)busy=0;elsebusy=0;
en=0;
returnbusy;
}
//------------------------------------------------------------
voidw_cmd(cmd)//写命令
{
rs=0;
rw=0;
en=0;
P0=cmd;
en=1;
en=0;
}
//------------------------------------------------------------
voidw_pos(ucharpos)//写显示位置地址数据
{
w_cmd(pos+0x80);//显示第一行或第二行,第一行0x80
}
//------------------------------------------------------------
voidw_pos1(ucharpos)//写显示位置地址数据
{
w_cmd(pos+0xc0);//显示第一行或第二行,第一行0x80
}
//------------------------------------------------------------
voidw_dat(uchardat)//写数据
{
while(r_busy());
rs=1;
rw=0;
en=0;
P0=dat;
en=1;
en=0;
}
//------------------------------------------------------------
voiddelay1(ucharms)//延时子程序
{
uchari;
while(ms--)
{
for(i=0;i<220;i++);
}
}
//------------------------------------------------------------
dis_dat()//数据转换
{dis_buf[0]='R';//显示RHHxx
dis_buf[1]='H';
dis_buf[2]='H';
dis_buf[3]='';
dis_buf[4]=((hiset/10)+0x30);//;
dis_buf[5]=((hiset%10)+0x30);//;
dis_buf[6]='';
dis_buf[7]='T';//显示tEMPxxC
dis_buf[8]='E';
dis_buf[9]='M';
dis_buf[10]='P';
dis_buf[11]='';
dis_buf[12]=((xianzhi_t/100)+0x30);//;
dis_buf[13]=((xianzhi_t%100/10)+0x30);
dis_buf[14]=0xdf;
dis_buf[15]='C';
///////
dis_buf[16]='R';//显示RHLxx
dis_buf[17]='H';
dis_buf[18]='L';
dis_buf[19]='';
dis_buf[20]=((loset/10)+0x30);//;
dis_buf[21]=((loset%10)+0x30);//;
dis_buf[22]='';
dis_buf[23]='';
dis_buf[24]='';
dis_buf[25]='R';
dis_buf[26]='H';
dis_buf[27]='';
dis_buf[28]=((xianzhi_h/100+0x30));//相对湿度
dis_buf[29]=((xianzhi_h%100/10)+0x30);
dis_buf[30]='%';
//*/
}
//------------------------------------------------------------
voidlcd_inti(void)//lcd初始化
{
delay1(15);
w_cmd(0x01);//清屏
delay1(15);
w_cmd(0x09);//设定输入模式,地址递加
delay1(15);
w_cmd(0x38);//功能设置,数据长度8位,双列字形,1:
5*10字形
delay1(15);
w_cmd(0x0c);//开显示,关闭光标字符不闪烁
delay1(15);
}
/****************************************************
函数:
电机反转转驱动
*****************************************************/
voiddjf()//电机fan转
{
fanzhuan=1;
if(zhengzhuan==1){if(y==0)y=8;if(y==1)y=9;y=y-1;zhengzhuan=0;}
while
(1)
{y--;
P1=dzf[y];jishu1--;
delay1(20);
if(y==0)y=8;
nn++;
if(nn==jishu2){nn=0;break;}
}
}
/****************************************************
函数:
电机正转驱动
*****************************************************/
voiddjz()//电机正转
{
zhengzhuan=1;
if(fanzhuan==1)
{
y++;if(y==8)y=0;fanzhuan=0;
}
while
(1)
{
P1=dzf[y];jishu1++;
delay1(20);
y++;if(y==8)y=0;
nn++;
if(nn==jishu){nn=0;break;}
}
}
read()//读一个字节返回应答信号
//----------------------------------------------------------------------------------
//readsabyteformtheSensibusandgivesanacknowledgeincaseof"ack=1"
{
unsignedchari,val=0;
temp_LL=0;
temp_h=0;
DATA=1;//释放数据总线
for(i=0x80;i>0;i/=2)//位移8位
{SCK=1;//上升沿读入
if(DATA)val=(val|i);//确定值
SCK=0;
}
DATA=0;//读应答信号,有应答为1,为应答为0通过CPU下拉为应答
SCK=1;//第9个脉冲
_nop_();_nop_();_nop_();//pulswithapprox.5us
SCK=0;
DATA=1;//释放数据总线
temp_h=val;
val=0;
////低8位/////////////////////////////
DATA=1;//释放数据总线
for(i=0x80;i>0;i/=2)//位移8位
{SCK=1;//上升沿读入
if(DATA)val=(val|i);//确定值
SCK=0;
}
DATA=1;//0;//不需要应答通过CPU下拉为应答
SCK=1;//第9个脉冲
_nop_();_nop_();_nop_();//pulswithapprox.5us
SCK=0;
DATA=1;//释放数据总线
temp_LL=val;
}
////////////
charwrite(unsignedcharvalue)//写一个字节返回应答信号
//---------------------------------------------------------
{
unsignedchari;
ack=0;
for(i=0x80;i>0;i/=2)//释放数据总线
{if(i&value)DATA=1;//写入值
elseDATA=0;
SCK=1;//上升沿写入
_nop_();_nop_();_nop_();//延时
SCK=0;
}
DATA=1;//释放数据总线
SCK=1;//第9个脉冲
if(DATA==1)ack=1;
//读应答信号
SCK=0;
returnack;//error=1表示没有应答
}
////////
voidstart_sht11(void)//启动
//--------------------------------------------------------
{
DATA=1;SCK=0;//数据为1,SCK=0
_nop_();
SCK=1;//第一个脉冲
_nop_();
DATA=0;//数据跌落
_nop_();
SCK=0;//完成一个脉冲
_nop_();_nop_();_nop_();
SCK=1;//再一个脉冲
_nop_();
DATA=1;//数据变为1
_nop_();
SCK=0;//完成该脉冲
}
//////////////////////////////////
voidsht_rest(void)//复位
{
unsignedchari;
DATA=1;SCK=0;//数据为1时钟为0
for(i=0;i<9;i++)//9个脉冲为复位
{SCK=1;
SCK=0;
}
start_sht11();//启动
}
////////////////////////////////
//测量温度或者是温度,返回校验值
text_a(unsignedcharml)
{
unsignedinti;
start_sht11();//启动
write(ml);//写入测温度
if(ack==1)
{
sht_rest();//复位
write(ml);//写入测温度
}
for(i=0;i<55535;i++){if(DATA==0)break;};
read();//读温度
}
/////////温湿度处理//////
text_jishuan_temp11()
{
error=0;
ack=0;
sht_rest();//复位
text_a(TEMP_ML);//转换温度命令
text_jishuan_temp();//温度值转换
text_a(HUMI_ML);//湿度转换命令
text_jishuan_humi();//计数湿度
}
//////////计算温度////
text_jishuan_temp()
{
floataa=0,bb=0,temp_zi;
intabcd=0;
aa=(float)temp_h*256+(float)temp_LL;
temp_zi=0.01*aa-40;
if(temp_zi<0)
{
temp_zi=0;
}
temp_zi=temp_zi*10;
xianzhi_t=(int)temp_zi;//给显示值
}
///////计算湿度//////
text_jishuan_humi()
{
floataa=0,bb=0,humi_zi;intabcd=0;
aa=(float)temp_h*256+(float)temp_LL;
bb=aa*aa*2.8/1000000;
aa=0.0405*aa;
aa=aa-4-bb;
humi_zi=aa;
humi_zi=humi_zi*10-20;
xianzhi_h=(int)humi_zi;
rh=xianzhi_h/10;//求对比参数
}
voidkey()//按键检测处理程序
{
if(tiaozheng==0){delay1(10);if(tiaozheng==0){while(tiaozheng==0);p++;}}//确认调整键
while(p!
=0)//调整键按键程序循环
{
if(tiaozheng==0){delay1(10);if(tiaozheng==0){while(tiaozheng==0);p++;}}//确认调整键
if(p==1)////RHH设定
{delay(5);
if(hi==0)
{
delay(10);
if(hi==0)while(hi==0);
hiset++;
}
if(lo==0)
{
delay(10);
if(lo==0)while(lo==0);
hiset--;
}
delay(5);
w_pos(4);
delay(5);
w_cmd(0x0c);
delay(5);
w_dat((hiset/10)+0x30);//;
delay(5);
w_dat((hiset%10)+0x30);//;
delay(5);
w_pos(5);
delay(5);//while
(1);
w_cmd(0x0f);
delay1(100);
}
if(p==2)//RHL设定
{
delay(5);
if(hi==0)
{
delay(10);
if(hi==0)while(hi==0);
loset++;
}
if(lo==0)
{
delay1(10);
if(lo==0)while(lo==0);
loset--;
}
delay(5);
w_pos1(4);
delay(5);
w_cmd(0x0c);
delay(5);
w_dat((loset/10)+0x30);//;
delay(5);
w_dat((loset%10)+0x30);//;
delay(5);
w_pos1(5);
delay(5);
w_cmd(0x0f);
delay1(100);
}
if(p>=3)//当调整键按下3次是退出循环回到主程序
{p=0;
delay(5);
w_cmd(0x0c);//开显示,关闭光标字符不闪烁
delay(5);
break;
}
}
}
voidbujindianjiqudong()//步进电机执行命令
{
if(rh>hiset)//实际湿度值超过设定的最大湿度值时阀门角为0度
{
if(jishu1!
=0)
{
jishu2=jishu1;djf();
}
}//湿度超标关闭阀门角度为0
if(rh{
if(jishu1!
=18)
{
jishu=(18-jishu1);djz();//1
}
}
if((rh>=loset)&(rh<=hiset))//实际湿度值介于设定值时阀门角为45度
{
if(jishu1!
=9)
{
if(jishu1<9)
{
jishu=(9-jishu1);djz();
}
if(jishu1>9)
{
jishu2=(jishu1-9);djf();
}
}
}
}
///////延时///////
delay(inti)
{
while(--i);
}
//系统初始化///
csh()
{
P0=0XFF;
P1=0XF0;
P2=0xff;
P3=0XFF;
loset=40;//默认设定参数
hiset=60;
}
main()
{
lcd_inti();
setzhi_h=22;//设置高温
setzhi_l=20;//设置低温
csh();//系统初始化
while
(1)//
{
text_jishuan_temp11();//测温湿度
for(pos_d=0;pos_d<31;pos_d++)
{
if(pos_d<16)w_pos(pos_d);//写地址
else
{
dis_dat();//数据转换
w_pos1(pos_d-16);
}
dis_d=dis_buf[pos_d];
w_dat(dis_d);
delay1(10);
key();
bujindianjiqudong();
}
}
}