|
uint8_t SEGData[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0X6F};//1-9
uint8_t SEGDataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小数点只用于地址0xc1
/**
* 函数功能: I2C总线位延迟,最快400KHz
* 输入参数: us延时
* 返 回 值: 无
* 说 明:无
*/
void I2C_Delay(uint32_t i)
{
/*
下面的时间是通过逻辑分析仪测试得到的。
CPU主频72MHz时,在内部Flash运行, MDK工程不优化
循环次数为10时,SCL频率 = 205KHz
循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us
循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us
IAR工程编译效率高,不能设置为7
*/
//10us延时为最小单位
for(;i>0;i--)
{
__nop();
__nop();
__nop();
__nop();
__nop();
__nop();
__nop();
__nop();
// __nop();
}
}
void Delay_1s(void)
{
HAL_Delay(1000);
}
/**
* 函数功能: CPU发起I2C总线启动信号
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
void I2C_Start(void)
{
/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
I2C_SCL_HIGH();
I2C_SDA_HIGH();
I2C_Delay(2);
I2C_SDA_LOW();
}
/**
* 函数功能: CPU发起I2C总线停止信号
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
void I2C_Stop(void)
{
/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
I2C_SCL_LOW();
I2C_Delay(2);
I2C_SDA_LOW();
I2C_Delay(2);
I2C_SCL_HIGH();
I2C_Delay(2);
I2C_SDA_HIGH();
}
/**
* 函数功能: CPU向I2C总线设备发送8bit数据
* 输入参数: Byte : 等待发送的字节
* 返 回 值: 无
* 说 明:无
*/
void I2CWrByte(uint8_t oneByte) //写一个字节
{
uint8_t i;
for(i=0;i<8;i++)
{
I2C_SCL_LOW();
if(oneByte&0x01) //低位在前
{
I2C_SDA_HIGH();
}
else
{
I2C_SDA_LOW();
}
I2C_Delay(3);
oneByte=oneByte>>1;
I2C_SCL_HIGH();
I2C_Delay(3);
}
}
/**
* 函数功能: CPU产生一个时钟,并读取器件的ACK应答信号
* 输入参数: 无
* 返 回 值:
* 说 明:无
*/
void I2C_WaitAck(void)
{
// GPIO_InitTypeDef GPIO_InitStruct;
//
// GPIO_InitStruct.Pin = GPIO_PIN_10;
// GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
// GPIO_InitStruct.Pull = GPIO_NOPULL;
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
// HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
I2C_SCL_LOW();
I2C_Delay(5); //延时5us
while(I2C_SDA_READ());
I2C_SCL_HIGH();
I2C_Delay(2);
I2C_SCL_LOW();
// GPIO_InitStruct.Pin = GPIO_PIN_10;
// GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
// GPIO_InitStruct.Pull = GPIO_PULLUP;
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
// HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void I2C_writeData(uint8_t addr, uint8_t mData)
{
// I2C_Start();
// I2CWrByte(0x44); // 40H 地址自动加1 模式,44H 固定地址模式,本程序固定 模式
// I2C_WaitAck();
// I2C_Stop();
I2C_Start();
I2CWrByte(addr); //地址
I2C_WaitAck();
I2CWrByte(mData); //数据
I2C_WaitAck();
I2C_Stop();
}
///================================================
void SmgDisplay(void) //写显示寄存器
{
I2C_Start();
I2CWrByte(0x44); // 40H 地址自动加1 模式,44H 固定地址模式,本程序固定 模式
//I2C_WaitAck();
I2C_Stop();
I2C_Start();
I2C_writeData(0xc0, 0x7f);
I2C_Delay(2);
I2C_writeData(0xc1, 0x7f);
I2C_Delay(2);
I2C_writeData(0xc2, 0x7f);
I2C_Delay(2);
I2C_writeData(0xc3, 0x7f);
I2C_Delay(2);
I2C_Stop();
I2C_Start();
I2CWrByte(0x8f); //开显示 ,最大亮度
//I2C_WaitAck();
I2C_Stop();
}
struct {
uint8_t shi;
uint8_t ge;
}Sec;
struct {
uint8_t shi;
uint8_t ge;
}Min;
uint8_t timeover(void)
{
if((Min.shi||Min.ge||Sec.shi||Sec.ge)!=0)
return 1;
else
return 0;
}
/********************************************************************
* 功能 : 设置时间
**************************************************************/
void timeset(char min1, char sec1)
{
if((sec1 < 0) || (min1<0))
{
sec1 = 0;
min1 = 0;
}
Sec.shi = sec1/10;
Sec.ge = sec1%10;
Min.shi = min1/10;
Min.ge = min1%10;
}
/********************************************************************
* 名称 : void time_display( void )
* 功能 : 显示时间
* 输入 : void
* 输出 : 无
**************************************************************/
void time_display(uint8_t dpFlag)
{
I2C_Start();
I2CWrByte(0x44);
I2C_WaitAck();
I2C_Stop();
I2C_writeData(0xc0, SEGData[Min.shi]);
if(dpFlag) //控制第二个数码管的dp的显示
I2C_writeData(0xc1, SEGDataDp[Min.ge]); //小数点标志为1则用小数点那个数组
else
I2C_writeData(0xc1, SEGData[Min.ge]);
I2C_writeData(0xc2, SEGData[Sec.shi]);
I2C_writeData(0xc3, SEGData[Sec.ge]);
I2C_Start();
I2CWrByte(0x8f);
I2C_WaitAck();
I2C_Stop();
}
/*************************************************************
* 功能 : 判断时间变化
**************************************************************/
void timejudge(void)
{
Delay_1s();
if(Sec.ge>0)
{
Sec.ge--;
}
else
{
Sec.ge =9 ;
if(Sec.shi>0)
{
Sec.shi--;
}
else
{
Sec.shi =5;
if(Min.ge>0)
{
Min.ge--;
}
else
{
Min.ge=9;
if(Min.shi>0)
{
Min.shi--;
}
else
{
Min.shi=0;
Min.ge =0;
Sec.shi=0;
Sec.ge =0;
}
}
}
}
|
-
-
TM.7z
2.69 MB, 下载次数: 63, 下载积分: 黑币 -5
实现代码
|