久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
TM1650驅動數碼管的STM32F103單片機程序
[打印本頁]
作者:
DDJJ666
時間:
2024-4-5 20:14
標題:
TM1650驅動數碼管的STM32F103單片機程序
最近用TM1650驅動的數碼管做了一個萬年歷,特地把TM1650的STM32驅動程序分享出來以供大家使用,親測可以用。。!
接線:
1.SCL接PB10;
2.SDA接PB11;
源程序如下:
tm1650.c:
#include "stm32f10x.h"
#include "sys_conf.h"
#include <stdio.h>
void DelayXms(unsigned int count)
{
unsigned int i,j;
for(i=0; i<count; i++)
{
//WatchDOG();
for(j=0; j<7968; j++)
{
__NOP();
}
}
}
void DelayXus(unsigned int count)
{
unsigned int i,j;
for(i=0; i<count; i++)
{
for(j=0; j<8; j++)
{
__NOP();
}
}
}
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
}
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
}
/***************************************************************************
- 功能描述:STM32f103 模擬IIC起始信號函數
- 隸屬模塊:STM32 IIC操作
- 函數屬性:外部,使用戶使用
- 參數說明:無
- 返回說明:無
- 函數實現步驟:
(1)首先將SDA配置為輸出
(2)在SCL為高電平期間,SDA有下降沿的變化
***************************************************************************/
void IIC_Start(void)
{
SDA_OUT(); //sda線輸出
Set_IIC_SDA;
Set_IIC_SCL;
DelayXus(4);
Clr_IIC_SDA;//START:when CLK is high,DATA change form high to low
DelayXus(4);
Clr_IIC_SCL;//鉗住I2C總線,準備發送或接收數據
}
/***************************************************************************
- 功能描述:STM32f103 模擬IIC終止信號函數
- 隸屬模塊:STM32 IIC操作
- 函數屬性:外部,使用戶使用
- 參數說明:無
- 返回說明:無
- 函數實現步驟:
(1)首先將SDA配置為輸出
(2)在SCL為高電平期間,SDA有上升沿的變化
***************************************************************************/
void IIC_Stop(void)
{
SDA_OUT();//sda線輸出
Clr_IIC_SCL;
Clr_IIC_SDA;//STOP:when CLK is high DATA change form low to high
DelayXus(4);
Set_IIC_SCL;
Set_IIC_SDA;//發送I2C總線結束信號
DelayXus(4);
}
/***************************************************************************
- 功能描述:STM32f103 模擬IIC等待應答函數
- 隸屬模塊:STM32 IIC操作
- 函數屬性:外部,使用戶使用
- 參數說明:無
- 返回說明:返回值:1,接收應答失。0,接收應答成功
- 函數說明:
(1)首先將SDA配置為輸入
(2)如果返回0,表示接收應答成功;如果為1,接收應答失敗
(3)注意在IIC_STOP()中 ,將SDA置為了輸出,所以再滿足250條件后,產中IIC停止線號,
對輸出線SDA讀SDA輸入值是為0的,所以才退出循環。
***************************************************************************/
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA設置為輸入
Set_IIC_SDA;
DelayXus(1);
Set_IIC_SCL;
DelayXus(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
Clr_IIC_SCL;//時鐘輸出0
return 0;
}
/***************************************************************************
- 功能描述:STM32f103 模擬IIC應答信號函數
- 隸屬模塊:STM32 IIC操作
- 函數屬性:外部,使用戶使用
- 參數說明:無
- 返回說明:無
- 函數實現步驟:
(1)首先將SDA配置為輸出
(2)在SCL的一個時鐘周期期間,SDA為低
***************************************************************************/
//產生ACK應答
void IIC_Ack(void)
{
Clr_IIC_SCL;
SDA_OUT();
Clr_IIC_SDA;
DelayXus(2);
Set_IIC_SCL;
DelayXus(2);
Clr_IIC_SCL;
}
/***************************************************************************
- 功能描述:STM32f103 模擬IIC不應答信號函數
- 隸屬模塊:STM32 IIC操作
- 函數屬性:外部,使用戶使用
- 參數說明:無
- 返回說明:無
- 函數實現步驟:
(1)首先將SDA配置為輸出
(2)在SCL的一個時鐘周期期間,SDA為高電平
***************************************************************************/
void IIC_NAck(void)
{
Clr_IIC_SCL;
SDA_OUT();
Set_IIC_SDA;
DelayXus(2);
Set_IIC_SCL;
DelayXus(2);
Clr_IIC_SCL;
}
/***************************************************************************
- 功能描述:STM32f103 模擬IIC 發送一個字節函數
- 隸屬模塊:STM32 IIC操作
- 函數屬性:外部,使用戶使用
- 參數說明:無
- 返回說明:無
- 函數實現步驟:
(1)首先將SDA配置為輸出
(2)在SCL為低電平期間,置位SDA的數據為0或者1,延時后拉高SCL,取走數據,循環8次
***************************************************************************/
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
Clr_IIC_SCL;//拉低時鐘開始數據傳輸
for(t=0;t<8;t++)
{
//IIC_SDA=(txd&0x80)>>7;
if ((txd&0x80)>>7)
Set_IIC_SDA;
else Clr_IIC_SDA;
txd<<=1;
DelayXus(2); //對TEA5767這三個延時都是必須的
Set_IIC_SCL;
DelayXus(2);
Clr_IIC_SCL;
DelayXus(2);
}
}
/***************************************************************************
- 功能描述:STM32f103 模擬IIC 發送一個字節函數
- 隸屬模塊:STM32 IIC操作
- 函數屬性:外部,使用戶使用
- 參數說明:ack 用于決定是是否回應ACK
- 返回說明:無
- 函數實現步驟:
(1)首先將SDA配置為輸入
(2)在SCL的一個時鐘周期后,讀SDA的數據,保存在receive中
(3)讀1個字節,ack=1時,發送ACK,ack=0,發送nACK
***************************************************************************/
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA設置為輸入
for(i=0;i<8;i++ )
{
Clr_IIC_SCL;
DelayXus(2);
Set_IIC_SCL;
receive<<=1;
if(READ_SDA)receive++;
DelayXus(1);
}
if (!ack)
IIC_NAck();//發送nACK
else
IIC_Ack(); //發送ACK
return receive;
}
void TM1650_Set(unsigned char add,unsigned char dat) //數碼管顯示
{
IIC_Start();
IIC_Send_Byte(add);
IIC_Ack();
IIC_Send_Byte(dat);
IIC_Ack();
IIC_Stop();
}
void LCD_Init(void)
{
IIC_Init();
TM1650_Set(0x48,0x01);
}
void LCD_Display(unsigned char state,unsigned int NUM)
{
unsigned char CODE[20] = {0xdd,0x05,0xb9,0xad,0x65,0xec,0xfc,0x85,0xfd,0xed,0xf5,0xfd,0xd8,0xdd,0xf8,0xf0,0x00}; //0~9 dot: +2
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
unsigned char CODE1[20] = {0x00,0x05,0xb9,0xad,0x65,0xec,0xfc,0x85,0xfd,0xed,0xf5,0xfd,0xd8,0xdd,0xf8,0xf0,0x00}; //0~9 dot: +2
TM1650_Set(0x48,0x01);
switch(state)
{
case led_normal:
TM1650_Set(0x68,CODE1[NUM/100]);
TM1650_Set(0x6A,CODE[NUM%100/10]+2);
TM1650_Set(0x6C,CODE[NUM%100%10]);
break;
case led_set1:
if(timer_count < TIME_500MS)
TM1650_Set(0x68,CODE[1]+2);
else
TM1650_Set(0x68,CODE[16]);
TM1650_Set(0x6A,CODE1[NUM/10]);
TM1650_Set(0x6C,CODE[NUM%10]+2);
break;
case led_set2:
if(timer_count < TIME_500MS)
TM1650_Set(0x68,CODE[2]+2);
else
TM1650_Set(0x68,CODE[16]);
TM1650_Set(0x6A,CODE1[NUM/10]);
TM1650_Set(0x6C,CODE[NUM%10]+2);
break;
case led_error:
TM1650_Set(0x68,CODE[14]+2);
TM1650_Set(0x6A,CODE[NUM/10]);
TM1650_Set(0x6C,CODE[NUM%10]);
break;
case led_no_dis:
TM1650_Set(0x68,CODE[11]);
TM1650_Set(0x6A,CODE[11]);
TM1650_Set(0x6C,CODE[11]);
break;
default:
TM1650_Set(0x68,CODE1[8]+2);
TM1650_Set(0x6A,CODE1[8]+2);
TM1650_Set(0x6C,CODE1[8]+2);
break;
}
}
復制代碼
tm1650.h
#ifndef _I2C_H //宏定義,定義文件名稱
#define _I2C_H
/*---------------------------頭文件引用--------------------------------------*/
#include "stm32f10x.h"
#include "sys_conf.h"
#include <stdio.h>
#define IIC_SCL_PIN GPIO_Pin_10
#define IIC_SCL_PORT GPIOB
#define IIC_SCL_CLK RCC_APB2Periph_GPIOB
#define IIC_SDA_PIN GPIO_Pin_11
#define IIC_SDA_PORT GPIOB
#define IIC_SDA_CLK RCC_APB2Periph_GPIOB
/*********************************************************
- I2C宏定義:
- I2C時鐘操作:
- Set_IIC_SCL: 此處是將SCL拉為高電平
- Clr_IIC_SCL: 此處是將SCL拉為低電平
- 說明:通過這兩個宏定義就可以模擬IIC的時鐘電平SCL的高低變化了
*********************************************************/
#define Set_IIC_SCL GPIO_SetBits(IIC_SCL_PORT,IIC_SCL_PIN)
#define Clr_IIC_SCL GPIO_ResetBits(IIC_SCL_PORT,IIC_SCL_PIN)
/*********************************************************
- I2C宏定義:
- I2C數據線操作:
- Set_IIC_SDA: 此處是將SDA拉為高電平
- Clr_IIC_SDA: 此處是將SDA拉為低電平
- READ_SDA : 此處是讀取SDA線上的位數據
- 說明:通過這兩個宏定義就可以模擬IIC的數據線SDA電平的高低變化了
*********************************************************/
#define Set_IIC_SDA GPIO_SetBits(IIC_SDA_PORT,IIC_SDA_PIN)
#define Clr_IIC_SDA GPIO_ResetBits(IIC_SDA_PORT,IIC_SDA_PIN)
#define READ_SDA GPIO_ReadInputDataBit(IIC_SDA_PORT, IIC_SDA_PIN)
/*********************************************************
- I2C模擬操作函數的聲明:
*********************************************************/
//IIC所有操作函數
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); //發送IIC開始信號
void IIC_Stop(void); //發送IIC停止信號
void IIC_Send_Byte(u8 txd); //IIC發送一個字節
u8 IIC_Read_Byte(unsigned char ack);//IIC讀取一個字節
u8 IIC_Wait_Ack(void); //IIC等待ACK信號
void IIC_Ack(void); //IIC發送ACK信號
void IIC_NAck(void); //IIC不發送ACK信號
void LCD_Init(void);
void SDA_IN(void);
void SDA_OUT(void);
void TM1650_Set(unsigned char add,unsigned char dat);//數碼管顯示
void LCD_Display(unsigned char state,unsigned int NUM);
#endif
復制代碼
作者:
ssjjkk
時間:
2025-1-12 20:28
學習了,真不錯
作者:
zwc58
時間:
2025-1-19 18:35
謝謝樓主分享。
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日本三级香港三级
|
精品在线播放
|
精品久久久久久久久久久久
|
国产女人高潮毛片
|
中文字幕在线一区二区三区
|
91久久久精品
|
亚洲天堂男人天堂
|
日韩中文字幕一区二区三区
|
成人黄色小视频
|
青青草免费在线视频
|
亚洲一区中文
|
国内精品一区二区
|
免费观看全黄做爰大片视频美国
|
亚洲一区二区三区在线
|
久久国产一区二区
|
天天操天天操
|
午夜专区
|
成人久久网
|
久久国产影院
|
色播av
|
日韩视频免费在线观看
|
黄视频网站在线观看
|
久久一级片
|
欧美成人毛片
|
av一区二区三区在线观看
|
日韩中文字幕精品
|
欧美性生活网站
|
亚洲国产一区二区三区
|
日韩高清精品免费观看
|
成人xxx
|
日本国产一区
|
成人免费看片98欧美
|
成人高潮片免费
|
久久大
|
国产xxxx视频
|
国产乱码一区二区三区
|
黄色1级视频
|
人人干人人爽
|
狠狠操夜夜操
|
日韩在线一区二区三区
|
一级欧美一级日韩
|