📄 新建 text file (2).txt
字号:
/*#asm
.equ __ds1302_port=0x18
.equ __ds1302_sclk=2 //7
.equ __ds1302_io=1 //6 SCL 1
.equ __ds1302_rst=0 //5 SDA 0
#endasm
*/
#asm
.equ __i2c_port=0x18;PORTB
.equ __sda_bit=0
.equ __scl_bit=1
#endasm
#include <i2c.h>
#include <all.c>
uchar shuju[15]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0,0x76,0x8e,0x02,0x6e};//对应的数码管显示内码
uchar xianshi[]={0xff,0,0,0,0,0,0,0};
int time[]= {0,27,10,25,2,1,8}; //时间数据
/*------------------------------------------------------1302程序---------------------------------------------------*/
unsigned char turnbcd(unsigned char bcd)
{
unsigned char n_n;
n_n=(bcd&0xf0)/16*10+(bcd&0x0f);
return(n_n);
}
/**********************
十进制转BCD码
***********************/
unsigned char turnsjz(unsigned char dd)
{
unsigned char b_c;
b_c=(dd/10)*16+(dd-(dd/10)*10);
return(b_c);
}
void send(uchar i)
{
uchar j;
for(j=0;j<8;j++)
{
SCP=0;
if(i&0x01) {SI=1;} else {SI = 0;}
i=i>>1;
SCP=1;
}
}
void send_xianshi(void)
{
uchar i;
SCP=0;LCP=0;SCP=1;
for(i=1;i<9;i++)
{
send(xianshi[i]);
}
delay_ms(10);
SCP=1;LCP=1;SI=1;SCP=0;
}
void shuzi(uchar i,uchar ii)
{
xianshi[i]=shuju[ii];
}
void chushihua(void)
{
PORTA=0X00;DDRA=0XFF;
PORTB=0X00;DDRB=0XFF;
WDTCR =0x18;//
WDTCR =0x10;
i2c_init();
}
unsigned char read(unsigned char address)
{
unsigned char data;
i2c_start();
i2c_write(0X65);
delay_ms(1);
i2c_write(address);
i2c_start();
i2c_write(0X65 | 1);
data=i2c_read(1);
i2c_stop();
return data;
}
/* 向EEPROM 写一个字节 */
void eeprom_write(unsigned char address, unsigned char data) {
i2c_start();
i2c_write(0x64);
i2c_write(address);
i2c_write(data);
i2c_stop();
/* 10 延时等待写操作完成 */
delay_ms(10);
}
#define true 1
#define false 0
/********SD2400函数名********/
void I2CWait(void);
bit I2CStart(void);
void I2CStop(void);
void I2CAck(void);
void I2CNoAck(void);
bit I2CWaitAck(void);
void I2CSendByte(uchar demand);
uchar I2CReceiveByte(void);
void I2CReadDate(void);
void I2CWriteStatus(void);
void Delay(uint nn);
void I2CWriteDate(void);
void WriteTimeOn(void);
void WriteTimeOff(void);
/*********I2C延时***********/
void I2CWait(void)
{
delay_us(50);
}
/********开启SD2400的I2C总线********/
bit I2CStart(void)
{
SDA=1;
SCL=1;
I2CWait();
if(!SDA)return false;//SDA线为低电平则总线忙,退出
SDA=0;
I2CWait();
while(SDA)return false;//SDA线为高电平则总线出错,退出
SCL=0;
I2CWait();
return true;
}
/********关闭SD2400的I2C总线*******/
void I2CStop(void)
{
SDA=0;
SCL=0;
I2CWait();
SCL=1;
I2CWait();
SDA=1;
}
/*********发送 ACK*********/
void I2CAck(void)
{
SDA=0;
SCL=0;
I2CWait();
SCL=1;
I2CWait();
SCL=0;
}
/*********发送NO ACK*********/
void I2CNoAck(void)
{
SDA=1;
SCL=0;
I2CWait();
SCL=1;
I2CWait();
SCL=0;
}
/*********读取ACK信号*********/
bit I2CWaitAck(void) //返回为:1=有ACK,0=无ACK
{
uchar errtime=255;
SCL=0;
SDA=1;
I2CWait();
SCL=1;
I2CWait();
while(SDA)
{
errtime--;
if(!errtime)
SCL=0;
return false;
}
SCL=0;
return true;
}
/************MCU向SD2400发送一个字节*************/
void I2CSendByte(uchar demand) //数据从高位到低位//
{
uchar i=8;
while(i--)
{
SCL=0;
_nop_();
SDA=(bit)(demand&0x80);
demand<<=1;
I2CWait();
SCL=1;
I2CWait();
}
SCL=0;
}
/*********MCU从SD2400读入一字节*********/
uchar I2CReceiveByte(void) //数据从高位到低位//
{
uchar i=8;
uchar ddata=0;
SDA=1;
while(i--)
{
ddata<<=1; //数据从高位开始读取
SCL=0;
I2CWait();
SCL=1;
I2CWait(); //从高位开始 ddata|=SDA;ddata<<=1
if(SDA)
{
ddata|=0x01;
}
}
SCL=0;
return ddata;
}
/******读SD2400实时数据寄存器******/
void I2CReadDate(void)
{
uchar n;
I2CStart();
I2CSendByte(0x65);
I2CWaitAck();
for(n=0;n<7;n++)
{
date[n]=I2CReceiveByte();
if (n!=6) //最后一个数据不应答
{
I2CAck();
}
}
I2CNoAck();
I2CStop();
}
/******写SD2400实时数据寄存器******/
void I2CWriteDate(void)
{
WriteTimeOn();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x00);//设置写起始地址
I2CWaitAck();
I2CSendByte(0x01);// second
I2CWaitAck();
I2CSendByte(0x01);//minute
I2CWaitAck();
I2CSendByte(0x88);//hour ,二十四小时制
I2CWaitAck();
I2CSendByte(0x01);//week
I2CWaitAck();
I2CSendByte(0x01);//day
I2CWaitAck();
I2CSendByte(0x07);//month
I2CWaitAck();
I2CSendByte(0x07);//year
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x12);//设置写起始地址
I2CWaitAck();
I2CSendByte(0x00);//清零数字调整寄存器
I2CWaitAck();
I2CStop();
WriteTimeOff();
}
/******写SD2400允许程序******/
void WriteTimeOn(void)
{
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x10);//设置写地址10H
I2CWaitAck();
I2CSendByte(0x80);//置WRTC1=1
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x0F);//设置写地址0FH
I2CWaitAck();
I2CSendByte(0x84);//置WRTC2,WRTC3=1
I2CWaitAck();
I2CStop();
}
/******写SD2400禁止程序******/
void WriteTimeOff(void)
{
I2CStart();
I2CSendByte(0x64);
I2CWaitAck();
I2CSendByte(0x0F);//设置写地址0FH
I2CWaitAck();
I2CSendByte(0x0) ;//置WRTC2,WRTC3=0
I2CWaitAck();
I2CSendByte(0x0) ;//置WRTC1=0(10H地址)
I2CWaitAck();
I2CStop();
}
void main(void)
{
unsigned char i;
chushihua();
//eeprom_write(0x00,0x01);
while(1)
{
{
delay_ms(10);
LED1=~LED1;
i=99;
shuzi(1,i%100/10);
shuzi(2,i%10);
send_xianshi();
i=read(0x00);
delay_ms(1000);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -