以四位一体数码管和74HC244N三态门芯片组合为例进行编程。
一、数码管类别搭配
数码管分共阴极和共阳极数码管,针对不同的数码管有不同的配置操作。
共阴极数码管公共端接地,引脚高电平点亮,共阳极反之。注意数码管的使用必须要在正常电压范围内,否则极其容易烧毁数码管,一般配合74HC244芯片使其供电更加稳定。74HC244的OE端口给低即输入输出相同,给高的话呈高组态形式。
简单来说,就是对应共阴极(共阳极)数码管指定引脚给有效电平点亮操作。
接线需要数码管引脚图顺序和IO口顺序一一对应才可以正确显示结果。
二、函数选用与码表
对于数码管的点亮所使用的函数是GPIO_Write(),该函数可以控制整个IO口的电平,例如给定GPIO_Write(GPIOB,0xFFFF);其他正常的情况下,就是使所有PB口输出高电平,既然这样的话,那就可以利用这一特性配合16位进制数,根据16位进制数的对应01部分来控制IO口的输出电平了。
在使用GPIO_Write时若只让其控制某些IO口也可以,举例如下(以共阳极数码管为例,共阴极只需将代码高低部分翻转即可)
注意将指定的IO口都用GPIO_SetBits()置高,执行流程即将十进制数对应数组里的16位进制数用GPIO_Write输出到配置好的IO口即可点亮对应的数字。经过实测发现码表数组有一点问题,注释部分为正确的,但是使用的Num[]数组也没有问题,这里待更新解决。同时分享共阴极的16位数。
//char Num[16] ={0xc0, 0xf9,0xa4, 0xb0, 0x99, 0x92, 0x82,
// 0xf8,0x80, 0x90, 0x88, 0x83, 0xc6,0xa1, 0x86, 0x8e};//共阳数码管
//char code[16]={0x40, 0x79,0x24, 0x30, 0x19, 0x12, 0x02,0x78,0x00, 0x10, 0x08, 0x03, 0x46,0x21, 0x06, 0x0e}; //共阳极数码管
实测正确的数组:
//Num[16]={0x4079,0x7924, 0x2430, 0x3019, 0x1912, 0x1202,0x0278,0x7800, 0x0010, 0x1008, 0x0803, 0x0346,0x4621, 0x2106, 0x060e}; //共阳极数码管
三、代码部分
以下是初始化和读取部分的函数,开启PB8至PB15的IO口进行显示。
#include "stm32f10x.h" // Device header
//char code[16]={0x40, 0x79,0x24, 0x30, 0x19, 0x12, 0x02,0x78,0x00, 0x10, 0x08, 0x03, 0x46,0x21, 0x06, 0x0e};
int Num[16]={0x4079,0x7924, 0x2430, 0x3019, 0x1912, 0x1202,0x0278,0x7800, 0x0010, 0x1008, 0x0803, 0x0346,0x4621, 0x2106, 0x060e};
void Show_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
}
void Led_code(int num)//数码管显示代码,给 低有效
{
GPIO_Write(GPIOB,Num[num]);//写入数据
}
主函数部分:(代码中为给6,数码管显示为6)
#include "stm32f10x.h" // Device header
#include "show.h"
int main (void)
{
Show_Init();
while(1)
{
Led_code(6);//数码管显示代码,给低有效
}
}
四、自增以及滚动自增显示
将静态显示的主函数利用延时函数和if判断循环即可实现。代码如下:
int main (void)
{
Show_Init();
int num=0,i=0;
while(1)
{
Led_code(num);
num++;
Delay_ms(500);
if(num==16)num=0;
}
}
滚动显示主要就是四位一体数码管的位选端,位选端高电平有效,通过设置四个IO口依次输出高电平来控制数码管的逐一亮灭。其他保持不变即可,注意的是其中的num需要定义在外面,如果定义在函数内部则会在主函数循环中又执行一次int num=0;的操作就会发生只能显示0至3的情况,代码如下:
void Show_Going(void)
{
GPIO_Write(GPIOB,Num[num]);//写入数据
GPIO_SetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);
num++;
if(num==16)num=0;
Delay_ms(500);
GPIO_Write(GPIOB,Num[num]);//写入数据
GPIO_SetBits(GPIOA, GPIO_Pin_2);
GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4);
num++;
if(num==16)num=0;
Delay_ms(500);
GPIO_Write(GPIOB,Num[num]);//写入数据
GPIO_SetBits(GPIOA, GPIO_Pin_3);
GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_1 | GPIO_Pin_4);
num++;
if(num==16)num=0;
Delay_ms(500);
GPIO_Write(GPIOB,Num[num]);//写入数据
GPIO_SetBits(GPIOA, GPIO_Pin_4);
GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_1);
num++;
if(num==16)num=0;
Delay_ms(500);
GPIO_Write(GPIOB,Num[num]);//写入数据
}