博士
最后登录1970-1-1
在线时间 小时
注册时间2014-12-16
|
发表于 2017-9-5 11:27:42
|
显示全部楼层
本帖最后由 wqy_1000 于 2017-9-5 11:29 编辑
- //************************************************************
- //实时时钟SD2403读写iicavr atmega1280程序
- //硬件IIC程序
- //***********************************************************
- #include "SD2403API.h"
- //*********变量及IO 口定义******************************************************
- unsigned char iic_state;
- //extern unsigned char iic_error_count;
- unsigned char iic_error_count;
- /*date[2]=hour,date[1]=minute,date[0]=second
- date[6]=year,date[5]=month,date[4]=day,date[3]=week*/
- //extern static
- //unsigned char date[7]; //日期数组
- unsigned char real_times_set[7]={0X00,0X00,0X15,0X01,0X31,0X12,0X8},real_time_read[7];//时间处理
- unsigned char real_times_set_init[7],real_time_read_init[7];//用于初始化
- //******************************************************************************
- /*********I2C 延时***********/
- void I2CWait(unsigned int num)
- {
- //自己实现
- }
- /**********初始化iic*************/
- //TWI initialize
- // bit rate:1
- void iic_init(void)
- {
- //自己实现
- }
- /********开启SD2403的I2C 总线********/
- void I2CStart(void)
- {
- //自己实现
- }
- /********关闭SD2403的I2C 总线*******/
- void I2C_Stop(void)
- {
- //自己实现
- }
- /************MCU 向SD2403发送写地址*************/
- void I2C_Send_w_Add(void)
- {
- //自己实现
- }
- /************MCU 向SD2403发送读地址*************/
- void I2C_Send_r_Add(void)
- {
- //自己实现
- }
- void I2C_Send_wr_Add(unsigned char wr_add)
- {
- //自己实现
- }
- /************MCU 向SD2403发送一个字节*************/
- void I2CSendByte(unsigned char tx_data)
- {
- TWDR = tx_data; //将SLA_W 载入到TWDR 寄存器
- TWCR = (1<<TWINT) | (1<<TWEN); //TWINT 位清零,启动发送数据
- while (!(TWCR & (1<<TWINT))) //等待TWINT 置位, TWINT 置位表示总线数据 DATA 已发送,及收到应答信号ACK/NACK
- ;
- //if ((TWSR & 0xF8) != MT_DATA_ACK) //检验TWI 状态寄存器,屏蔽预分频位,如果状态字不是MT_DATA_ACK 转出错处理
- if ((TWSR & 0xF8) != 0x28)
- iic_state=false;
- else
- iic_state=true;
- }
- /*********MCU 从SD2403读入一字节*********/
- unsigned char I2CReceiveByte(void)
- {
- unsigned char iic_rx_temp_data=0;
- TWCR=(0<<TWSTA)|(0<<TWSTO)|(1<<TWEA)|(1<<TWINT)|(1<<TWEN);
- while (!(TWCR & (1<<TWINT))) //等待TWINT 置位, TWINT 置位表示总线数据 DATA 已收到,及收到应答信号ACK/NACK
- ;
- if((TWSR&0xF8)!=0x50) //检验TWI 状态寄存器
- {
- iic_state = false;
- }
- else
- {
- iic_rx_temp_data=TWDR;
- iic_state = true;
- }
- return iic_rx_temp_data;
- }
- /******读SD2403实时数据寄存器******/
- void I2CReadDate(unsigned char *p_date)
- {
- unsigned char n;
- I2CStart();
- I2C_Send_w_Add();
- //I2CSendByte(0x64);
- //I2CWaitAck();
- I2C_Send_wr_Add(0x00);//设置写起始地址
- I2C_Stop();
- I2CWait(200);
- I2CStart();
- I2C_Send_r_Add();
- for(n=0;n<7;n++)
- {
- WDR();
- if(iic_state)
- {
- *p_date = I2CReceiveByte();
- if(n==2)
- {
- *p_date -= 0x80;
- }
- p_date++;
- iic_error_count=0;
- }
- else
- {
- if(iic_error_count++>3)
- {
- PORTD |= (1<<7); //BB
- for(;;);//启动复位处理错误处理
- }
- }
- }
- I2C_Stop();
- I2CWait(2);
- }
- void alarm_set(void)
- {
- WriteTimeOn();
- I2CWait(200);
- I2CStart();
- I2C_Send_w_Add();
- I2C_Send_wr_Add(0x10);//设置写起始地址
- I2CSendByte(0x92);//设置报警中断和报警中断输出???报警
- I2C_Stop();
- I2CWait(200);
- I2CStart();
- I2C_Send_w_Add();
- I2C_Send_wr_Add(0x0E);//设置写起始地址
- I2CSendByte(0x02);//允许分时中断(每小时报警一次零分)
- //I2CSendByte(0x06);//允许分时中断(每天报警一次零点)
- I2C_Stop();
- I2CWait(200);
- I2CStart();
- I2C_Send_w_Add();
- I2C_Send_wr_Add(0x08);//设置写起始地址
- I2CSendByte(0x00);//设置分中断报警(每小时报警一次零分)
- //I2CSendByte(0x00);//设置分中断报警(每天报警一次零点)
- //I2CSendByte(0x00);//设置时中断报警(每天报警一次零点)
- I2C_Stop();
- I2CWait(200);
- WriteTimeOff();
- I2CWait(200);
- }
- /******写SD2403实时数据寄存器******/
- void I2CWriteDate(unsigned char *p_date_set)
- {
- unsigned char n;
- WriteTimeOn();
- I2CWait(200);
- I2CStart();
- I2C_Send_w_Add();
- I2C_Send_wr_Add(0x00);//设置写起始地址
- for(n=0;n<7;n++)
- {
- WDR();
- I2CSendByte(*p_date_set);
- p_date_set++;
- }
- /*I2CSendByte(0X30);// second
- I2CSendByte(0X17);//minute
- I2CSendByte(0X95);//hour ,二十四小时制
- I2CSendByte(0X05);//week
- I2CSendByte(0X28);//day
- I2CSendByte(0X11);//month
- I2CSendByte(0X08);//year*/
- I2C_Stop();
- I2CWait(200);
- I2CStart();
- I2C_Send_w_Add();
- I2C_Send_wr_Add(0x12);//设置写起始地址
- //I2CSendByte(0x00);//清零CTR3寄存器
- I2CSendByte(0x00);//清零数字调整寄存器
- //I2CSendByte(0x00);//清零倒计时定时器寄存器
- I2C_Stop();
- I2CWait(200);
- //alarm_set();//报警
- //I2CWait(200);
- WriteTimeOff();
- I2CWait(200);
- }
- /******写SD2403允许程序******/
- void WriteTimeOn(void)
- {
- I2CStart();
- I2C_Send_w_Add();
- I2C_Send_wr_Add(0x10);//设置写地址10H
- I2CSendByte(0x80);//置WRTC1=1
- I2C_Stop();
- I2CWait(200);
- I2CStart();
- I2C_Send_w_Add();
- I2C_Send_wr_Add(0x0f);//设置写地址0FH
- I2CSendByte(0x84);//置WRTC2,WRTC3=1
- I2C_Stop();
- I2CWait(2);
- }
- /******写SD2403禁止程序******/
- void WriteTimeOff(void)
- {
- I2CStart();
- I2C_Send_w_Add();
- I2C_Send_wr_Add(0x0f);//设置写地址0FH
- I2CSendByte(0x00);//置WRTC2,WRTC3=0
- I2CSendByte(0X12);//置WRTC1=0(10H 地址)????报警
- //I2CSendByte(0X00);//置WRTC1=0(10H 地址)????报警
- I2C_Stop();
- I2CWait(2);
- }
- void clear_alarm(void)
- {
- WriteTimeOn();
- I2CWait(200);
- I2CStart();
- I2C_Send_w_Add();
- I2C_Send_wr_Add(0x0F);//设置写起始地址
- I2CSendByte(0XA4);//清除报警标记?????报警
- I2C_Stop();
- I2CWait(200);
- WriteTimeOff();
- I2CWait(2);
- }
- //******************************************************************************
- //将二位的字符转换成BDC码"59"-59h
- unsigned char atobdc(unsigned char *p_a)
- {
- unsigned char n,temp;
- p_a++;
- temp = *p_a-0x30;
- p_a--;
- temp += (*p_a-0x30)<<4;
- return temp;
- }
- void bdctochar(unsigned char *p_str)
- {
- unsigned int y,v=6;
- unsigned char bdc,temp;
- for(y=0;y<7;y++)
- {
- WDR();
- bdc=real_time_read[v--];
- temp= bdc & 0xf0;
- if(y == 3)//星期只显示一位
- {
- *p_str = (bdc & 0x0f)+0x30;
- p_str++;
- }
- else
- {
- *p_str = (temp>>4)+0x30;
- p_str++;
- *p_str = (bdc & 0x0f)+0x30;
- p_str++;
- }
- }
- }
- //重设时间
- /*DateTime format: 59592301311209 */
- void SetDateTime(unsigned char *Datetime)
- {
- int i;
- unsigned char temp_string[3];
- for(i=0;i<7;i++)
- {
- temp_string[0] = *Datetime++;
- temp_string[1] = *Datetime++;
- temp_string[2] = ' ';
- //real_times_set[i] = atoi(temp_str);//十进制数
- real_times_set[i] = atobdc(temp_string);//BDC码
- if(i==2)
- {
- real_times_set[i] += 0x80;
- }
- }
- I2CWriteDate(real_times_set);
- }
- //翻译按键的值
- unsigned char keytoa(unsigned char key)
- {
- switch(key)
- {
- case 0: return '1'; break;
- case 1: return '2'; break;
- case 2: return '3'; break;
- case 3: return 'A'; break;
- case 4: return '4'; break;
- case 5: return '5'; break;
- case 6: return '6'; break;
- case 7: return 'B'; break;
- case 8: return '7'; break;
- case 9: return '8'; break;
- case 10: return '9'; break;
- case 11: return 'C'; break;
- case 12: return '*'; break;
- case 13: return '0'; break;
- case 14: return '#'; break;
- case 15: return 'D'; break;
- }
- }
复制代码
- #ifndef _iic_h
- #define _iic_h
- //*************************** ***************************************************
- #include <iom1280v.h>
- #include <macros.h>
- //******************************************************************************
- #define true 1
- #define false 0
-
- //******************************************************************************
- void iic_init(void);
- void I2CStart(void);
- void I2C_Stop(void);
- void I2C_Send_w_Add(void);
- void I2C_Send_r_Add(void);
- void I2C_Send_wr_Add(unsigned char wr_add);
- void I2CSendByte(unsigned char tx_data);
- unsigned char I2CReceiveByte(void);
- void I2CReadDate(unsigned char *p_date);
- void I2CWriteDate(unsigned char *p_date_set);
- void WriteTimeOn(void);
- void WriteTimeOff(void);
- void clear_alarm(void);
- void alarm_set(void);
- //******************************************************************************
- #endif
复制代码
|
|