说明
本人初学者小白一枚,并不能实现很好的功能,只是边学习边玩,有不足的地方希望给位提出改正。
实现效果
基于STM32实现点阵屏动态显示,两种方式实现0——9的显示。
1、从左到右依次显示0--9.
2、逐帧显示0--9
视频展示
https://www.bilibili.com/video/BV1d64y1x7qF
硬件
我使用的是STM32F103ZE,由于没准备最小系统,是直接连接在开发板上的,使用的是GPIOA的IO-0~IO-7、GPIOB的IO-0~IO-7。
LED点阵使用的是共阴极1088AS,8*8点阵的知识可自行查找。
GPIOA的IO-0~IO-7连接的阴极,GPIOB的IO-0~IO-7连接的阳极。
代码
1.leddz.c
1.1使能GPIO口
#include "stm32f10x.h"
#include "leddz.h"
void Inleddz()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//打开GPIO时钟,先打开复用才能修改复用功能
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//要先打开时钟,在重映射;这句表示关闭jtag,使能swd
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=SMGAX;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,SMGAX);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=SMGBX;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,SMGBX);
}
?2.leddz.h
2.1定义管脚
#ifndef __LEDDZ_H_
#define __LEDDZ_H_
#define SMGAX GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7 //用来定义PA的管脚
#define SMGBX GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7 //用来定义PB的管脚
void Inleddz(void);
#endif
3.main.c
/******************************************************************************************************************/
//该程序使用了STM32F103ZE系列,使用了PA的IO_0-IO_7,PB口的IO_0-IO_7,PB3.PB4涉及到端口复用要关闭jtag,使能swd。使用的是共阴极8*8点阵
#include "stm32f10x.h"
#include "leddz.h"
#define speed 10000 //用于调节速度
int main()
{
int i=0;
int j=0;
int n=0;
int sum=0;
int a[88]={
0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,//0
0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,//1
0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00,//2
0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00,//3
0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,//4
0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00,//5
0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00,//6
0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00,//7
0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00,//8
0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00,//9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00//如果需要移动显示的话,就需加上这行,数组a[80]改成a[88]
};
int b[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
Inleddz();
while (1)
{
// 开场逐个扫描,用于判断所有LED都是好的
GPIO_SetBits (GPIOA,1<<i);
GPIO_ResetBits(GPIOB,3<<j);
GPIO_ResetBits (GPIOA,1<<i);
GPIO_SetBits (GPIOB,3<<j);
// **********************************************************
if(n==0) //判断开场扫描是否完成
{
sum++; //扫描次数
if(sum>6*speed) //调节跳转速度
{
sum=0;
j++;
if(j>8)
{
j=0;
i++;
if(i>8)
{
i=0;
n=1; //判断用何种方式显示数字
}
}
}
}
if(n==1)
{
for(i=0;i<8;i++)
{
GPIO_SetBits (GPIOA,a[i+j]); //PA输出高电平
GPIO_ResetBits(GPIOB,b[i]); //PB输出低电平
GPIO_ResetBits (GPIOA,a[i+j]); //PA输出低电平
GPIO_SetBits (GPIOB,b[i]); //PA输出低电平
}
sum++;
if(sum>8*speed) //调节跳转速度
{
sum=0;
j+=8; //跳到下一个数字
if(j>80) //盘点是否显示完最后一个数字
{
j=0;
}
}
}
//*******************************************************************************
//移动显示数字的方式
if(n==2)
{
for(i=0;i<8;i++)
{
GPIO_SetBits (GPIOA,a[i+j]); //PA输出高电平
GPIO_ResetBits(GPIOB,b[i]); //PB输出低电平
GPIO_ResetBits (GPIOA,a[i+j]); //PA输出低电平
GPIO_SetBits (GPIOB,b[i]); //PA输出低电平
}
sum++;
if(sum>1.5*speed)
{
sum=0;
j++;
if(j>80)
j=0;
}
}
/****************************************************************************************************/
/* 不断定义IO口扫描的方式来实现,静态扫描 */
/****************************************************************************************************/
// GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_7); //A0和A7管脚输出高电平
// GPIO_ResetBits(GPIOB,GPIO_Pin_0); //B0管脚输出低电平 是的回路导通
// GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_7);//A0和A7管脚输出高电平
// GPIO_SetBits(GPIOB,GPIO_Pin_0); //B0管脚输出低电平 是的回路导通
//
// GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_6);
// GPIO_ResetBits(GPIOB,GPIO_Pin_1);
// GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_6);
// GPIO_SetBits(GPIOB,GPIO_Pin_1);
//
// GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_5);
// GPIO_ResetBits(GPIOB,GPIO_Pin_2);
// GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_5);
// GPIO_SetBits(GPIOB,GPIO_Pin_2);
//
// GPIO_SetBits(GPIOA,GPIO_Pin_3|GPIO_Pin_4);
// GPIO_ResetBits(GPIOB,GPIO_Pin_3);
// GPIO_ResetBits(GPIOA,GPIO_Pin_3|GPIO_Pin_4);
// GPIO_SetBits(GPIOB,GPIO_Pin_3);
//
// GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_3);
// GPIO_ResetBits(GPIOB,GPIO_Pin_4);
// GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_3);
// GPIO_SetBits(GPIOB,GPIO_Pin_4);
//
// GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_2);
// GPIO_ResetBits(GPIOB,GPIO_Pin_5);
// GPIO_ResetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_2);
// GPIO_SetBits(GPIOB,GPIO_Pin_5);
//
// GPIO_SetBits(GPIOA,GPIO_Pin_6|GPIO_Pin_1);
// GPIO_ResetBits(GPIOB,GPIO_Pin_6);
// GPIO_ResetBits(GPIOA,GPIO_Pin_6|GPIO_Pin_1);
// GPIO_SetBits(GPIOB,GPIO_Pin_6);
//
// GPIO_SetBits(GPIOA,GPIO_Pin_7|GPIO_Pin_0);
// GPIO_ResetBits(GPIOB,GPIO_Pin_7);
// GPIO_ResetBits(GPIOA,GPIO_Pin_7|GPIO_Pin_0);
// GPIO_SetBits(GPIOB,GPIO_Pin_7);
}
}
4.文件展示
?希望能给同样初学的你带来帮助。
|