⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bt.c

📁 AVR ICC基于AVR单片机的LED显示程序!
💻 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 + -