TM1650四位数码管驱动芯片-STM32F103程序

TM1650四位数码管驱动芯片-STM32F103程序#ifndef_TM1650_H#define_TM1650_H#include"stm32f10x.h"externunsignedchartab1[];#defineSCL_GPIOGPIO_Pin_6//(模拟I2C)PA0SCL#defi

大家好,欢迎来到IT知识分享网。TM1650四位数码管驱动芯片-STM32F103程序

#ifndef _TM1650_H

#define _TM1650_H

#include “stm32f10x.h”

 

 

extern unsigned char tab1[] ;

 

#define SCL_GPIO        GPIO_Pin_6           //(模拟I2C)  PA0   SCL

#define SDA_GPIO        GPIO_Pin_7           //(模拟I2C)  PA2   SDA

 

//IO方向设置

 

#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}

#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

 

//IO操作函数  

#define IIC_SCL    PBout(6) //SCL

#define IIC_SDA    PBout(7) //SDA  

#define READ_SDA   PBin(7)  //输入SDA 

 

void I2C_MyInit(void);

void TM1650_start(void);

void TM1650_stop(void);

void TM1650_ACK(void);

void TM1650_Write(unsigned char DATA); //写数据函数

void Write_DATA(unsigned char add,unsigned char DATA) ; //指定地址写入命令

void Display_Fix(unsigned char add,unsigned char DATA); //指定地址写入显示数据

void Display_Char(unsigned char add,unsigned char dis_char); //固定地址显示数据,add代表数码管位置,dis_char为要显示的字符

void Display_Num(unsigned char add,unsigned char dis_num); //固定地址显示数字,add为数码管位置,dis_num为要显示的数字

#endif

 

 

 

 

#include “TM1650.H”

#include “stm32f10x.h”

#include “delay.h”

 

 

unsigned char tab1[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; 

 

 

#define SDA_COMMAND   0X40

#define DISP_COMMAND 0x80

#define ADDR_COMMAND 0XC0

 

 

 

#define SDA_high GPIO_SetBits(GPIOB,SDA_GPIO); //PA2输出高

#define SDA_low GPIO_ResetBits(GPIOB,SDA_GPIO);//PA2输出低

#define SCL_high GPIO_SetBits(GPIOB,SCL_GPIO); //PA0输出高

#define SCL_low GPIO_ResetBits(GPIOB,SCL_GPIO); //PA0输出低

 

 

 

 

 

 

void I2C_MyInit(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟

   

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高

 

}

 

 

/*

数据输入开始条件是CLK高时候,DIO由高变成低

*/

 

void TM1650_start(void) //开始信号

{

SDA_OUT(); //set SDA output

SCL_high;

SDA_high;

delay_us(5);

SDA_low;

 

}

 

/*

TM1650_READ_DIO 是读取SDA信号

*/

void TM1650_ACK(void) //ACK信号

{

unsigned char timeout=1;

SCL_high;

delay_us(5);

SCL_low;

 

while((READ_SDA)|(timeout<=100))

{

  timeout++;

 

}

delay_us(5);

SCL_low;

 

}

/*

数据输入结束条件是CLK高时候,DIO由低变成高

*/

void TM1650_stop(void)

{

SDA_OUT();

SCL_high;

delay_us(5);

SDA_low;

delay_us(5);

SDA_high;

 

}

 

 

 

 

 

 

 

 

void TM1650_Write(unsigned char DATA) //写数据函数 //写一个字节高位在前,低位在后

{

unsigned char i;

SDA_OUT();

 

SCL_low;

delay_us(5);

for(i=0;i<8;i++)

{

if((DATA&0x80))            {     SDA_high;}

else  {SDA_low; }                             

SCL_low;

delay_us(5);

SCL_high;

delay_us(5);

SCL_low;

delay_us(5);

DATA<<=1;

}

delay_us(5);

}

//数码管显示

void Write_DATA(unsigned char add,unsigned char DATA) //指定地址写入命令

{

//写显存必须从高地址开始写

TM1650_start();

TM1650_Write(add);//第一个显存地址

TM1650_ACK();

TM1650_Write(DATA);

TM1650_stop();

}

void Display_Fix(unsigned char add,unsigned char DATA) //指定地址写入显示数据

{

if(add>3) return;

else

Write_DATA(0x68+2*add,DATA);

}

void Display_Char(unsigned char add,unsigned char dis_char) //固定地址显示数据,add代表数码管位置,dis_char为要显示的字符

{

unsigned char point_flag,char_code;

point_flag=dis_char&0x80;

dis_char&=0x7f;

if((dis_char>=’0′)&&(dis_char<=’9′))

char_code=tab1[dis_char-0x30];

else if((dis_char>=’A’)&&(dis_char<=’F’))

char_code=tab1[dis_char-0x37];

else if((dis_char>=’a’)&&(dis_char<=’f’))

char_code=tab1[dis_char-0x57];

else switch(dis_char)

{

case ‘L’:char_code=0x38;break;

case ‘l’:char_code=0x30;break;

case ‘H’:char_code=0x76;break;

case ‘h’:char_code=0x74;break;

case ‘U’:char_code=0x3e;break;

case ‘u’:char_code=0x1c;break;

case ‘N’:char_code=0x37;break;

case ‘n’:char_code=0x54;break;

case ‘P’:char_code=0x73;break;

case ‘p’:char_code=0x73;break;

case ‘J’:char_code=0x1e;break;

case ‘j’:char_code=0x1e;break;

case ‘O’:char_code=0x3f;break;

case ‘o’:char_code=0x5c;break;

case ‘S’:char_code=0x6d;break;

case ‘s’:char_code=0x6d;break;

case ‘Y’:char_code=0x6e;break;

case ‘y’:char_code=0x6e;break;

case ‘ ‘:char_code=0;break;

default:char_code=dis_char;break;

}

char_code|=point_flag;

Display_Fix(add,char_code);

}

void Display_Num(unsigned char add,unsigned char dis_num) //固定地址显示数字,add为数码管位置,dis_num为要显示的数字

{

unsigned char point_flag;

point_flag=dis_num&0x80;

dis_num&=0x7f;

if(dis_num>9)return; //要显示的数据大于10则返回不处理

else

Display_Fix(add,tab1[dis_num]|point_flag);

}

 

 

 

 

 

 

测试函数

 

 

I2C_MyInit();

 

Write_DATA(0x48,0x51);//数据命令:0x48,5级亮度,7段显示

 

  while(1)

{

for(i=0;i<16;i++)

{

for(j=0;j<4;j++)

{

Display_Num(j,i);

delay_ms(500);

}

delay_ms(50);

}

 

} 作者:向洋2333 https://www.bilibili.com/read/cv18676276 出处:bilibili

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/32188.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信