📄 ds1302.c
字号:
//ICC-AVR 修改日期: 2006-10-29 15:38:44
//姓名:荣俊齐
// Target : M8
// Crystal: 1.0000Mhz
#include <iom8v.h>
#include <macros.h>
#include "ds1302.h"
#include "DELAY.C"
const char SEG_table[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
char Sec_buffer[4]={0,0,0,0};
char Min_buffer[4]={0,0,0,0};
/******************************************************************************
定义164的时钟和数据线
********************************************************************************/
#define DATA_1 PORTD|=(1<<0)
#define DATA_0 PORTD&=~(1<<0)
#define CLK_1 PORTD|=(1<<1)
#define CLK_0 PORTD&=~(1<<1)
/******************************************************************************
定义数码管的选择端口
********************************************************************************/
#define LED1 PORTD=0X07//LED2
#define LED2 PORTD=0X0B//LED1
#define LED3 PORTD=0X13//LED3
#define LED4 PORTD=0X23//LED4
#define LED0 PORTD=0X03//灭
/*******************************************************************************
单片机初始化程序
******************************************************************************/
void port_init(void)
{
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0xff;
PORTD = 0x00;
DDRD = 0xFF;
}
//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1mSec
// actual value: 1.000mSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFC; //setup
TCNT1L = 0x18;
OCR1AH = 0x03;
OCR1AL = 0xE8;
OCR1BH = 0x03;
OCR1BL = 0xE8;
ICR1H = 0x03;
ICR1L = 0xE8;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}
void init_devices(void)
{
CLI(); //disable all interrupts
port_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x04;
SEI(); //re-enable interrupts
}
/*******************************************************************************
显示程序
******************************************************************************/
/*发送显示一个字节*/
void sendbeyt(char x)
{
int i;
for(i=0;i<8;i++)
{
CLK_1;
if(x&(1<<i))
DATA_1;
else
DATA_0;
CLK_0;
}
CLK_1;
}
/* 发送显示4字节*/
void sendFOURbeyt()
{ LED3;
sendbeyt(SEG_table[Sec_buffer[0]]);
delay_nus(200);
LED4;
sendbeyt(SEG_table[Sec_buffer[1]]);
delay_nus(200);
LED1;
sendbeyt(SEG_table[Min_buffer[0]]);
delay_nus(200);
LED2;
sendbeyt(SEG_table[Min_buffer[1]]);
delay_nus(200);
LED0;
delay_nus(200);
}
/*******************************************************************************
中断送显程序
******************************************************************************/
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
sendFOURbeyt();
//TIMER1 has overflowed
TCNT1H = 0xFC; //reload counter high value
TCNT1L = 0x18; //reload counter low value
}
/******************************************************************************
BCD分解为数组元素
***************************************************************************/
void BINtoArray(char *p,unsigned int count)
{ unsigned char i,temp;
CLI();
for(i=0;i<4;i++)
{
temp=count%10;
*p=temp;
count=count/10;
p++;
}
SEI();
}
void main()
{char CO=0;
init_devices();
DS1302_WriteTime(); //时间校准
while(1)
{
DS1302_ReadTime();
BINtoArray(Sec_buffer,second);
BINtoArray(Min_buffer,date);
delay_nus(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -