一、实现的功能
三位数码管电路原理图: 引脚芯片图: 引脚功能图:
- ①实现3位数码管轮询显示显示0~F,每隔一秒显示一次;
- ②编写数码管显示驱动,了解数码管显示原理;
- ③了解74LS595芯片的串行数据变成并行数据作用,以及如何驱动数码管;
二、根据功能实现代码
1、主文件main.c
#include"key.h"
#include"led.h"
#include"lcd.h"
#include"stdio.h"
#include <stm32f10x.h>
#include"seg.h"
unsigned int uiSeg;
unsigned char ucSec,ucSec1,ucDot;
unsigned long ulTick_ms;
int main(void)
{
SysTick_Config(72000);
KEY_Init();
LED_Init();
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
SEG_Init();
SEG_Disp(0x10,0x10,0x10,0);
while(1)
{
if(ucSec != ucSec1)
{
ucSec1 = ucSec;
SEG_Disp((uiSeg&0xf00)>>8,(uiSeg&0xf0)>>4,uiSeg&0xf,ucDot++);
uiSeg +=0x111;
if(uiSeg > 0x1000)
uiSeg = 0;
}
}
}
void SysTick_Handler(void)
{
ulTick_ms++;
if(ulTick_ms % 1000 ==0)
ucSec++;
}
主函数分析:?? ?? ??
- 添加数码管的初始化函数,并熄灭3位数码管的显示;
- 3位数码管从0显示到f,每隔1s显示一个数,重复以上动作;
2、数码管头文件“seg.h”
#include "stm32f10x.h"
void SEG_Init(void);
void SEG_Disp(unsigned char ucData1,unsigned char ucData2,
unsigned char ucData3,unsigned char ucDot);
简要分析:?? ??
- 74LS595对应的引脚进行初始化;
- 3位数码管的显示函数;
3、数码管源文件“seg.c”
#include "seg.h"
void SEG_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
void SEG_Disp(unsigned char ucData1,unsigned char ucData2,
unsigned char ucData3,unsigned char ucDot)
{
unsigned char i;
unsigned char code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned long ulData = (code[ucData3] << 16) + (code[ucData2] << 8)
+ (code[ucData1]);
ulData += (ucDot & 1) << 23;
ulData += (ucDot & 2) << 14;
ulData += (ucDot & 4) << 5;
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
for(i=0;i<24;i++)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
if(ulData & 0x800000)
GPIO_SetBits(GPIOA,GPIO_Pin_1);
else
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
ulData <<= 1;
GPIO_SetBits(GPIOA,GPIO_Pin_3);
}
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
简要分析:?? ??
- 74LS595对应SER、SRCLK、RCLK的3个引脚设置为推挽输出模式;
- 3位数码管的串行数据封装为24位,3个字节组成,第几个字节数据对应第几个数码管;
- 而小数点由三个字节组成,显示的方式和数码管数字相反;
- 工作流程:①拉低RCK(锁存时钟) → ②轮询24次,先拉低SCK移位寄存器时钟 → ③判断24位数据的最高位是否等于1,如果是,拉高SER(串行数据)高电平,否则拉低SER(串行数据)低电平 → ④ulData数据向左移一位,拉高SCK移位寄存器时钟,再次判断下一位 → ⑤轮询结束后,拉高RCK(锁存时钟),把数据进行输出。
- 数码管显示的数字,可以到网上查找进行移植,一般显示0 ~ 9和a ~ F字符;
三、实现功能过程的注意与学习点
1、注意点
- 74LS595的串行数据转并行数据的过程中,得按照顺序进行;
- 注意单片机连接到74LS595的引脚输出高低电平,否则无法正常显示数据;
2、学习的知识点
- ①学习74LS595芯片的串行数据转并行数据的操作,减少单片机IO引脚的使用;
- ②掌握数码管的显示功能;
- ③学会把三个单独字节的数据封装到long变量中;
- ④通过循环和移位,实现每一位数据的数据判断;
?? ?? ?? ?? ?? ??
|