第十一届蓝桥杯嵌入式组别底层驱动程序-拓展板(数码管)

第十一届蓝桥杯嵌入式组别底层驱动程序-拓展板(数码管)

PA1-SER
PA2-RCK
PA3-SCK

/*******************************************************************************  
* 文件名称:SEG
* 日期版本:2019-12-2/V3.0b 
* 作    者:零点工作室(RMLS)
*******************************************************************************/
#include "stm32f10x.h"
#include "seg.h"

u8 Seg7[]={
    
                           //标准字库
//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,

// -     H    J    K    L    N    o   P    U    
  0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73};    
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){
    
    
			SER_H;
		}else{
    
    
			SER_L;
		}
		SCK_H;					//打开移位
		code_tmp = code_tmp << 1;   
		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;
}

/*
	RCLK(R:存储寄存器读取)
			上升沿 移位寄存器进入存储寄存器
			下降沿 数据保持不变
	SCK(S:送入595)
			上升沿 数据寄存器数据移位。Q0–>Q1–>Q2–>Q3–>…–>Q7;	
			下降沿 移位寄存器数据不变
	SER(数据脚)
			串行数据输入端
*/

#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

	STM3210B_SEG_Init();		//数码管初始化
	SEG_DisplayValue(16,16,16);	//SEG OFF
//数码管	

猜你喜欢

转载自blog.csdn.net/weixin_43352501/article/details/103354267