本程序对应的开发板为蓝桥杯嵌入式开发板stm32f103rbt6,为中型mcu。嵌入式竞赛开发板上的3位数码管是共阴极静态显示,使用输出锁的8位移位寄存器74LS595驱动,其引脚功能如下
硬件连接
P4.1(PA1)-P3.1(SER)
P4.2(PA2)-P3.2(RCK)
P4.3(PA3)-P3.3(SCK)
同时断开
J1.3(PA3)-J2.3(RXD2)
J1.4(PA2)-J2.4(TXD2)
由于数码管和USART2都使用了PA2和PA3的引脚,使用数码管和USART不能同时使用
初始化程序
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);
}
数码管显示函数
//入口参数:data1~3显示三个数据,dot 3个小数点
void SEG_Dis(unsigned char data1,unsigned char data2,unsigned char data3,unsigned char dot)
{
unsigned char i;
unsigned long data;
unsigned char code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
data=((code[data3]<<16)+(code[data2]<<8)+(code[data1]));
data+=(dot&1)<<23;
data+=(dot&2)<<14;
data+=(dot%4)<<5;
GPIO_ResetBits(GPIOA,GPIO_Pin_2); //pa2(rck)=0
for(i=0;i<24;i++)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_3); //pa3(sck)=0
if(data&0x800000) //从高位开始送
GPIO_SetBits(GPIOA,GPIO_Pin_1); //pa1(ser)=1
else
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //pa1(ser)=0
data<<=1;
GPIO_SetBits(GPIOA,GPIO_Pin_3); //pa3(sck)=1
}
GPIO_SetBits(GPIOA,GPIO_Pin_2); //pa2(sck)=1
}
主程序
#include "stm32f10x.h"
#include "lcd.h"
u32 TimingDelay = 0;
void Delay_Ms(u32 nTime);
void SEG_Init(void);
void SEG_Dis(unsigned char data1,unsigned char data2,unsigned char data3,unsigned char dot);
unsigned int Seg=0;
unsigned char Sec=0,Sec1=0,dot=0;
unsigned Tick_ms=0;
int main(void)
{
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
SysTick_Config(SystemCoreClock/1000);
SEG_Init();
SEG_Dis(0x10,0x10,0x10,0); //先把三个数码管全部熄灭
LCD_DisplayStringLine(Line0," ");
LCD_DisplayStringLine(Line1," ");
LCD_DisplayStringLine(Line2," ");
LCD_DisplayStringLine(Line3," ");
LCD_DisplayStringLine(Line4," ");
LCD_DisplayStringLine(Line5," ");
LCD_DisplayStringLine(Line6," ");
LCD_DisplayStringLine(Line7," ");
LCD_DisplayStringLine(Line8," ");
LCD_DisplayStringLine(Line9," ");
//依次显示0-999
while (1)
{
if(Sec1!=Sec)
{
Sec1=Sec;
SEG_Dis((Seg&0xf00)>>8,(Seg&0xf0)>>4,(Seg&0xf),dot++);
Seg+=0x111;
if(Seg>0x1000)
Seg=0;
}
}
}
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
作者:初入江湖的郭大侠