📄 8025.c
字号:
//ICC-AVR application builder : 2008-11-16 18:42:49
// Target : M128
// Crystal: 6.0000Mhz
#include <iom128v.h>
#include <macros.h>
int time1s=0; //1s定时
unsigned char S1BZ=0; //1s标志
//---------------------------------------------------------------------------
unsigned char TWIBUSY=0; //TWI忙标志
unsigned char RTC_W_R=1; //RTC_W_R=1表示读RX_8025,RTC_W_R=0表示写RX_8025
unsigned char TWI_BUF_W[11]={
0x64,0xE0,0x20,0x20,0x40,0x57,0x23,0x04,0x31,0x05,0x08}; //实时时钟写缓冲区
/*{SLA+W,从寄存器E开始写,控制字1,控制字2,秒,分,时,星期,日,月,年}*/
unsigned char TWI_BUF_R[10]={0x64,0x00,0x65}; //实时时钟读缓冲区
unsigned char twi_cmd_counter=1; //twi 命令计数器
unsigned char twi_dat_counter=1; //twi 数据计数器
unsigned char twi_buf_ptr=0; //实时时钟数据缓冲区指针
unsigned char twi_stp=1; //twi步骤计数
unsigned char twi_buf_num=0; //实时时钟缓冲区大小
unsigned char data_time[12]={1,2,3,4,5,6,7,8,9,0,2,3}; //日期时间显示缓冲区
void port_init(void)
{
PORTA = 0xFF; //端口A用于指示灯,输出,初始值全为1
DDRA = 0xFF;
PORTB = 0xFF; //PB0~PB3用于SPI,PB0为ATT7022B的片选信号;PB4用于指示灯
DDRB = 0xF7; //PB5控制蜂鸣器,PB6作为AT45DB161D的片选,PB7控制2576
PORTC = 0x00; //和液晶屏数据位相连接
DDRC = 0xFF; //初始化为输出
PORTD = 0xC0; //PD0~1用于I2C,PD2~3用于GTM900,PD4~5悬空,
DDRD = 0xC0; //PD6-CS1液晶屏左半屏片选,PD7-CS2液晶屏右半屏片选,初始化为输出
PORTE = 0xFC; //PE0~1用于MAX232,品;PE2~6用于键盘,初始化为输入
DDRE = 0x03; //PE7-PFO 接MAX705(电源故障输出),初始化为输入
PORTF = 0x08; //PF0~2悬空,PF3接AT45DB161D RDY信号,输入
DDRF = 0xF7; //PF4~7用于JTAG
PORTG = 0x0F; //PG0-RS,PG1-R/W.PG2-E,PG3-WDI(For MAX705,监视电压跟踪输入)
DDRG = 0x1F; //PG0~3配置为输出,PG4悬空
}
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 1mSec
// actual value: 1.000mSec (0.0%)
void timer0_init(void) //定时器0初始化
{
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0x45; //set count
OCR0 = 0xBB;
TCCR0 = 0x03; //start timer
}
//定时器0中断服务程序
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
TCNT0 = 0x45; //reload counter value
if(time1s<1000)
{
time1s++;
}
else
{
S1BZ=1; //1秒标志用于实时时钟的读写
time1s=0;
}
}
//******************************时间处理函数开始*******************************
void data_time_process(void) //日期和时间数据的转换处理
{ //把时间和日期的个位和十位分别转化成一个字节,方便显示
int i,j=3,k=11,a,b;
for(i=0;i<6;i++)
{
a=TWI_BUF_R[j];
b=TWI_BUF_R[j];
j++;
if (j==6)
{
j++;
}
a&=0x0F; //低位
b=b>>4; //高位
data_time[k]=a;
k--;
data_time[k]=b;
k--;
}
}
void twi_twrite(void) //实时时钟的写
{
TWIBUSY=1;//忙标志置1
RTC_W_R=0;//写RX_8025
TWCR=0xA5;//启动twi
do
{
}
while(TWIBUSY==1);
return;
}
//实时时钟的读
void twi_tread(void)
{
TWIBUSY=1;//忙标志置1
RTC_W_R=1;//读RX_8025
TWCR= 0xA5;//启动twi
do
{
}
while(TWIBUSY==1);
data_time_process(); //日期和时间数据的转换处理
return;
}
//*************************************
//TWI 初始化 比特率为16 1分频 传输频率为333.33KHZ
//TWCR控制字(TWINT TWEA TWSTA TWSTO TWWC TWEN - TWIE)
void twi_init(void)
{
TWCR= 0X00; //禁止TWI
TWBR= 0x10; //比特率发生器分频因子为16
TWSR= 0x00; //set prescale预分频因子值为1
TWAR= 0x00; //set slave address
TWCR= 0x45; //使能TWI
}
//*******************************************
//实时时钟初始化:08年05月8号周4,00时43分0秒,使用24时制,
//实时时钟的连续写数据初始化(根据初始化时格式)
//用户要对twi_t_w[]填所要写入的数据,具体格式见初始化格式
//twi_js=2+n数据个数加控制字个数
void rtc_w_ini(void)
{
RTC_W_R=0;//实时时钟
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -