从硬件电路中我们可以看出这三个数码管都是共阴管,则输入高电平即可亮。
在数码管模块这里我们要用到一个芯片74ls595,它的中文名叫做“8位输出锁存移位寄存器”,在比赛的时候我们只需要在乎SER,SCK,RCLK这三个引脚就可以了,具体的使用方法我在函数的实现中讲解。
#include "seg.h"
u8 Seg7[17] = { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x4f,0x79,0x78,0x00};
void Seg_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Seg_ShowNum(u8 N1,u8 N2,u8 N3){
u8 num,i;
num =Seg7[N3]; //注意这里是N3!!!!我在后面进行了解释
for(i=0;i<8;i++){
if(num&0x80) SER_H;
else SER_L;
SCK_H;
num<<=1;
SCK_L;
}
num = Seg7[N2];
for(i=0;i<8;i++){
if(num&0x80) SER_H;
else SER_L;
SCK_H;
num<<=1;
SCK_L;
}
num = Seg7[N1];
for(i=0;i<8;i++){
if(num&0x80) SER_H;
else SER_L;
SCK_H;
num<<=1;
SCK_L;
}
RCLK_H;
RCLK_L;
}
Seg.c函数实现的讲解
Seg7这个数组对应的是共阴数码管的数字,这个数组的编写比赛的时候应该不会提供的。#ifndef __SEG_H
#define __SEG_H
#include "stm32f10x.h"
#define SER_H GPIO_SetBits(GPIOA,GPIO_Pin_1)
#define SER_L GPIO_ResetBits(GPIOA,GPIO_Pin_1)
#define RCLK_H GPIO_SetBits(GPIOA,GPIO_Pin_2)
#define RCLK_L GPIO_ResetBits(GPIOA,GPIO_Pin_2)
#define SCK_H GPIO_SetBits(GPIOA,GPIO_Pin_3)
#define SCK_L GPIO_ResetBits(GPIOA,GPIO_Pin_3)
void Seg_Init(void);
void Seg_ShowNum(u8 N1,u8 N2,u8 N3);
#endif
总结
其实这个模块相对来说难度不大的,只需要写好那个Seg_ShowNum函数就可以了,说白了就是写好一个循环之后后面只需要复制粘贴就可以了。注意的就是那个循环操作的对象不是形参本身的值,而是对应数码管段选的值!