上一篇:STM32-(16):Systick 系统时钟 | 下一篇:STM32-(18):SPI与数码管(SPI) |
---|
数码管
数码管是一种应用很普遍的显示器件,从单片机、ARM到许多微型机控制系统及数字化仪器仪表中都用到数码管作为显示输出。
数码管的主要部分是七段发光_极管;数码管分为共阴极和共阳极两种;为了保护各段 LED ,需外加限流电阻。有的产品还附带有一个小数点,故有人叫其为八段式发光二极管。
由7个发光段的不同组合,从而实现十六进制数的显示。线面分别是共阴极和共阳极0-9的编码表。
数码管的连接方式
**段选端:**可以控制数码管显示内容;
**位选端:**用于控制整个数码管是否工作:共阴极数码管,位选端要接地;共阳极数码管,位选端要接高电平
595芯片
串行转并行的芯片
|
|
---|---|
![]() | ![]() |
595工作的过程解释:
①:如果SCLR(异步清零端)为低电平,那么所有的移位寄存器就被清零,同时输出端Q清零;
②:G是允许输出端,如果不是低电平而是高电平,那么QA-QH就为三态(悬空、高阻态,既不为1也不为0);
③:要让整个芯片通信成功,首先要让SCLR为高电平,然后要让输出G端为低电平,此时,当SCK来一个上升沿(SCLR=1),此时内部移位寄存器的时钟会工作,在这个时钟的驱动下,Q0(这里能看到的是QA,见下方“注1”)的值由SER传进来,即Q0=SER,而Q0原来的值会传给Q1,即QN=QN-1。会发生一个移位的现象。
④:当移位完成之后,如果RCK出现上升沿,移位寄存器的内容将会传输到输出锁存器
注1:其实在595芯片内部存在两列寄存器,综合引脚图,可以想象一下,左侧一列是(输出移位)Q0-Q7,右边一列是(输出所存)QA-QH,当RCK来一个上升沿,Q0的值就会给QA,Q1的值给QB,依此类推。
注2:595相对于164来讲主要是多了RCK输出锁存器和G允许输出端(允许三态的存在)
解释:上图中的smgA1-4等等都是位选端,为了增加数码管的亮度,这里增加了三极管起到放大电流的作用,以smgA4为例,当这里输出一个低电平,三极管导通,对应的数码管就能通电工作。(这里能看出数码管是共阳的连接方式),这里一共用到的引脚数9个(U14 中的 9/11/12/13/14+smgA1-A4一共是9个引脚),比原来的12个节省了3个引脚(原来12个是指U15的引脚 8+4)。
硬件电路引脚连接
1.首先看smgA1-A4,在核心板原理图的底板排针图中找
2.然后在核心板原理图的CPU部分查找:由上图可知smgA1-A4,对应名称分别是 PC8/SPI2_MOSI/PC9/PE8
由结果可知,A1-A4分别对应连接核心板上的 65、54、66、39引脚。(我们可以看到很多的端口是复用的)
3.继续找595_nCS、SCK0、MOSI0、MISO0、RCK 对应引脚。
由结果可知,595nCS、RCK、SCK0、MISO0、MOSI0 分别对应连接核心板上的 23、24、30、31、32引脚。
实验1:驱动第一个数码管显示0(软件模拟)
综合上面的分析,我们可以把需要用的引脚与CPU的连接关系列出来:
smgA1—PC8:0 导通
RCK—PA1
SCK0—SPI1SCK—PA5
MISO0—PA6
MOSI0—PA7
595_nCS—PA0
/*Include---------------------------*/
#include"stm32f10x_lib.h" //包含所有的头文件
#include<stdio.h>
//----------------函数声明--------------------
void Delay_MS(u16 dly);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART3_Configuration(void);
/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{
u8 i,data;
#ifdef DEBUG
debug();
#endif
//------------初始化------------
RCC_Configuration();
GPIO_Configuration();
//------------数码管的控制------------
//smgA1---PC8: 0 //RCK--PA1 //SCK--PA5 //MISO0---PA6 //MOSI0---PA7 //595_nCS----PA0
//1、smgA1 PC8=0 595_nCS=0,
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
//2、SCK0 上升沿 MOSI0 数据输入 完成这个数据的通信 00100100
data=0x24;
for(i=0;i<8;i++)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //pa5=0
if((data&0x01)==0x00)
GPIO_ResetBits(GPIOA, GPIO_Pin_7);
else
GPIO_SetBits(GPIOA, GPIO_Pin_7);
GPIO_SetBits(GPIOA, GPIO_Pin_5); //pa5=1
data>>=1;
}
//3、RCK上升沿进行锁存
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
Delay_MS(2);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
/*******************************************************************************
* Function Name : Delay_Ms
* Description : delay 1 ms.
* Input : dly (ms)
* Output : None
* Return : None
*******************************************************************************/
void Delay_MS(u16 dly)
{
u16 i,j;
for(i=0;i<dly;i++)
for(j=1000;j>0;j--);
}
/*******************************************************************************
* Function Name : RCC_Configuration
* Description : Configures the different system clocks.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void RCC_Configuration(void)
{
//----------使用外部RC晶振-----------
RCC_DeInit(); //初始化为缺省值
RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state
RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ
RCC_PLLCmd(ENABLE); //Enable PLLCLK
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock
while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source
//---------打开相应外设时钟--------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //使能APB2外设的GPIOA的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOC,ENABLE);
}
/*******************************************************************************
* Function Name : GPIO_Configuration
* Description : 初始化GPIO外设
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void GPIO_Configuration(void)
{
//smgA1---PC8: 0 //RCK--PA1 //SCK0---I1SCK--PA5 //、、MISO0---PA6 //MOSI0---PA7 //595_nCS----PA0
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5 | GPIO_Pin_7; //选择PA.0、PA.1、PA.5、PA.7(输出)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式为推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //选择PA.6(输入)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //选择PC.8(输出)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管脚频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式为推挽输出
GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PB5
}
void USART3_Configuration(void)
{
USART_InitTypeDef U3;
U3.USART_BaudRate =9600;
U3.USART_WordLength = USART_WordLength_8b;
U3.USART_StopBits = USART_StopBits_1;
U3.USART_Parity = USART_Parity_No;
U3.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
U3.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART3, &U3);
USART_Cmd(USART3,ENABLE);
}
上一篇:STM32-(16):Systick 系统时钟 | 下一篇:STM32-(18):SPI与数码管(SPI) |
---|