STM32实现8*8点阵动态显示

初学者通过STM32F103ZE实现8*8点阵屏动态显示0-9,采用GPIOA和GPIOB控制,关闭JTAG并使能SWD,两种显示方式:从左到右滚动和逐帧显示。代码中包含初始化配置、点阵数据及扫描逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

本人初学者小白一枚,并不能实现很好的功能,只是边学习边玩,有不足的地方希望给位提出改正。

实现效果

基于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.文件展示

 希望能给同样初学的你带来帮助。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值