第十一届蓝桥杯嵌入式组别底层驱动程序-拓展板(数码管)
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
//数码管