作者:*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芯片的的具体使用可以参考手册,这里我简单的叙述一下:
//初始化
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位数据全部完成之后变化)