STM32F103的数码管显示(1)

先来tm1629数码管驱动,网上看了一大堆,主要是共阴极的居多,共阴极操作简单,控制的数码管较少,共阳极的控制的数码管多,可是需要转换转换

TM16290.H

#ifndef __TM1629_H
#define __TM1629_H

#define TM1_STB_PIN GPIO_Pin_0
#define TM1_STB_PORT GPIOF

#define TM1_DIO_PIN GPIO_Pin_2
#define TM1_DIO_PORT GPIOF

#define TM1_CLK_PIN GPIO_Pin_1
#define TM1_CLK_PORT GPIOF

#define TM1_STB_H GPIO_SetBits(TM1_STB_PORT, TM1_STB_PIN)
#define TM1_STB_L GPIO_ResetBits(TM1_STB_PORT, TM1_STB_PIN)
#define TM1_DIO_H GPIO_SetBits(TM1_DIO_PORT, TM1_DIO_PIN)
#define TM1_DIO_L GPIO_ResetBits(TM1_DIO_PORT, TM1_DIO_PIN)
#define TM1_CLK_H GPIO_SetBits(TM1_CLK_PORT, TM1_CLK_PIN)
#define TM1_CLK_L GPIO_ResetBits(TM1_CLK_PORT, TM1_CLK_PIN)

#define READ_TM1_DIO GPIO_ReadInputDataBit(TM1_DIO_PORT, TM1_DIO_PIN)

/****************************public*********************************************************/
void tm1629a_gpio_init(void); //tm1629a端口初始化,推挽输出
void tm1629_init(void); //tm1629芯片初始化程序

/****************************private*********************************************************/

void tm1629SendByte(unsigned char data); //串行模式 MCU一次输出8个bit
void tm1629SendCmd(unsigned char cmd); //写命令

void tm1639_write(unsigned char *data );//打开TM1629并显示指定的数据
void write_tm1639_off(unsigned char *data );//关闭TM1629显示

void convert(unsigned char SrcNum, unsigned char *pDst , unsigned char seg, unsigned char dot);//共阳数码管数据格式转换 0~9转换
void convert2(unsigned char SrcNum, unsigned char *pDst , unsigned char seg); //共阳数码管数据格式转换 特殊格式转换

#endif

TM1629.C

#include "tm1629.h"
#include"stm32f10x.h" //只要调用库函数,就需要添加此头文件
#include"delay.h"

/****************************************************
*****************************************************
***********************public************************
*****************************************************
****************************************************/
/*tm1629端口初始化,3个端口都是推挽输出*/
void tm1629a_gpio_init(void){
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); //使能PF端口时钟

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //TM1的STB挽输出
  GPIO_InitStructure.GPIO_Pin=TM1_STB_PIN;
  GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
  GPIO_Init(TM1_STB_PORT, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin=TM1_DIO_PIN; //TM1的DIO推挽输出
  GPIO_Init(TM1_DIO_PORT, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin=TM1_CLK_PIN; //TM1的CLK推挽输出
  GPIO_Init(TM1_CLK_PORT, &GPIO_InitStructure);
}

/*启动tm1629必须有一个启动模式*/
void tm1629_init(void){
  TM1_CLK_H;
  TM1_DIO_H;
  TM1_STB_H;
  tm1629SendCmd(0x03); //写TM1629显示模式
  tm1629SendCmd(0x40); //写数据到显示寄存器的方式采用地址自动加一
  tm1629SendCmd(0x88); //开显示,亮度可以通过改变低三位调节
}

/****************************************************
*****************************************************
***********************private***********************
*****************************************************
****************************************************/

/*串行模式 在时钟的上升沿通过MCU向LED驱动IC——TM16xx写数据 */
void tm1629SendByte(unsigned char dat){
  unsigned char i;
  TM1_STB_L;//保证“STB”为低电平,程序不依赖于之前端口的状态;保证程序在实际运行中不会出现“端口迷失”
  for(i=0;i<8;i++)
  {
    TM1_CLK_L; //clk置低,等待发送数据
    if((dat & 0x01) == 0x01){ //传送最高位给DI
    TM1_DIO_H; //需要传送的数据的低位为“1”,则把“DIO”置高
  }
  else{
    TM1_DIO_L; //需要传送的数据的低位为“0”,则把“DIO”置零
  }
  delay_ms(1);
  TM1_CLK_H; //送时钟的上升沿
  dat >>= 1; //准备送下一个BIT
  //delay_ms(1);
  }
}

/*写命令*/
void tm1629SendCmd(unsigned char cmd){
  TM1_STB_H;
  TM1_CLK_H;
  TM1_DIO_H; //通讯开始前通讯端口全部初始化为“1”
  delay_ms(2);
  TM1_STB_L; //片选(低电平)
  tm1629SendByte(cmd);
  TM1_STB_H;
}

/*打开TM1629并显示指定的数据*/
void tm1639_write(unsigned char *data ){
  unsigned char i=0;

  TM1_STB_H;
  tm1629SendByte(0x40); //传数据设置命令,设置采用地址自动加一方式显示数据
  TM1_STB_H;
  tm1629SendByte(0xc0); //传送起始地址,地址命令传完后,“STB”保持为0继续传需要显示的数据
  for(i=0;i<16;i++) //在连续显示的数据过程汇总,“STB”一直保持为0,
  {
tm1629SendByte(data[i]);
}
TM1_STB_H; //传送完所有的显示数据后(最多14BYTE),将STB置1
tm1629SendByte(0x88);//0x8f //开显示,脉冲宽度为1/16 这个是最低的脉冲宽度
TM1_STB_H;
}

/*关闭TM1629显示*/
void write_tm1639_off(unsigned char *data ){
unsigned char i=0;

TM1_STB_H;
tm1629SendByte(0x40); //传数据设置命令,设置采用地址自动加一方式显示数据
TM1_STB_H;
tm1629SendByte(0xc0); //传送起始地址,地址命令传完后,“STB”保持为0继续传需要显示的数据
for(i=0;i<16;i++)
{
tm1629SendByte(data[i]);
}
TM1_STB_H;
tm1629SendByte(0x87); //关显示,脉冲宽度为14/16
TM1_STB_H;
}

/*共阳数码管数据格式转换

输入参数: SrcNum为0-9
pDst为转换后的数据
seg为当前数码管对应的sel管脚编号减1, 比如数码管片选接到芯片的SEG2,那么seg为1
dot为当前数码管是否带点显示
*/
void convert(unsigned char SrcNum, unsigned char *pDst , unsigned char seg, unsigned char dot){
unsigned char table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char i,uSrc;

if(dot == 0)
uSrc = table[SrcNum];
else
uSrc = table[SrcNum] | 0x80;

for(i=0; i<8; i++){ //一位一位移过去
if((uSrc & 0x01) == 1){//如果将要移过去的位是1,在对应的位置写1,紧跟着后一位写0
if(seg < 8){
pDst[2*i] = (1<<seg); //SEG<8,在地址的0、2、4、6、8、10、12、14写入有效数据
pDst[2*i + 1] = 0;//在地址的1、3、5、7、9、11、13、15填零
}
else if(seg > 7){
pDst[2*i] = 0;//SEG>8,在地址的0、2、4、6、8、10、12、14填零
pDst[2*i + 1] = (1<<(seg - 8));//在地址的1、3、5、7、9、11、13、15写入有效数字(9是左移1位,依次类推)
}
}
else{//如果将要移过去的位是0,在对应的位置写0,紧跟着后一位写0
pDst[2*i] = 0;
pDst[2*i + 1] = 0;
}
uSrc>>=1;//右移,移第二位
}

}

/*共阳数码管数据格式转换

特殊字符显示
输入参数: SrcNum为要显示的数据,比如要显示‘L’,用共阴的数据表示: h g f e d c b a 分别是 00111000(0x38)
pDst为转换后的数据
seg为当前数码管对应的sel管脚编号减1, 比如数码管片选接到芯片的SEG2,那么seg为1
a
f b
g
e c
d h
*/
void convert2(unsigned char SrcNum, unsigned char *pDst , unsigned char seg){
//uchar table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char i,uSrc;

uSrc = SrcNum;
for(i=0; i<8; i++)
{
if((uSrc & 0x01) == 1)
{
if(seg < 8)
{
pDst[2*i] = (1<<seg);
pDst[2*i + 1] = 0;
}
else if(seg > 7)
{
pDst[2*i] = 0;
pDst[2*i + 1] = (1<<(seg - 8));
}
}
else
{
pDst[2*i] = 0;
pDst[2*i + 1] = 0;
}
uSrc>>=1;
}
}

原文地址:https://www.cnblogs.com/wlstm/p/9887145.html

时间: 2024-08-29 22:04:07

STM32F103的数码管显示(1)的相关文章

第3讲 数码管显示

一. 数码管显示原理 我们最经常使用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其它的基本同样.所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形.数码管又分为共阴极和共阳极两种类型,事实上共阴极就是将八个LED的阴极连在一起,让其接地,这样给不论什么一个LED的还有一端高电平,它便能点亮.而共阳极就是将八个LED的阳极连在一起.其原理图例如以下. 当中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电

7段数码管显示驱动代码

数码管显示进行简单的介绍,数码管显示原理在数电中已经给出了比较详细的介绍,我就不赘述了,因为我们用的是至芯的开发板,其上的数码管显示模块采用的是共阳极的数码管,为低电平有效,0-F的显示码依次为:    数码管的输入有3个位选和8个段选给出,位选信号sel来控制哪个数码管先亮,段选信号seg来控制数码管显示什么,位选本来应该是有6个的但是为了节约资源,采用了3-8译码器将6根线减少到3根,节约了FPGA的引脚资源. 因为人眼有一个视觉载留,所以60HZ来扫描的时候,数码管会让人眼觉得是同时点亮,

基于小脚丫的ADC081S101 电压采集595数码管显示

RTL结构图 采集模块运用SPI 通讯 MISO方式收集数据 module ad_collect(input sddata,input rst_n,output reg cs,output reg sclk,input clk,output [7:0]seg_data,output done); reg [7:0]cnt;reg[4:0]state;reg[7:0]data;reg rdone; [email protected](posedge clk or negedge rst_n ) b

51单片机第三弹---数码管显示

先把定义拉过来: LED数码管是由多个发光二极管封装在一起组成"8"字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极.LED数码管常用的段数一般为7段,有的另加一个小数点 .LED数码管根据LED的接法不同,分为共阴和共阳两类 . 贴原理图 其实就两点 :由于板子上有8个数码管,而每个数码管有8段,称选择显示哪一个数码管的东西为位选,称单个数码管显示数字几的东西为段选,位选由P2.2  p2.3 p2.4 控制 数码管IO口为P0 对于每一个数码管,显示数字几只要控制

单片机与控制实验(1)——数码管显示

一.实验目的和要求 初步学习和掌握MCS-51的体系结构和汇编语言,了解Keil编程环境和程序下载工具的使用方法.了解数码管输出的原理及编程方式. 二.实验设备 单片机测控实验系统 STC-ISP程序下载工具 Keil开发环境 三.实验内容 使用MCS-51汇编语言编写程序,完成如下功能: 1. 使用三个数码管显示十进制数值(001~999,可任意设置): 2. 每隔1秒,该数值自动减一,直到归零; 3. 归零后的下一秒,显示一个新的十进制数值(001~999,可任意设置): 4. 每隔1秒,新

单片机编程:让led数码管显示数字0到9

led数码管在单片机系统中应用非常普遍,是由发光二极管构成的.数码管由7个发光二极管组成的一个"日"字形,如果需要显示小数点,那么就再加上一个点,就是8段数码管. 数码管显示亮度高,相应速度快,分共阴极和共阳极两种形式,常用的有单个的和4联的,还有两联的和专门用来显示时间的. /*************************************************** *程序功能:点亮一个led数码管,让它显示数字从0到9 * *日期:2015.5.11 * *******

一天:51单片机从入门到一个动态数码管显示数字控制

最近进的公司是一个做路由器的..很多嵌入式工程师.有个项目( 智能空调控制)是跟嵌入式工程师对接,我做APP+PHP..他做服务器.我们用MQTT(由于emqtt是用erlang写的,所以我也学了点erlang,后期有时间分享一下,这个语言很好,很强大.特别抽象).这个项目激发了我对嵌入式的兴趣,于是乎.开始从51单片机搞起了..所以就有了这篇文章...今天搞得东西挺多.我最近都是笔记形式,不想以前写的那么详细...因为学的东西太多,白天在公司搞项目,没时间写太具体... 今天学了什么呢? >k

树莓派控制数码管显示

1. 效果显示 2. 硬件设备 在某宝上买了一个4位共阴数码管.4个数字公用一个阴极,一共12个引脚.其中6,8,9,12是共阴引脚. 每个数字由 a-g 7个二极管和一个点dp.因为是在网上买的没有详细的器件手册,所以只能自己测试引脚与数码管上二极管的对应关系. 通过上图可以看出12号引脚对应的是第一位数字的共阴引脚,1号引脚对应数字e.依次测试,结果如下: 2.

单片机4*4按键数码管显示0-9

#include<reg51.h> #define KEY P1 //键盘 #define SEG P0 //数码管 sbit COM=P2^0; // 数码管com sbit OC = P2^1;//573锁存器 char code TAB[]={//0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xa7,0xa1,0x84,0x84,0xbf,0x7f};//共阳极 0x3f,0x06,0x5b,0x4f,0x66,