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

📄 wm480.c

📁 用M48做的万年历 对于AVR的学习是一个不错的素材 既可以实现定时控制还有数码管的控制等功能
💻 C
字号:
/* 
    Title:    wnl by m8
    Author:   chen-wd
    Date:     2005-5
    Purpose:  
    needed
    Software: AVR-GCC 20050214 to compile
    needed
    Hardware: ATmega8 cpu oscclk=1MHz
    		
    Note:     
*/

#include<avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
//#include <avr/eeprom.h>
#include <avr/pgmspace.h>
//#include <avr/wdt.h>
#include <avr/sleep.h>
#include <avr/delay.h>
#include <inttypes.h>

uint8_t date_time[9]={4,1,1};
#define YEAR 	date_time[0]
#define MONTH 	date_time[1]
#define DAY 	date_time[2]
#define HOUR 	date_time[3]
#define MIN 	date_time[4]
#define SEC 	date_time[5]
#define YUE 	date_time[6]
#define RI	 	date_time[7]
#define TMP	 	date_time[8]

volatile uint8_t time_change;
/*声明一组函数原型*/
void put_on_leds(void);
void led_buf_flash(void);
//void scan_key(void);
//void show_message(Uchar);
//void key_process(void);
//void test_num(void);
//Uchar change_12(Uchar);		//将24小时制转化为12小时制。
//void key_up(void);			//键释放的处理程序。
//extern void get_week(void);
//extern void get_yinli(void);
//extern void temp_adc(void);

uint8_t led_buf[20];

/*段码表:            			0    1    2    3    4    5    6    7    8    9 	-    H	  L 。*/
uint8_t const led_dm[] PROGMEM={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x38,0x76}; 

SIGNAL(SIG_OUTPUT_COMPARE2)     /* signal handler for Time0 interrupt */
{
	//TCNT0 = 0xec;     /* Set TIMER0 20ms. 256-20=236=0xec */
	static uint8_t click=0;
	if(++click>=63)
	{
		click=0;
		time_change=1;
		if(++SEC>=60)
		{
			SEC=0;
			if(++MIN>=60)
			{
				MIN=0;
				if(++HOUR>=24)
				{
					HOUR=0;
				}
			}
		}
	}
}

void AvrInit (void)
{	//端口配置
	DDRC = 0x9f;	/* PORT C 5,6为输入,其它为输出*/	
	PORTC = 0x9f;		//PC0~PC4 SET 1,PC5,PC6断开上拉电阻
	DDRD = 0xff;	/* PORT D 全部为输出*/
	DDRB = 0xff;	/*PORT B 全部为输出*/
	
	//timer0配置
//	TCCR0 = _BV(CS02)| _BV(CS00);      /* Set TIMER0 prescaler to CLK/1024=0.9765625kHz   CPU CLK= 1 MHz         */
//	TCNT0 = 0xec;      					/* Set TIMER0 20ms. 256-20=236=0xec */

	//timer1配置
//	TCCR1B = _BV(CS12)|_BV(WGM12);      /* Set TIMER1 prescaler to CLK/256  and mode =CTC           */
//	TCCR1A = _BV(COM1B0);      /* Set OCR1B fosc100Hz out              */
//	OCR1AH = 0;
//	OCR1AL = 71;		//fosc=(fcpu/256)/(2*(1+OCR1A))    3686400/256/(2*(1+71))=100  100Hz

	//timer2配置
	TCCR2 = (1<<WGM21)|(1<<CS21); 
	ASSR  = 1<<AS2; //异步时钟 
	//TCNT2 = 0xE0; //定时时间1秒 
	OCR2 = 0x3f;		//计数64次,形成1秒64次中断。
	TIMSK = 1<<OCIE2;	//开比较中断
	//ADC配置	

	set_sleep_mode(SLEEP_MODE_IDLE);	//POWER SAVE.	
}

/*函数void led_buf_auto_flash(void),功能:用当前时间刷新显示缓冲区*/
void led_buf_flash(void)
{
//led_buf(20)中的前10位对应PD口,后10位对应PB口。
	led_buf[0]=pgm_read_byte(led_dm+YEAR/10);
	led_buf[1]=pgm_read_byte(led_dm+YEAR%10);
	led_buf[2]=pgm_read_byte(led_dm+MONTH/10);
	led_buf[3]=pgm_read_byte(led_dm+MONTH%10);
	led_buf[4]=pgm_read_byte(led_dm+DAY/10);
	led_buf[5]=pgm_read_byte(led_dm+DAY%10);
//	led_buf[6]=pgm_read_byte(led_dm+YUE/10);
//	led_buf[7]=pgm_read_byte(led_dm+YUE%10);
//	led_buf[8]=pgm_read_byte(led_dm+RI/10);
//	led_buf[9]=pgm_read_byte(led_dm+RI%10);
	
	led_buf[10]=pgm_read_byte(led_dm+HOUR/10);
	led_buf[11]=pgm_read_byte(led_dm+HOUR%10);
	led_buf[12]=pgm_read_byte(led_dm+MIN/10);
	led_buf[13]=pgm_read_byte(led_dm+MIN%10);
	led_buf[14]=pgm_read_byte(led_dm+SEC/10);
	led_buf[15]=pgm_read_byte(led_dm+SEC%10);
//	led_buf[16]=pgm_read_byte(led_dm+TMP/10);
//	led_buf[17]=pgm_read_byte(led_dm+TMP%10);
//	led_buf[18]=pgm_read_byte(led_dm+week/10);
//	led_buf[19]=pgm_read_byte(led_dm+week%10);
}

/*函数Uchar put_on_leds(void),功能:将当前显示缓冲区的字符输出到LED。*/
void put_on_leds(void)
{
	uint8_t count;
	for(count=0;count<10;count++)
	{
		PORTC|=0X0F;
		PORTD=led_buf[count]&0x7f;	//PD7为0。
		PORTB=led_buf[count+10];
		if(led_buf[count+10]&0x40)PORTD |= _BV(PD7);	//提取第6位到PD7。
		PORTC&=0xf0;
		PORTC|=count;
		_delay_loop_2(250);
	}
	PORTC|=0x0f;
}

int main(void)
{
	cli();                 /* disable interrupts */
	AvrInit();             /* Initialize the AVR UART and Timer  */
	sei();
	time_change=1;
  	for (;;)
	{
		if(time_change)
		{
			time_change=0;
			led_buf_flash();
		}
		put_on_leds();
		sleep_mode();
   	}	
}

⌨️ 快捷键说明

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