一、控制数码管的构成
在我手上的这块开发板(正点原子的nano板)控制数码管需要控制 38译码器 和 595锁存器。下面主要说明一下两块芯片的原理 以及 如何用STM32 keil的开发环境实现。
二、595锁存器 以及 38译码器
595锁存器功能简介:SCLK每来一个上升沿,DATA中的数据进入到595中,如此读八次之后,再有一个LCLK,就全部把八位数据并行输出,输出的端脚为QA~QH。 38译码器:将来自A0—A2中的三位数据转到CH1—CH8中的某一个高电平。
三、实现代码
(1)宏定义部分
#define DATA PBout(3)
#define LCLK PBout(4)
#define SCLK PBout(5)
#define SISEL0 PCout(10)
#define SISEL1 PCout(11)
#define SISEL2 PCout(12)
#define JTAG_SWD_DISABLE 0X02
#define SWD_ENABLE 0X01
#define JTAG_SWD_ENABLE 0X00
(2)定义一个给数码管显示的列表
u8 temp[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x01,0x00};
(3)关闭jtag,因为PB4正常是作为jtag使用,所以先关闭他的jtag功能。
void JTAG_Set(u8 mode)
{
u32 temp;
temp=mode;
temp<<=25;
RCC->APB2ENR|=1<<0;
AFIO->MAPR&=0XF8FFFFFF;
AFIO->MAPR|=temp;
}
(4)使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB,ENABLE);
(5)对GPIO进行初始化
GPIO_InitTypeDef GPIO_InitStructre;
GPIO_InitStructre.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructre.GPIO_Pin= GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_11
GPIO_InitStructre.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructre);
GPIO_InitStructre.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructre.GPIO_Pin= GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructre.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructre);
(6)产生上升沿、下降沿使得数据能输出到数码管上
while(1){
SISEL0 = 1;
SISEL1 = 1;
SISEL2 = 1;
SCLK = 0;
LCLK = 0;
tmp=temp[2];
for( j = 0 ; j < 8 ; j ++ )
{
DATA = tmp & 0X01;
SCLK =1;
SCLK =0;
tmp = tmp >> 1;
}
LCLK = 1;
}
(7)总体代码
#include "sys.h"
#define DATA PBout(3)
#define LCLK PBout(4)
#define SCLK PBout(5)
#define SISEL0 PCout(10)
#define SISEL1 PCout(11)
#define SISEL2 PCout(12)
#define JTAG_SWD_DISABLE 0X02
#define SWD_ENABLE 0X01
#define JTAG_SWD_ENABLE 0X00
u8 tmp,j;
u8 temp[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x01,0x00};
void JTAG_Set(u8 mode)
{
u32 temp;
temp=mode;
temp<<=25;
RCC->APB2ENR|=1<<0;
AFIO->MAPR&=0XF8FFFFFF;
AFIO->MAPR|=temp;
}
int main(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructre;
GPIO_InitStructre.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructre.GPIO_Pin= GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_11;
GPIO_InitStructre.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructre);
GPIO_InitStructre.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructre.GPIO_Pin= GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructre.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructre);
JTAG_Set(SWD_ENABLE);
while(1){
SISEL0 = 1;
SISEL1 = 1;
SISEL2 = 1;
SCLK = 0;
LCLK = 0;
tmp=temp[2];
for( j = 0 ; j < 8 ; j ++ )
{
DATA = tmp & 0X01;
SCLK =1;
SCLK =0;
tmp = tmp >> 1;
}
LCLK = 1;
}
}
|