一 认识二级管
常用的二级管分为两种
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);
- }
- }
- }</i>
复制代码
代码说明:
(1)这个程序是电亮4个数码管。
(2)头文件第二行“#include "GPIOLIKE51.h" ”这个是一个点h文件
(3)“nCount”这是一个没有返回值的带形式参数的函数函数名称是Delay,同时函数的参数部分中的_IO是类型修饰符;u32是数据类型,同等于uint_32_t同等于unsigned int型。
|