|
本程序來自(杜洋工作室),使用了IIC1,親測可用,分享給大家學(xué)習(xí),杜洋的程序風(fēng)格很好 值得學(xué)習(xí)
單片機(jī)源程序如下:
- /*********************************************************************************************
- 模板制作: 杜洋工作室/洋桃電子
- 出品:
- 程序名:
- 硬件支持: STM32F103C8 外部晶振8MHz RCC函數(shù)設(shè)置主頻72MHz
- 修改日志:
- 1-
-
-
- 說明:
- # 本模板加載了STM32F103內(nèi)部的RCC時(shí)鐘設(shè)置,并加入了利用滴答定時(shí)器的延時(shí)函數(shù)。
- # 可根據(jù)自己的需要增加或刪減。
- *********************************************************************************************/
- #include "stm32f10x.h" //STM32頭文件
- #include "sys.h"
- #include "delay.h"
- //#include "led.h"
- //#include "TM1637.h"
- #include "PCF8574.h"
- u16 kmmp=0;
- u8 f[5];
- uc8 ShuZi[]="0123456789";
- int main (void){//主程序
- RCC_Configuration(); //時(shí)鐘設(shè)置
- I2C_Configuration();
- while(1){
- PCF1602Init();
- StrinWrite(2,0,"TORT Test");
- while(1)
- {
- delay_ms(100);
- f[0]=ShuZi[kmmp%10000/1000];
- f[1]=ShuZi[kmmp%1000/100];
- f[2]=ShuZi[kmmp%100/10];
- f[3]=ShuZi[kmmp%10];
- StrinWrite(4,1,f);
- kmmp++;
- }
- }
- }
- /*
- void TIM3_IRQHandler(void){ //TIM3中斷處理函數(shù)
- if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){ //判斷是否是TIM3中斷
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
-
- HYM++;
- }
- }
- */
- /*********************************************************************************************
- * 杜洋工作室
- * 洋桃電子
- *********************************************************************************************/
- /*
- 【變量定義】
- u32 a; //定義32位無符號(hào)變量a
- u16 a; //定義16位無符號(hào)變量a
- u8 a; //定義8位無符號(hào)變量a
- vu32 a; //定義易變的32位無符號(hào)變量a
- vu16 a; //定義易變的 16位無符號(hào)變量a
- vu8 a; //定義易變的 8位無符號(hào)變量a
- uc32 a; //定義只讀的32位無符號(hào)變量a
- uc16 a; //定義只讀 的16位無符號(hào)變量a
- uc8 a; //定義只讀 的8位無符號(hào)變量a
- #define ONE 1 //宏定義
- delay_us(1); //延時(shí)1微秒
- delay_ms(1); //延時(shí)1毫秒
- delay_s(1); //延時(shí)1秒
- */
復(fù)制代碼- #include "PCF8574.h"
- #include "delay.h"
- void I2C_GPIO_Init(void)
- { //I2C接口初始化
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //啟動(dòng)I2C功能
- GPIO_InitStructure.GPIO_Pin = SCL | SDA; //選擇端口號(hào)
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //選擇IO接口工作方式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設(shè)置IO接口速度(2/10/50MHz)
- GPIO_Init(I2CPORT, &GPIO_InitStructure);
- }
- void I2C_Configuration(void){ //I2C初始化
- I2C_InitTypeDef I2C_InitStructure;
- I2C_GPIO_Init(); //先設(shè)置GPIO接口的狀態(tài)
- I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//設(shè)置為I2C模式
- I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
- I2C_InitStructure.I2C_OwnAddress1 = HostAddress; //主機(jī)地址(從機(jī)不得用此地址)
- I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//允許應(yīng)答
- I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //7位地址模式
- I2C_InitStructure.I2C_ClockSpeed = BusSpeed; //總線速度設(shè)置
- I2C_Init(I2C1,&I2C_InitStructure);
- I2C_Cmd(I2C1,ENABLE);//開啟I2C
- }
- void PCFSendAByte(u8 addr,u8 dat)
- {
- I2C_GenerateSTART(I2C1,ENABLE); //發(fā)送開始信號(hào)
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成
- I2C_Send7bitAddress(I2C1,addr,I2C_Direction_Transmitter);
- //while(I2C_GetFlagStatus(I2C2,I2C_FLAG_AF));
- while(SUCCESS != I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6
- // I2C_SendData(I2C1,addr); //發(fā)送從器件內(nèi)部寄存器地址
- //while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- I2C_SendData(I2C1,dat); //發(fā)送要寫入的內(nèi)容
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- I2C_GenerateSTOP(I2C1,ENABLE); //發(fā)送結(jié)束信號(hào)
- }
- /***************以下為1602****************/
- void WriteCom1602(u8 com)
- {
- u8 tmp,mmp;
- I2C_GenerateSTART(I2C1,ENABLE); //發(fā)送開始信號(hào)
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成
- // I2C_SendData(I2C1,WriteADDR); //發(fā)送從器件內(nèi)部寄存器地址
- // while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- I2C_Send7bitAddress(I2C1,WriteADDR,I2C_Direction_Transmitter);
- //while(I2C_GetFlagStatus(I2C2,I2C_FLAG_AF));
- while(SUCCESS != I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6
-
- tmp=com&0xf0;
- I2C_SendData(I2C1,CSReset|COMSet); //EN=0 RS.RW=0 無數(shù)據(jù)
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- mmp=tmp|CSReset|COMSet;
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- mmp|=CSSet; //EN=1 RS.RW=0 有數(shù)據(jù)(高四位)
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
- mmp&=(0xf0|COMSet);
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
- tmp=com<<4;
- I2C_SendData(I2C1,CSReset|COMSet); //EN=0 RS.RW=0 無數(shù)據(jù)
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- mmp=tmp|CSReset|COMSet;
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- mmp|=CSSet; //EN=1 RS.RW=0 有數(shù)據(jù)(高四位)
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
- mmp&=(0xf0|COMSet);
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
- I2C_GenerateSTOP(I2C1,ENABLE);//產(chǎn)生停止信號(hào)
- }
- void WriteDat1602(u8 dat)
- {
- u8 tmp,mmp;
- I2C_GenerateSTART(I2C1,ENABLE); //發(fā)送開始信號(hào)
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成
- //I2C_SendData(I2C1,WriteADDR); //發(fā)送從器件內(nèi)部寄存器地址
- //while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- I2C_Send7bitAddress(I2C1,WriteADDR,I2C_Direction_Transmitter);
- //while(I2C_GetFlagStatus(I2C2,I2C_FLAG_AF));
- while(SUCCESS != I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//EV6
-
- tmp=dat&0xf0;
- I2C_SendData(I2C1,CSReset|DATSet); //EN=0 RS.RW=0 無數(shù)據(jù)
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- mmp=tmp|CSReset|DATSet;
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- mmp|=CSSet; //EN=1 RS.RW=0 有數(shù)據(jù)(高四位)
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
- mmp&=(0xf0|DATSet);
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
- tmp=dat<<4;
- I2C_SendData(I2C1,CSReset|DATSet); //EN=0 RS.RW=0 無數(shù)據(jù)
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- mmp=tmp|CSReset|DATSet;
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
- mmp|=CSSet; //EN=1 RS.RW=0 有數(shù)據(jù)(高四位)
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
- mmp&=(0xf0|DATSet);
- I2C_SendData(I2C1,mmp);
- while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
- I2C_GenerateSTOP(I2C1,ENABLE);//產(chǎn)生停止信號(hào)
- }
- void PCF1602Init()
- {
- WriteCom1602(0x28);
- delay_ms(15);
- WriteCom1602(0x28);
- delay_ms(15);
- WriteCom1602(0x28);
- delay_ms(15);
- PCFSendAByte(WriteADDR,0x04);
- delay_ms(15);
- WriteCom1602(0x28);
- WriteCom1602(0x0c);
- WriteCom1602(0x01);
- delay_ms(5);
- }
- void SetXY(u8 x,u8 y)
- {
- u8 addr;
- addr=0x80+0x40*y+x;
- WriteCom1602(addr);
- }
- void StrinWrite(u8 x,u8 y,u8 *string)
- {
- SetXY(x,y);
- while(*string)
- {
- WriteDat1602(*string++);
- }
- }
復(fù)制代碼
所有程序51hei提供下載:
PCF8574.7z
(191.02 KB, 下載次數(shù): 172)
2020-11-1 16:45 上傳
點(diǎn)擊文件名下載附件
|
|