本次的长短按键部分有点问题,但目前没有想出原因,这套题一开始把数据储存界面的切换状态看成S7控制/(ㄒoㄒ)/~~后期改的可能有点乱,以后有时间可能会重新完善一下,这套题我认为要注意EEPROM一个地址最大放255因此存储的时候要处理一下,至于L8的闪烁,我觉得在电压状态下闪比较合理(主要这样可以偷懒),但是如果要所以界面都可以闪的话,我也还是没有想好怎么写,其他的应该没有什么问题了,欢迎大家批评指正~~~
main.c
#include<stc15f2k60s2.h>
#include"onewire.h"
#include"iic.h"
unsigned char wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x8e,0xc1,0xc6,0x8c,0x89};//0~11不带点,22F,23U,24c,25p,26h
unsigned char tab[8]={11,11,11,11,11,11,11,11};
unsigned int count_f;//频率计数中间值
unsigned int dat_f;//频率计数最终值
unsigned char key_mode=0;
unsigned char pageadd=0;//回显状态下的翻页计数
unsigned char setadd=0;//设置状态下的增加
bit show_xb=0;//测量和回显
bit show_xs=0;//测量和设置
bit key_save=0;
bit key_showback=0;
bit flag_L8=0;
bit led_flag=0;
bit key_flag=0;
bit flag_fast=0;
void delayms(unsigned int ms)
{
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<845;j++);
}
void HC_138(unsigned char m)
{
switch(m)
{
case(4):P2|=0X80;P2&=0X9F;break;
case(5):P2|=0XA0;P2&=0XBF;break;
case(6):P2|=0XC0;P2&=0XDF;break;
case(7):P2|=0XE0;P2&=0XFF;break;
}
}
void allinit()
{
HC_138(4);P0=0XFF;
HC_138(5);P0=0X00;
HC_138(6);P0=0X00;
HC_138(7);P0=0XFF;
}
void timerinit()
{
TMOD=0x16;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
TH0=0xff;
TL0=0xff;
EA=1;
TR1=1;
ET1=1;
ET0=1;
TR0=1;
}
void time0() interrupt 1
{
count_f++;
}
void time1() interrupt 3
{
static int t=0,i=0,m=0,k=0,n=0;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
t++;
if(t==1000)
{
dat_f=count_f;
count_f=0;
t=0;
}
HC_138(6);
P0=wei[i];
HC_138(7);
P0=duan[tab[i]];
i++;
if(i==8)
i=0;
m++;
if(m==100)
{
m=0;
led_flag=~led_flag;
}
if(key_flag==1)
{
k++;
if(k==2000)
{
k=0;
flag_fast=1;
key_flag=0;
}
else
flag_fast=0;
}
if(flag_L8==1)
{
n++;
if(n==800)
{
HC_138(4);
P0=0x7b;
n=0;
}
}
}
//三种模式下的数码管显示
void show_f()
{
tab[0]=22;
tab[1]=11;
tab[2]=11;
if(dat_f>=10000)
{
tab[3]=dat_f/10000;
tab[4]=dat_f%10000/1000;
tab[5]=dat_f%1000/100;
tab[6]=dat_f%100/10;
tab[7]=dat_f%10;
}
if(dat_f>=1000&dat_f<10000)
{
tab[3]=11;
tab[4]=dat_f/1000;
tab[5]=dat_f%1000/100;
tab[6]=dat_f%100/10;
tab[7]=dat_f%10;
}
if(dat_f>=100&dat_f<1000)
{
tab[3]=11;
tab[4]=11;
tab[5]=dat_f/100;
tab[6]=dat_f%100/10;
tab[7]=dat_f%10;
}
}
void show_t()
{
tab[0]=24;
tab[1]=11;
tab[2]=11;
tab[3]=11;
tab[4]=tempget()/1000;
tab[5]=tempget()%1000/100+12;
tab[6]=tempget()%100/10;
tab[7]=tempget()%10;
}
void show_u()
{
tab[0]=23;
tab[1]=11;
tab[2]=11;
tab[3]=11;
tab[4]=11;
tab[5]=11;
tab[6]=(AD_read(0x03)*19)/1000+12;
tab[7]=(AD_read(0x03)*19)%1000/100;
}
按键
void keyscan()
{
if(P33==0)
{
delayms(10);
if(P33==0) //s4
{
if(key_showback==0)
{
key_mode++;
show_xb=0;
pageadd=0;
}
if(key_showback==1)
{
pageadd++;
if(pageadd==3)
pageadd=0;
}
}
while(!P33);
}
if(P32==0) //s5
{
delayms(10);
if(P32==0)
{
key_save=1;
}
while(!P32);
}
if(P31==0)//s6
{
// delayms(10);
// if(P31==0)
// {
key_flag=1;
flag_L8=0;
if(flag_fast==0)
{
key_mode=0;
HC_138(4);
P0=0xff;
if(show_xs==0)
{
key_showback=~key_showback;
show_xb=~show_xb;
}
if(show_xs==1)
{
setadd++;
EEPROM_WRITE(0x34,setadd);//设定值
delayms(10);
if(setadd>=51)
setadd=0;
}
}
else if(flag_fast==1)
{
if(show_xs==1)
{
setadd=setadd+10;
if(setadd>=51)
setadd=0;
key_flag=0;
flag_fast=0;
}
}
while(!P31);
// }
}
if(P30==0)//s7
{
delayms(10);
if(P30==0)
{
HC_138(4);
P0=0xff;
flag_L8=0;
key_mode=0;
if(key_showback==0)
{
show_xs=~show_xs;
}
}
while(!P30);
}
}
void keyshow()
{
if(show_xb==0&show_xs==0)
{
if(key_mode%3==0)
{
show_t();
if(led_flag==1)
{
HC_138(4);
P0=~0x01;
}
}
if(key_mode%3==1)
{
show_u();
if(led_flag==1)
{
HC_138(4);
P0=~0x04;
}
if(setadd<(AD_read(0x03)*0.19))
{
flag_L8=1;
}
else
flag_L8=0;
}
if(key_mode%3==2)
{
show_f();
if(led_flag==1)
{
HC_138(4);
P0=~0x02;
}
}
}
if(show_xs==1)
{
tab[0]=25;
tab[1]=11;
tab[2]=11;
tab[3]=11;
tab[4]=11;
tab[5]=11;
tab[6]=EEPROM_READ(0x34)/10+12;
tab[7]=EEPROM_READ(0x34)%10;
}
if(key_save==1)
{
unsigned char low,high;
unsigned char p1,p2,p3;
p1=dat_f/10000;
p2=dat_f%1000/100;
p3=dat_f%100;
high=tempget()/100;
low=tempget()-100*high;
key_save=0;
EEPROM_WRITE(0x01,low);//温度值
delayms(10);
EEPROM_WRITE(0x02,high);//温度值
delayms(10);
EEPROM_WRITE(0x12,(AD_read(0x03)*0.19));//电压值
delayms(10);
EEPROM_WRITE(0x13,p1);//频率值
delayms(10);
EEPROM_WRITE(0x23,p2);//频率值
delayms(10);
EEPROM_WRITE(0x33,p3);//频率值
delayms(10);
// EEPROM_WRITE(0x34,setadd);//设定值
// delayms(10);
}
if(key_showback==1&show_xb==1)
{
tab[0]=26;
tab[2]=11;
if(pageadd==0)
{
delayms(10);
tab[1]=24;
tab[3]=11;
tab[4]=EEPROM_READ(0x02)/10;
tab[5]=EEPROM_READ(0x02)%10+12;
tab[6]=EEPROM_READ(0x01)/10;
tab[7]=EEPROM_READ(0x01)%10;
}
if(pageadd==1)
{
tab[1]=23;
tab[3]=11;
tab[4]=11;
tab[5]=11;
tab[6]=EEPROM_READ(0x12)/10+12;
tab[7]=EEPROM_READ(0x12)%10;
}
if(pageadd==2)
{
tab[1]=22;
if(EEPROM_READ(0x13)!=0)
{
tab[3]=EEPROM_READ(0x13);
tab[4]=EEPROM_READ(0x23)/10;
tab[5]=EEPROM_READ(0x23)%10;
tab[6]=EEPROM_READ(0x33)/10;
tab[7]=EEPROM_READ(0x13)%10;
}
if(EEPROM_READ(0x13)==0&(EEPROM_READ(0x23)/10!=0))
{
tab[3]=11;
tab[4]=EEPROM_READ(0x23)/10;
tab[5]=EEPROM_READ(0x23)%10;
tab[6]=EEPROM_READ(0x33)/10;
tab[7]=EEPROM_READ(0x13)%10;
}
if(EEPROM_READ(0x13)==0&(EEPROM_READ(0x23)/10==0))
{
tab[3]=11;
tab[4]=11;
tab[5]=EEPROM_READ(0x23)%10;
tab[6]=EEPROM_READ(0x33)/10;
tab[7]=EEPROM_READ(0x13)%10;
}
if(EEPROM_READ(0x13)==0&(EEPROM_READ(0x23)==0))
{
tab[3]=11;
tab[4]=11;
tab[5]=11;
tab[6]=EEPROM_READ(0x33)/10;
tab[7]=EEPROM_READ(0x13)%10;
}
}
}
}
void main()
{
allinit();
timerinit();
while(1)
{
keyscan();
keyshow();
}
}
iic自己写的部分,其他就是用的给定的驱动代码
//AD读数据
unsigned char AD_read(unsigned char add)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_Stop();
return temp;
}
///EEPROM存储
void EEPROM_WRITE(unsigned char add,unsigned int dat)
{
IIC_Start();
IIC_SendByte(0xA0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
///EEPROM读取
unsigned char EEPROM_READ(unsigned char add)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0xA0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0xA1);
IIC_WaitAck();
temp=IIC_RecByte();
IIC_Stop();
return temp;
}
onewire自己补充的部分,要注意的是延时时间要扩大10倍
unsigned int tempget()
{
unsigned char low,high;
unsigned int temp;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
high=high&0x0f;
temp=(unsigned int)(((high<<8)|low)*6.25 );
return temp;
}