📄 main.c
字号:
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
#define rs RB0
#define rw RB1
#define en RB2
#define busy RC7
#define BUSYI TRISC7=1
#define BUSYO TRISC7=0
#define DATA PORTC
uchar flag,temp,sum,i,t1,m1,m2,f1,f2,s1,s2;
uint v;
const uchar tab1[]="Sensor is mar!";
const uchar tab2[]="100";
uchar tab[]="V: V M: %RH";
uchar tab3[]="TIME: 0000-00-00";
void delay(uchar i)
{
uchar j;
for(;i>0;i--)
for(j=10;j>0;j++);
}
void ad_init()//ad转换IO寄存器设置
{
TRISA|=0x01;
ANSEL|=0x01;
ADCON0=0x41;//Fosc/8,ADON,AN0
ADCON1=0x00;//结果左对齐,参考电压为VDD,VSS
GIE=1;
PEIE=1;
ADIE=1;
ADIF=0;
delay(1);
GODONE=1;
}
/******************************/
/* */
/* 测忙函数,返回1测忙成功,返回0失败*/
/* */
/* */
/******************************/
uchar chkbusy()
{
uchar b=0,i;
for(i=50;i>0;i--)
{
DATA=0xff; //判断液晶显示器是否忙的子程序
BUSYI;
rs=0;
rw=1;
en=0;
NOP();
en=1;
busy=busy;
if(busy==0)
{
b=1;
break;
}
}
BUSYO;
return b;
}
/******************************/
/* */
/* 写指令函数,返回1成功,返回0失败 */
/* */
/* */
/******************************/
uchar write_com(uchar com)
{
uchar b=0;
if(chkbusy())
{
DATA=com;
rs=0;
rw=0;
en=1;
NOP();
en=0;
b=1;
}
return b;
}
uchar write_dat(uchar dat)
{
uchar b=0;
if(chkbusy())
{
DATA=dat;
rs=1;
rw=0;
en=1;
NOP();
en=0;
b=1;
}
return b;
}
void lcd_init()//1602端口设置,初始化设置以及显示框架字符
{
uchar n;
TRISC=0x00;
PORTC=0x00;
TRISB&=0xf8;
ANSELH=0x00;
en=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
uchar num_change(uchar tep)//计算电压,湿度值
{
float y,yy;
uchar tt;
y=(float)(tep)/51;
yy=y;
v=(uint)(100*yy);
tt=(uchar)((y-0.8)/0.031);
return tt;
}
void write_m(uchar num,uchar location)//写1602湿度值
{
uchar t1,t2,j;
if((num>100)&&(num<0))
{
write_com(0x01);
write_com(location);
for(j=0;j<14;j++)
{
write_dat(tab1[j]);
delay(1);
}
}
else if(num==100)
{
write_com(location);
for(j=0;j<3;j++)
{
write_dat(tab2[j]);
delay(1);
}
}
else
{
t1=num/10;
t2=num%10;
write_com(location);
write_dat(t1+0x30);
delay(1);
write_dat(t2+0x30);
delay(1);
}
}
void write_v(uint x,uchar com)//写1602电压值
{
uchar x1,x2,x3;
x1=(uchar)(x/100);
x2=(uchar)((x-x1*100)/10);
x3=(uchar)(x%10);
write_com(com);
write_dat(x1+0x30);
write_dat(0x2e);
write_dat(x2+0x30);
write_dat(x3+0x30);
}
void write_dats(uchar location,uchar num,uchar *p)
{
uchar ii,tp; //在任意位置,写任意字符
write_com(location);
while(ii!=num)
{
tp=*p;
write_dat(tp);
p++;
ii++;
}
ii=0;
}
void write(uchar com,uchar dat)
{
write_com(com);
write_dat(dat);
}
void tmr1_init()//定时器1初始化
{
GIE=1;
PEIE=1;
TMR1IE=1;
TMR1IF=0;
T1CON=0x30;
TMR1L=0xd5;//定时0.5s
TMR1H=0x0b;
TMR1ON=1;
}
void interrupt ad_int()//中断程序
{
if(ADIF==1)
{
ADIF=0;
}
if(TMR1IF==1)
{
TMR1L=0xd5;
TMR1H=0x0b;
TMR1IF=0;
t1++;
if(t1==2)
{
t1=0;
flag=1;
m1++;
if(m1==10)
{
m1=0;
m2++;
if(m2==6)
{
m2=0;
f1++;
if(f1==10)
{
f1=0;
f2++;
if(f2==6)
{
s1++;
if(s1==10)
{
s2++;
}
}
}
}
}
}
}
}
void save_time()//保存时间
{
eeprom_write(0x00,s2);
eeprom_write(0x01,s1);
eeprom_write(0x02,f2);
eeprom_write(0x03,f1);
eeprom_write(0x04,m2);
eeprom_write(0x05,m1);
}
void read_time()//读取时间
{
s2=eeprom_read(0x00);
s1=eeprom_read(0x01);
f2=eeprom_read(0x02);
f1=eeprom_read(0x03);
m2=eeprom_read(0x04);
m1=eeprom_read(0x05);
if(s2>9)
{
s2=0;
}
if(s1>9)
{
s1=0;
}
if(f2>9)
f2=0;
if(f1>9)
f1=0;
if(m2>9)
m2=0;
if(m1>9)
m1=0;
}
void show_time()//显示时间
{
write(0xc8,s2+0x30);
write(0xc9,s1+0x30);
write(0xcb,f2+0x30);
write(0xcc,f1+0x30);
write(0xce,m2+0x30);
write(0xcf,m1+0x30);
}
void disp_init()//显示框架
{
write_dats(0x80,16,tab);
write_dats(0xc0,16,tab3);
show_time();
}
void main()
{
read_time();
lcd_init();
disp_init();
ad_init();
tmr1_init();
while(1)
{
if(flag==1)
{
flag=0;
temp=ADRESH;
sum=num_change(temp);
GODONE=1;
write_v(v,0x82);
write_m(sum,0x8b);
show_time();
save_time();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -