数码管显示

Rose ·
更新时间:2024-09-20
· 901 次阅读

本程序对应的开发板为蓝桥杯嵌入式开发板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); }
作者:初入江湖的郭大侠



数码管 数码

需要 登录 后方可回复, 如果你还没有账号请 注册新账号