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