📄 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 + -