📄 bt.c
字号:
#include <iom8v.h>
#include "bt.h"
#include <macros.h>
#include <eeprom.h>
#define uchar unsigned char
#define unit unsigned int
#define ulong unsigned long
#define xtal 8
#define fosc 8000000 //晶振8MHZ
#define baud 9600 //波特率
#define out0 PORTD&=~0X02
#define out1 PORTD|=0X02
#define be0 PORTB&=~0X40
#define be1 PORTB|=0X80
#define Set ((PIND&0X04)==0x04) //key
#define Add ((PIND&0X02)==0x02)
#define Sub ((PIND&0X01)==0x01)
#define Store (1)
uchar n,ORDER,j;
uchar t,i,j,m,s,m1,s1;
uchar mm[2]={0xbf,0xbf};
uchar date[9]={1};
unit dat;
uchar lock,dp,ready,start,win=1,xian=0;
unsigned long adc_rel[8];//AD转换结果
unsigned char adc_mux;//AD通道
//ADC initialize
// Cpbversipb time: 3uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
ADMUX = 0x40; //select adc input 0 00-ref 01-avcc 11-2.56
ACSR = 0x80;
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) ;//64分频
}
void port_init(void)
{
PORTB = 0x30;
DDRB = 0x3C;
PORTC = 0x06; //m103 output only
DDRC = 0x0F;
PORTD = 0xDf;
DDRD = 0xD8;
}
unit cw(uchar mux) ///*****检测信号*****///
{
ADMUX=(1<<REFS0)|(mux&0x0f);
ADCSRA|=0x40;
del(500);
return(ADC);
}
unit cw1(uchar mux) ///*****检测信号*****///
{
ulong adc_rel,a;
uchar i;
for(i=0;i<100;i++)
{
adc_rel+=cw(mux);
WDR();
}
a=adc_rel;
adc_rel=0;
return (unit)(a/100);
}
//TIMER1 initialize - prescale:1024
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 2Hz
// actual value: 2.000Hz (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xF0; //setup
TCNT1L = 0xBE;
OCR1AH = 0x07;
OCR1AL = 0xA1;
OCR1BH = 0x07;
OCR1BL = 0xA1;
ICR1H = 0x07;
ICR1L = 0xA1;
TCCR1A = 0x00;
TCCR1B = 0x05; //start Timer
}
//Watchdog initialize
// prescale: 512K
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR = 0x0E; //WATCHDOG ENABLED - dont forget to issue WDRs
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
watchdog_init();
timer1_init();
adc_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x04; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
#pragma interrupt_handler timer1_ovf_isr:14
void timer1_ovf_isr(void)
{
t++;
dp=~dp;
if(t==2)
{
t=0;s++;s1++;
if(s==60)
{
date[2]++;m1++;s=0;
EEPROMwrite(23,date[2]);
if(date[2]>59)
{
date[2]=0; date[1]++; bee(500,400);
if(date[1]>23) date[1]=0;
EEPROMwrite(23,date[2]); EEPROMwrite(21,date[1]);
}
if((date[1]==date[3])&&(date[2]==date[4])&&(date[0]%2==1))
{start=1; bee(1000,400); }
}
}
TCNT1H = 0xF0; //setup
TCNT1L = 0xBE;
}
void a(void) ///*********///
{
tm[3]=date[1]/10; tm[2]=date[1]%10; tm[1]=date[2]/10; tm[0]=date[2]%10;
if(date[1]<10) tm[3]=11;
if(((s%3)==0)&&(win%2==0)) tm[3]=tm[2]=tm[1]=tm[0]=10;
a11;DAT(shu[tm[0]]);del(1000);a10;DAT(0xff);del(5);WDR();
a21;DAT(shu[tm[1]]);del(1000);a20;DAT(0xff);del(5);WDR();
if(dp==0) {a31;DAT(shu[tm[2]]);del(1000);a30;DAT(0xff);del(5);WDR();}
else {a31;DAT(shu[tm[2]]&=~0x80);del(1000);a30;DAT(0xff);del(5);WDR();}
a41;DAT(shu[tm[3]]);del(1000);a40;DAT(0xff);del(5);WDR();
}
void a1(void) ///*********///
{
tm[3]=m1/10; tm[2]=m1%10; tm[1]=s/10; tm[0]=s%10;
i=3;
while(i>0&&tm[i]==0)
{tm[i]=11;i--;}
A();
}
void read(void)
{
date[0]=EEPROMread(19); WDR(); // en
date[1]=EEPROMread(21); WDR(); // hour
date[2]=EEPROMread(23); WDR(); // min
date[3]=EEPROMread(25); WDR(); // set h
date[4]=EEPROMread(27); WDR(); // set m
date[5]=EEPROMread(29); WDR(); // long
date[6]=EEPROMread(31); WDR(); // bee
date[7]=EEPROMread(33); WDR(); //win
}
void write(void)
{
EEPROMwrite(19,date[0]); WDR();
EEPROMwrite(21,date[1]); WDR();
EEPROMwrite(23,date[2]); WDR();
EEPROMwrite(25,date[3]); WDR();
EEPROMwrite(27,date[4]); WDR();
EEPROMwrite(29,date[5]); WDR();
EEPROMwrite(31,date[6]); WDR();
EEPROMwrite(33,date[7]); WDR();
}
void main()
{
uchar menu=0;
OSCCAL=0x89;//EEPROMread(0x10);
init_devices();
delay(100);
while(1)
{
CLI();
show4(4765);
delay(10000);
}
read();
if(EEPROMread(33)==255)
{
date[0]=1;
date[1]=21;
date[2]=3;
date[3]=1;
date[4]=0;
date[5]=20;
date[6]=1;
date[7]=1;
write();
}
while(1)
{
if(1)
{
s1=0;
while(s1<5) {a();}
}
WDR();
if(start)
{
bee(300,400);
s1=0;m1=0;out1;
while(start)
{
a1();
if(m1>=date[5]) {start=0;date[7]=0;out0;write();bee(1000,200);}
if(cw(5)>600) {start=0;date[7]=1;out0;write();bee(500,400); delay(300); bee(300,400);}
if(!Add) { delay(100); if(!Add) {start=0;date[7]=0;out0; delay(200); bee(1000,400);}}
}
}
if(!Add)
{
delay(100);
if(!Add)
{
start=1;
bee(1000,600);
}
}
if(!Set)
{
delay(100);
if(!Set)
{
read();
bee(300,400);
while(1)
{
if(!Set)
{
delay(100);
if(!Set)
{
menu++; if(menu==11) menu=10;
write();
bee(300,600); delay(200);
}
}
if(!Add)
{
delay(100);
if(!Add)
{date[menu]++;
if(date[menu]>59) date[menu]=0;
if((menu==1||menu==3)&&date[menu]>23) date[menu]=0;
write(); bee(300,600);
}
}
if(!Sub) { delay(100); if(!Sub) {date[menu]--; if(date[menu]==255) date[menu]=59; write(); bee(200,600); }}
if(!Store)
{ delay(100);
if(!Store)
{
write();
bee(300,400);
while(1);
}
}
while(menu==7) ;
show(menu+1,date[menu]);
delay(20);
}
}
}
/**/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -