?? main._c
字號:
//ICC-AVR application builder : 2005-11-2 16:28:30
// Target : 8515
// Crystal: 4.0000Mhz
#include <io8515v.h>
#include <macros.h>
#include <162-1302.h>
#include <function.h>
uchar temh_d;
uchar teml_d;
uchar temm_d;
uchar flag=0;
uchar n=0;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFF;
DDRC = 0xFF;
PORTD = 0x00;
DDRD = 0x00;
} //call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR = 0x00;
GIMSK = 0x40;
TIMSK = 0x00;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void delay_nms(uchar n)
{
unsigned char a, b;
for (a = 1; a<n; a++)
for (b = 1; b<10; b++)
;
}
void delay_ns(uchar n)
{ unsigned char b;
for(b=0;b<n;b++)
delay_nms(200);
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
uchar i;
uint user_code=0;
uint data_code=0,store;
CLI(); //關閉中斷
//**********************目的是檢測在3毫秒內如果出現高電平就退出解碼程序
for(i=0;i<3;i++)
{
delay_nms(90); //延時1ms
if(PIND&0X04)
{
goto ret;
}
}
//**********************等高電平出現,再延時4.7ms,跳過結果碼
while(!(PIND&004));
while(PIND&0X04);
//**********************開始接收用戶碼
for(i=0;i<16;i++)
{
while(!(PIND&0X04));
delay_nms(90); //延時1.05ms
if(PIND&0X04)
{
user_code|=(1<<i);
}
else
{
user_code&=~(1<<i);
}
}
//**********************開始接收數據
for(i=0;i<16;i++)
{
while(!(PIND&0X04));
delay_nms(90); //延時1.05ms
if(PIND&0X04)
{
data_code|=(1<<i);
}
else
{
data_code&=~(1<<i);
}
}
store=data_code; //采集到數據碼
delay_ns(240);
//延時50ms,不接收連續碼
//設置開關
if(store==0x0901)
{
flag^=0X01;
}
//設置時間
if(flag)
{
uchar t;
LCD_write_string(8,1,"s");
switch(store)
{
case 0x0901 :LCD_set_xy(8,1);LCD_write_char('s');n=0;LCD_set_xy(9,1);
LCD_write_char(n+48);goto ret;break;
case 0x8401 :n++;if(n>10) n=0; LCD_set_xy(9,1);
LCD_write_char(n+48); goto ret;break;
case 0x0841 :n=n-1;if(n==0) n=9; LCD_set_xy(9,1);
LCD_write_char(n+48); goto ret;break;
case 0x0441 :t=0;break;
case 0x4001 :t=1;break;
case 0x0041 :t=2;break;
case 0x8081 :t=3;break;
case 0x0141 :t=4;break;
case 0x8101 :t=5;break;
case 0x0241 :t=6;break;
case 0x0281 :t=7;break;
case 0x0541 :t=8;break;
case 0x8201 :t=9;break;
}
switch(n)
{
case 0 :write_data(0x88,((read_data(0x89))&0x0f)|(t<<4));;break;//0
case 1 :write_data(0x88,((read_data(0x89))&0xf0)|t);;break;
case 2 :write_data(0x86,((read_data(0x87))&0x0f)|(t<<4));;break;
case 3 :write_data(0x86,((read_data(0x87))&0xf0)|t);;break;
case 4 :write_data(0x84,((read_data(0x85))&0x0f)|(t<<4));;break;
case 5 :write_data(0x84,((read_data(0x85))&0xf0)|t);;break;
case 6 :write_data(0x82,((read_data(0x83))&0x0f)|(t<<4));;break;
case 7 :write_data(0x82,((read_data(0x83))&0xf0)|t);;break;
case 8 :write_data(0x80,((read_data(0x81))&0x0f)|(t<<4));;break;
case 9 :write_data(0x80,((read_data(0x81))&0xf0)|t);;break;
case 10 :write_data(0x8a,t);;break;
}
LCD_set_xy(9,1); //這一位抗干攏
LCD_write_char(n+48);
}
else
{
LCD_DATA_PORT=0x01; //清屏
command_enable();
delay_ms(10); //等待1.53ms以上
}
ret:SEI();
}
/******************************************************
主程序
******************************************************/
void main(void)
{
uchar s,i,th,tl;
uchar temh,teml,a,count,temm;
init_devices();
init_1302();
init_1302();
init_lcd() ;
init_lcd() ;
init_time(0x00,0x01,0x02,0x03,0x04,0x05);
while(1)
{
//1302
LCD_set_xy(0,0);
//month
s=read_data(0x89);
tl=s&0x0f;
th=(s>>4);
LCD_write_char(th+48);
LCD_write_char(tl+48);
LCD_write_char(':');
//day
s=read_data(0x87);
tl=s&0x0f;
th=(s>>4);
LCD_write_char(th+48);
LCD_write_char(tl+48);
LCD_write_char(' ');
LCD_write_char(' ');
//hour
s=read_data(0x85);
tl=s&0x0f;
th=(s>>4);
LCD_write_char(th+48);
LCD_write_char(tl+48);
LCD_write_char(':');
//min
s=read_data(0x83);
tl=s&0x0f;
th=(s>>4);
LCD_write_char(th+48);
LCD_write_char(tl+48);
LCD_write_char(':');
//sec
s=read_data(0x81);
tl=s&0x0f;
th=(s>>4);
LCD_write_char(th+48);
LCD_write_char(tl+48);
//date
s=read_data(0x8b);
tl=s&0x0f;
switch(tl)
{
case 1:LCD_write_string(0,1,"monday");break;
case 2:LCD_write_string(0,1,"tuesday");break;
case 3:LCD_write_string(0,1,"wednesday");break;
case 4:LCD_write_string(0,1,"thursday");break;
case 5:LCD_write_string(0,1,"friday");break;
case 6:LCD_write_string(0,1,"saturday");break;
case 7:LCD_write_string(0,1,"sunday");break;
}
//18b20
a=init_1820(); //復位18b20
write_1820(0xCC); // SKIP THE ROM
write_1820(0x44); //啟動溫度轉換
for(i=0;i<200;i++) //每次轉換需要延時200ms以上
delay(200);
a=init_1820(); //復位18b20
write_1820(0xCC); //SKIP THE ROM
write_1820(0xBE); //讀寄存器命令
teml=read_1820(); //讀低字節數據
temh=read_1820(); //讀高字節數據
temm=teml;
temm&=0x0F;
teml>>=4;
temh<<=4;
count=teml|temh;
temh_d=count/10;
temm_d=(temm*6)/10;
teml_d=count%10;
delay(200);
LCD_set_xy(10,1);
LCD_write_char(temh_d+48);
LCD_set_xy(11,1);
LCD_write_char(teml_d+48);
LCD_set_xy(12,1);
LCD_write_char('.');
LCD_set_xy(13,1);
LCD_write_char(temm_d+48);
LCD_write_string(14,1,"`C");
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -