大家好,欢迎来到IT知识分享网。
#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