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

📄 clock.c

📁 AVR ICC基于AVR单片机的LED表程序!
💻 C
字号:
#include <iom8v.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 d10 PORTD&=~0X40
#define d11 PORTD|=0X40
#define d20 PORTD&=~0X80
#define d21 PORTD|=0X80
#define d30 PORTB&=~0X20
#define d31 PORTB|=0X20
#define d40 PORTC&=~0X02
#define d41 PORTC|=0X02
#define d50 PORTC&=~0X04
#define d51 PORTC|=0X04
#define d60 PORTD&=~0X10
#define d61 PORTD|=0X10
#define d70 PORTD&=~0X08
#define d71 PORTD|=0X08
#define d80 PORTB&=~0X10
#define d81 PORTB|=0X10

#define a10 PORTB&=~0X04
#define a11 PORTB|=0X04
#define a20 PORTB&=~0X08
#define a21 PORTB|=0X08
#define a30 PORTC&=~0X01
#define a31 PORTC|=0X01
#define a40 PORTC&=~0X08
#define a41 PORTC|=0X08

#define out0 PORTD&=~0X02
#define out1 PORTD|=0X02

#define be0 PORTB&=~0X40
#define be1 PORTB|=0X80

#define Set     ((PINC&0X10)==0x10)                          //key
#define Add     ((PINC&0X20)==0x20)
#define Sub     ((PINC&0X40)==0x40)  
#define Store   ((PINC&0X80)==0x80) 

uchar n,ORDER,j;
uchar shu[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar tm[4]={1,2,3,4};

uchar t,i,j,m,s,m1,s1,min,h;
uchar shu1[12]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff};
uchar mm[2]={0xbf,0xbf};
uchar date[9]={1};
unit dat;
uchar lock,dp,ready,start,win=1;

void DAT(uchar x)
{
if((x&0x01)==0x01) d11;else d10;
if((x&0x02)==0x02) d21;else d20;
if((x&0x04)==0x04) d31;else d30;
if((x&0x08)==0x08) d41;else d40;
if((x&0x10)==0x10) d51;else d50;
if((x&0x20)==0x20) d61;else d60;
if((x&0x40)==0x40) d71;else d70;
if((x&0x80)==0x80) d81;else d80;
}


/*		微秒级延时程序		*/
void del(int time)
	 {     
  	  do
	  	{
		 time--;
		}	
  	  while (time>1);
	 }
	 
/*	   毫秒级延时程序   	*/	 
void delay_1ms(void)
{ unsigned int i1;
 for(i1=1;i1<(unsigned int)(xtal*143-2);i1++)
    ;
}



void A(void)           ///*********
{
a11;DAT(shu[tm[0]]);del(240);a10;DAT(0xff);del(5);WDR();
a21;DAT(shu[tm[1]]);del(240);a20;DAT(0xff);del(5);WDR(); 
a31;DAT(shu[tm[2]]);del(240);a30;DAT(0xff);del(5);WDR();
a41;DAT(shu[tm[3]]);del(240);a40;DAT(0xff);del(5);WDR();
}


//TIMER1 initialize - prescale:256
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 2Hz
// actual value:  2.000Hz (0.0%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop timer
 TCNT1H = 0xF8; //set count value
 TCNT1L = 0x5F;
 OCR1AH  = 0x3D; //set compare value
 OCR1AL  = 0x09;
 OCR1BH  = 0x3D; //set compare value
 OCR1BL  = 0x09;
 TCCR1A = 0x00;
 TCCR1B = 0x04; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:6
void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 t++;
 dp=~dp;
 if(t==120)
  {
  t=0;
  min++;s=0;if(min==60) {min=0; h++; if(h>12) {h=1;} }
  EEPROM_WRITE(0x810,h);
  EEPROM_WRITE(0x811,min);
  }
 TCNT1H = 0xF8; //set count value
 TCNT1L = 0x5F;
 MCUCR|=0x20;

}

void port_init(void)
{
 PORTB = 0x30;
 DDRB  = 0x3C;
 PORTC = 0x06; //m103 output only
 DDRC  = 0x0F;
 PORTD = 0xD8;
 DDRD  = 0xD8;
}
//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();
 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x82;
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}


void delay(unsigned int n)
{
 unsigned int i2=0;
   while(i2<n)
   {delay_1ms();
    i2++;
   }
}

void a(void)           ///*********///
{
WDR();
if((PIND&0X40)==0)
{
PORTB=shu[11];
MCUCR|=0x20;
}
else
{
tm[3]=h/10; tm[2]=h%10; tm[1]=min/10; tm[0]=min%10;
if(h<10) tm[3]=11;
a11;DAT(shu[tm[0]]);del(240);a10;DAT(0xff);del(5);WDR();
a21;DAT(shu[tm[1]]);del(240);a20;DAT(0xff);del(5);WDR(); 
if(dp==0) {a31;DAT(shu[tm[2]]);del(240);a30;DAT(0xff);del(5);WDR();}
else      {a31;DAT(shu1[tm[2]]);del(240);a30;DAT(0xff);del(5);WDR();}
a41;DAT(shu[tm[3]]);del(240);a40;DAT(0xff);del(5);WDR();
}
}


void main()
{
init_devices();
EEPROM_READ(0x810,h);
EEPROM_READ(0x811,min);
if((h==0xFF)|(min==0xFF))
 {
  h=0;min=0;
  EEPROM_WRITE(0x810,h);
  EEPROM_WRITE(0x811,min);
 }
while(1)
{
a();
/*
if((PIND&0X01)==0)                   //调表  min++  
 {
 for(j=0;j<6;j++) a();
 if((PIND&0X01)==0)
  {
  min++;
  if(min>59)
    {
    min=0;
    h++;
    if(h>12) h=1;
    }
  EEPROM_WRITE(0x810,h);
  EEPROM_WRITE(0x811,min);
  for(j=0;j<20;j++) a();
  }
 }

if((PIND&0X02)==0)                 //调表    MIN--
 {
 for(j=0;j<6;j++) a();
 if((PIND&0X02)==0)
    {
    h++;
    if(h>12) h=1;
    }
  EEPROM_WRITE(0x810,h);
  EEPROM_WRITE(0x811,min);
  for(j=0;j<20;j++) a();
 }

 
if(((PIND&0X02)|(PIND&0X01))==0)
{
for(j=0;j<20;j++) a();
if(((PIND&0X02)|(PIND&0X01))==0)
 {
 h=0;min=0;
 EEPROM_WRITE(0x810,h);
 EEPROM_WRITE(0x811,min);
 }
for(j=0;j<50;j++) a();
} 

/*
if((PIND&0X40)==0)                 //调表    MIN--
{
 for(j=0;j<10;j++) a();
 while((PIND&0X40)==0)
 {
 CLI();
 a();
 }
SEI();
}
*/

}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -