蓝桥杯扩展板学习之数码管

作者:*wj(萌新一枚,有不足和错误希望多多指点帮助改正)
数码管
硬件知识
根据电路图可以知道:数码管是根据三个595移位数据锁存器来控制数码管的显示的,并且数码管只有段选没有位选。
1:数码管是共阴数码管(高电平点亮)
2:数码管的断码:0-f-熄灭
{0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 ,0x00};仅供参考
3.SN74LS595N芯片的的具体使用可以参考手册,这里我简单的叙述一下:

1.在这里插入图片描述

  1. 在这里插入图片描述
    管脚说明:
  2. SCK(11 脚):上升沿时数据寄存器的数据移位。QA–>QB–>QC–>…–>QH;下降沿移位寄存器数据不变
  3. RCK(12 脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
  4. SER(14脚):每输入一位数据,串行输入时钟 SCK 上升沿有效一次,直到八位数据输入完毕
    在这里插入图片描述
    程序
//初始化
void STM3210B_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_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

}

//寄存器操作
void SEG_DisplayValue(u8 Bit1,  u8 Bit2, u8 Bit3)
{
	u8 i = 0;	 //定义循环变量
	u8 code_tmp = 0;  //中间存储数据变量

	code_tmp = Seg7[Bit3]; //传入第三个数码管内容
	for(i=0;i<8;i++){

		if(code_tmp & 0x80)  //依次判断code_tmp的最高位的电平:高电平,则拉高SER;低电平,拉低SER
		{
		  SER_H;           //GPIO_SetBits(GPIOA,GPIO_Pin_3)    点亮数码管段选
	   }
		else
		{
	     SER_L;           //GPIO_ResetBits(GPIOA,GPIO_Pin_3)  不点亮数码管段选
		}
				SCK_H;           //上升沿时数据寄存器的数据移位
				code_tmp = code_tmp << 1; //依次左移位数据并保存到code_tmp
				SCK_L;           //下降沿移位寄存器数据不变
	   }
	
	code_tmp = Seg7[Bit2];//传入第二个数码管内容
	for(i=0;i<8;i++){

		if(code_tmp & 0x80){
			SER_H;
		}else{
			SER_L;
		}
		SCK_H;
		code_tmp = code_tmp << 1;   
		SCK_L;
	}	
	
	code_tmp = Seg7[Bit1];//传入第一个数码管内容
	for(i=0;i<8;i++){

		if(code_tmp & 0x80){
			SER_H;
		}else{
			SER_L;
		}
		SCK_H;
		code_tmp = code_tmp << 1;   
		SCK_L;
	}		
	RCLK_H;//上升沿时移位寄存器的数据进入数据存储寄存器
	RCLK_L;//下降沿移位寄存器数据不变
}

//头文件
#ifndef __SEG_H
#define __SEG_H

#define RCLK_H			GPIO_SetBits(GPIOA,GPIO_Pin_2)
#define RCLK_L			GPIO_ResetBits(GPIOA,GPIO_Pin_2)

#define SER_H			GPIO_SetBits(GPIOA,GPIO_Pin_1)
#define SER_L			GPIO_ResetBits(GPIOA,GPIO_Pin_1)

#define SCK_H			GPIO_SetBits(GPIOA,GPIO_Pin_3)
#define SCK_L			GPIO_ResetBits(GPIOA,GPIO_Pin_3)

void STM3210B_SEG_Init(void);
void SEG_DisplayValue(u8 Bit1,u8 Bit2,u8 Bit3);

#endif

本人觉得不太好理解在于:
1.595寄存器的移位先传入第三数码管
2.SCK(每位数据都变),RCK(24位数据全部完成之后变化)

*wj
发布了9 篇原创文章 · 获赞 6 · 访问量 279

猜你喜欢

转载自blog.csdn.net/weixin_44236302/article/details/104678827