|
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
2019-6-17 13:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
2.69 MB, 下載次數: 64, 下載積分: 黑幣 -5
實現代碼
|