一 认识二级管
常用的二级管分为两种
1,(b)图共阴极结构:是把所有 LED 的阴极作为公共端(COM) 连起来,接低电平,通常接地。通过控制每一个 LED 的阳极电平使其发光或熄灭,阳极为高电平时LED 发光,为低电平时 LED熄灭。如显示数字0时,a、b、ad.e、t端为高电平,其他各端为低电平。
2,(c)图共阳极结构:是把所有 LED 的阳极作为公共端(COM) 连起来,接高电平,通常接电源(如+5V )。通过控制每一 个LED 的阴极电平使其发光或熄灭,阴极为低电平时LED 发光,为高电平时 LED熄灭。
如下图
我们以共阴极结构举例,进行计算,其过程就是二进制转化为16进制,做法如下
以此列表可以看出,对于同一个字符,共阴极和共阳极的字形码是相反的
二 程序的实现
数码管静态显示电路图
代码实现数码管也有两种方式
一如上电路图,亮两个数码管
#include "stm32f10x.h"
//定义0~9十个数字的字形码表
uint16_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x7d,0x07,0x7f,0x6f};
uint16_t disp[2];
uint16_t temp,i;
void Delay(unsigned int count) //延时函数
{
unsigned int i;
for(;count!=0;count--)
{
i=5000;
while(i--);
}
}
void main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = 0xffff; //PC0-PC15引脚配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置引脚为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIOB速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PC0-PC15
while(1)
{
for(i=0;i<=20;i++)
{
disp[1] = table[i/10]; //数码管显示十位数字的字形码
disp[0] = table[i%10]; //数码管显示个位数字的字形码
//十位数的字形码左移8位,然后与各位数的字形码合并
temp = (disp[1]<<8)|(disp[0]&0x0ff);
GPIO_Write(GPIOC,temp);
Delay(100);
}
}
}
代码说明:
(1)语句"GPIO_InitStructure.GP1O_ Pin = Oxfff:” 用来配置 PCO~PC15 引1脚。为什么使用Oxfit)参数就可以配置 PCO-PC15引1脚呢?可以参考stm32110x_gpio.h 头对 GPIO Pin_x的定义。
(2)disp1数组存放数码管将显示十位和个位数字的字形码,是经常用到的显示缓冲区。
(3)语句"temp = (disp[1]<<8)|(disp[0]&0x0ff);” 的作用:disp[1]<<8是把显示十位数字的字形码左移8 位(移到高 8位),disp[0]&0x0ff 是保留低8位,其他位清零(高8 位清零),然后把高8位(十位)和低8 位(个位)合并,完成循环显示 0-20字形码的显示效果。
二 第二种代码实现的方法
//头文件
#include "stm32f10x.h"
#include "GPIOLIKE51.h"
#define CLK PBout(8)
#define DAT PBout(9)
#define W1 PBout(4)
#define W2 PBout(5)
#define W3 PBout(6)
#define W4 PBout(7)
//函数声明
void GPIO_Configuration(void);
void delay(int m)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<1000;j++);
}
void Delay(uint32_t nCount) //延时函数
{
for(; nCount != 0; nCount--); //函数说明:nCount:延时长短
}
void Smginit(void) //定义数码管,进行配置
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//定义字形码
unsigned char code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void Disled(int m)
{
int i;
CLK=0;
for(i=0;i<8;i++)
{
CLK=0;
delay(1);
if (m&0x80)
DAT=1;
else
DAT=0;
CLK=1;
delay(1);
m=m<<1;
}
}
int main(void)
{
int i;
Smginit();
W1=1;
W2=1;
W3=1;
W4=1;
while (1)
{
for(i=0;i<10;i++)
{
Disled(code[i]);
delay(10000);
}
}
}
代码说明:
(1)这个程序是电亮4个数码管。
(2)头文件第二行“#include "GPIOLIKE51.h" ”这个是一个点h文件,具体作用我会写到下一个博客里(STM3中的“GPIOLIKE51.h”_奋发图强的小rui的博客-CSDN博客)。文章来源:https://www.toymoban.com/news/detail-477378.html
(3)“nCount”这是一个没有返回值的带形式参数的函数函数名称是Delay,同时函数的参数部分中的_IO是类型修饰符;u32是数据类型,同等于uint_32_t同等于unsigned int型。文章来源地址https://www.toymoban.com/news/detail-477378.html
到了这里,关于STM32 数码管显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!