?? system_alarm.c
字號:
DisplayOneChar(10,0,seconde%10+0x30);
DisplayOneChar(4,1,K/10+0x30);
DisplayOneChar(5,1,K%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
WriteCommandLCM(0x0f,1); //顯示屏打開,光標顯示,閃爍,檢測忙信號
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
}
/**************液晶顯示子函數3*****************/
void displayfun3(void)
{
WriteCommandLCM(0x0c,1); //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30);
DisplayOneChar(4,1,K/10+0x30);
DisplayOneChar(5,1,K%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
WriteCommandLCM(0x0f,1); //顯示屏打開,光標顯示,閃爍,檢測忙信號
DisplayOneChar(6,0,minite/10+0x30);
DisplayOneChar(7,0,minite%10+0x30);
}
/**************液晶顯示子函數4 *****************/
void displayfun4(void)
{
WriteCommandLCM(0x0c,1); //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
DisplayOneChar(6,0,minite/10+0x30);
DisplayOneChar(7,0,minite%10+0x30);
DisplayOneChar(9,0,seconde/10+0x30);
DisplayOneChar(10,0,seconde%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
WriteCommandLCM(0x0f,1); //顯示屏打開,光標顯示,閃爍,檢測忙信號
DisplayOneChar(4,1,K/10+0x30);
DisplayOneChar(5,1,K%10+0x30);
}
/**************鍵盤掃描子函數******************/
void keyscan(void)
{
uchar xx; //局部變量
P1=0xff;
if(P1!=0xff)
{
delay_LCM(50);
if(P1!=0xff)
{
xx=P1;
switch(xx) // 根據按鍵狀態,調用不同的子函數
{
case 0xfe:set_adj(); break;
case 0xfd:inc_key(); break;
case 0xfb:dec_key(); break;
case 0xf7:{delay_LCM(150);ON_OFF=!ON_OFF;while(!BLUE_ALARM);} break;
default:break;
}
}
}
}
/**************設定工作模式子函數****************/
void set_adj(void)
{
delay_LCM(100);
set++;
if(set>=4)set=0;
while(!RED_ALARM);
}
/****************按鍵加法子函數******************/
void inc_key(void)
{
delay_LCM(150);
switch(set)
{
case 0:if(P1==0xf7){delay_LCM(150);ON_OFF=!ON_OFF;} break;
case 1:hour++; if(hour>=23)hour=23; break;
case 2:minite++; if(minite>=59)minite=59;break;
case 3:K++;if(K>=99)K=99; break;
default:break;
}
while(!WRITE_ALARM);
}
/****************按鍵減法子函數*****************/
void dec_key(void)
{
delay_LCM(150);
switch(set)
{
case 0:if(P1==0xf7){delay_LCM(150);ON_OFF=!ON_OFF;} break;
case 1:hour--; if(hour<=0)hour=0; break;
case 2:minite--;if(minite<=0)minite=0;break;
case 3:K--;if(K<=1)K=1; break;
default:break;
}
while(!GREEN_ALARM);
}
/////////24C02讀寫驅動程序////////////////////
void delay1(uchar x)
{
uint i;
for(i=0;i<x;i++);
}
void flash()
{ ; ; }
void x24c02_init() //24c02初始化子程序
{
scl=1;
flash();
sda=1;
flash();
}
void start() //啟動I2C總線
{
sda=1;
flash();
scl=1;
flash();
sda=0;
flash();
scl=0;
flash();
}
void stop() //停止I2C總線
{
sda=0;
flash();
scl=1;
flash();
sda=1;
flash();
}
void writex(uchar j) //寫一個字節
{
uchar i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
flash();
sda=CY;
flash();
scl=1;
flash();
}
scl=0;
flash();
sda=1;
flash();
}
uchar readx() //讀一個字節
{
uchar i,j,k=0;
scl=0;
flash();
sda=1;
for (i=0;i<8;i++)
{
flash();
scl=1;
flash();
if (sda==1) j=1;
else j=0;
k=(k<<1)|j;
scl=0;
}
flash();
return(k);
}
void clock() //I2C總線時鐘
{
uchar i=0;
scl=1;
flash();
while ((sda==1)&&(i<255))i++;
scl=0;
flash();
}
////////從24c02的地址address中讀取一個字節數據/////
uchar x24c02_read(uchar address)
{
uchar i;
start();
writex(0xa0);
clock();
writex(address);
clock();
start();
writex(0xa1);
clock();
i=readx();
stop();
delay1(10);
return(i);
}
//////向24c02的address地址中寫入一字節數據info/////
void x24c02_write(uchar address,uchar info)
{
EA=0;
start();
writex(0xa0);
clock();
writex(address);
clock();
writex(info);
clock();
stop();
EA=1;
delay1(50);
}
/***************定時器t0初始化*******************/
void init_timer0(void)
{
TMOD=0x01; //time0為定時器,方式1
TH0=0x3c; //預置計數初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
}
/***********定時器t0中斷子函數**************/
void timer0(void) interrupt 1 using 0 //定時器0方式1,50ms中斷一次
{
TH0=0x3c;
TL0=0xb0;
mstcnt++;
if(mstcnt>=20 ) {seconde++; write=1; mstcnt=0; }
if(seconde>=60) {minite++; seconde=0;}
if(minite>=60 ) {hour++; minite=0; }
if(hour>=24 ) {hour=0;}
keyscan( ); //按鍵掃描
}
/***********the main funtion*************/
void main(void)
{
P1=0xff; //初始化p1口,全設為1
x24c02_init(); //初始化24C08
K=x24c02_read(2); //讀出保存的數據賦于K
seconde=x24c02_read(4);
minite=x24c02_read(6);
hour=x24c02_read(8);
delay_LCM(500); //延時500ms啟動
initLCM( ); //LCD初始化
init_timer0( ); //時鐘定時器0初始化
Init_DS18B20( ) ; //DS18B20初始化
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
while (1)
{
keyscan(); //按鍵掃描
ReadTemperature(); //溫度采集
switch(set) //LCD根據工作模式顯示
{
case 0:displayfun1();delay_LCM(1000);break; //正常工作顯示
case 1:displayfun2();delay_LCM(1000);break; //調整時顯示
case 2:displayfun3();delay_LCM(1000);break; //調整分顯示
case 3:displayfun4();delay_LCM(1000);break; //溫度設定
default:break;
}
keyscan( ); //相當于延時
if(ON_OFF==1) //若溫控標志位1, 控制LAMP動作
{
if(temp1>=K+1){outflag=1;OUT=0;}
if(temp1<K)
{
delay_LCM(1000);
if(temp1<K){outflag=0;OUT=1;} //
}
}
else{outflag=0;OUT=1;}
if(write==1) //判斷計時器是否計時一秒
{
write=0; //清零
x24c02_write(8,hour); //在24c08的地址2中寫入數據hour
delay_LCM(11);
x24c02_write(6,minite);
delay_LCM(11);
x24c02_write(4,seconde);
delay_LCM(11);
x24c02_write(2,K);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -