久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32F103 PCF8574硬件IIC程序
[打印本頁]
作者:
天藍色的Toto
時間:
2020-11-1 16:43
標題:
STM32F103 PCF8574硬件IIC程序
本程序來自(杜洋工作室),使用了IIC1,親測可用,分享給大家學習,杜洋的程序風格很好 值得學習
單片機源程序如下:
/*********************************************************************************************
模板制作: 杜洋工作室/洋桃電子
出品:
程序名:
硬件支持: STM32F103C8 外部晶振8MHz RCC函數設置主頻72MHz
修改日志:
1-
說明:
# 本模板加載了STM32F103內部的RCC時鐘設置,并加入了利用滴答定時器的延時函數。
# 可根據自己的需要增加或刪減。
*********************************************************************************************/
#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(); //時鐘設置
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中斷處理函數
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){ //判斷是否是TIM3中斷
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
HYM++;
}
}
*/
/*********************************************************************************************
* 杜洋工作室
* 洋桃電子
*********************************************************************************************/
/*
【變量定義】
u32 a; //定義32位無符號變量a
u16 a; //定義16位無符號變量a
u8 a; //定義8位無符號變量a
vu32 a; //定義易變的32位無符號變量a
vu16 a; //定義易變的 16位無符號變量a
vu8 a; //定義易變的 8位無符號變量a
uc32 a; //定義只讀的32位無符號變量a
uc16 a; //定義只讀 的16位無符號變量a
uc8 a; //定義只讀 的8位無符號變量a
#define ONE 1 //宏定義
delay_us(1); //延時1微秒
delay_ms(1); //延時1毫秒
delay_s(1); //延時1秒
*/
復制代碼
#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); //啟動I2C功能
GPIO_InitStructure.GPIO_Pin = SCL | SDA; //選擇端口號
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //選擇IO接口工作方式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設置IO接口速度(2/10/50MHz)
GPIO_Init(I2CPORT, &GPIO_InitStructure);
}
void I2C_Configuration(void){ //I2C初始化
I2C_InitTypeDef I2C_InitStructure;
I2C_GPIO_Init(); //先設置GPIO接口的狀態
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//設置為I2C模式
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = HostAddress; //主機地址(從機不得用此地址)
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//允許應答
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //7位地址模式
I2C_InitStructure.I2C_ClockSpeed = BusSpeed; //總線速度設置
I2C_Init(I2C1,&I2C_InitStructure);
I2C_Cmd(I2C1,ENABLE);//開啟I2C
}
void PCFSendAByte(u8 addr,u8 dat)
{
I2C_GenerateSTART(I2C1,ENABLE); //發送開始信號
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); //發送從器件內部寄存器地址
//while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
I2C_SendData(I2C1,dat); //發送要寫入的內容
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成
I2C_GenerateSTOP(I2C1,ENABLE); //發送結束信號
}
/***************以下為1602****************/
void WriteCom1602(u8 com)
{
u8 tmp,mmp;
I2C_GenerateSTART(I2C1,ENABLE); //發送開始信號
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成
// I2C_SendData(I2C1,WriteADDR); //發送從器件內部寄存器地址
// 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 無數據
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 有數據(高四位)
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 無數據
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 有數據(高四位)
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);//產生停止信號
}
void WriteDat1602(u8 dat)
{
u8 tmp,mmp;
I2C_GenerateSTART(I2C1,ENABLE); //發送開始信號
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成
//I2C_SendData(I2C1,WriteADDR); //發送從器件內部寄存器地址
//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 無數據
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 有數據(高四位)
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 無數據
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 有數據(高四位)
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);//產生停止信號
}
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++);
}
}
復制代碼
所有程序51hei提供下載:
PCF8574.7z
(191.02 KB, 下載次數: 172)
2020-11-1 16:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
我是你爸爸@!
時間:
2021-4-28 15:45
PCF8574文件呢
作者:
51hei團團
時間:
2021-4-28 21:16
我是你爸爸@! 發表于 2021-4-28 15:45
PCF8574文件呢
Basic\delay 這個目錄里面
作者:
shumivan
時間:
2021-4-30 14:32
這個一直沒使用過,聽說是會出問題,你多測試測試再往成熟產品上用
作者:
liuyu123sx
時間:
2021-9-17 12:32
贊一個,好文,寫的很詳細
作者:
hcyang1422
時間:
2021-10-24 14:46
贊一個,好文,寫的很詳細
作者:
sfd123
時間:
2021-10-27 13:31
ST我是用的是模擬I2C,硬件也調通了,但是一直沒敢正式用。
作者:
Duo2048
時間:
2022-7-20 23:05
sfd123 發表于 2021-10-27 13:31
ST我是用的是模擬I2C,硬件也調通了,但是一直沒敢正式用。
可以發下您軟件IIC的源程序嘛 謝謝您了
作者:
kissme
時間:
2022-12-8 19:15
除了51單片機的IIC程序我調通了,32的無論模擬還是硬件自帶的IIC我都沒調通,斷斷續續整了10幾天,無奈,放棄了
作者:
dianzimao
時間:
2024-1-24 23:39
請教一下,從機地址是哪一行?
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
免费黄网站在线观看
|
六月色婷
|
四色永久
|
北条麻妃一区二区三区在线视频
|
综合久久国产
|
天堂在线中文字幕
|
久久久www成人免费无遮挡大片
|
99精品久久久
|
av中文字幕在线
|
亚洲国产成人精品久久久国产成人一区
|
欧美jizzhd精品欧美巨大免费
|
美女久久久久久久久
|
午夜视频一区
|
国产一区二区中文字幕
|
尤物在线精品视频
|
国产成人小视频
|
国产精品久久国产精品99 gif
|
国产精品视频一区二区三区不卡
|
日韩综合网
|
91精品国产高清久久久久久久久
|
人人叉
|
亚洲高清免费视频
|
亚洲成人中文字幕
|
精品成人av
|
欧美国产日韩精品
|
国产精品视频免费播放
|
国产乱码精品一区二区三区忘忧草
|
欧美一区二区免费
|
羞羞视频在线观看网站
|
激情91
|
一区二区三区视频在线免费观看
|
亚洲欧美综合
|
欧美精品一区在线发布
|
久久一
|
黄色在线免费观看视频
|
中国xxxx性xxxx产国
|
久久国产精品久久久久久
|
一呦二呦三呦国产精品
|
中文字幕人成人
|
亚洲免费在线视频
|
h视频在线免费观看
|