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

说明

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

实现效果

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

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

  • 13
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是一个简单的例子,使用STM32的GPIO口控制8*8 LED点阵。您可以根据自己的需求进行修改。 ```c #include "stm32f10x.h" // 定义引脚 #define LED_LAT_GPIO GPIOA #define LED_LAT_PIN GPIO_Pin_0 #define LED_OE_GPIO GPIOA #define LED_OE_PIN GPIO_Pin_1 #define LED_SCLK_GPIO GPIOA #define LED_SCLK_PIN GPIO_Pin_2 #define LED_SDA_GPIO GPIOA #define LED_SDA_PIN GPIO_Pin_3 // 控制LED点阵的函数 void led_write_byte(unsigned char dat) { unsigned char i; for (i = 0; i < 8; i++) { if (dat & 0x80) { GPIO_SetBits(LED_SDA_GPIO, LED_SDA_PIN); } else { GPIO_ResetBits(LED_SDA_GPIO, LED_SDA_PIN); } dat <<= 1; GPIO_ResetBits(LED_SCLK_GPIO, LED_SCLK_PIN); GPIO_SetBits(LED_SCLK_GPIO, LED_SCLK_PIN); } } void led_write(unsigned char address, unsigned char dat) { GPIO_ResetBits(LED_LAT_GPIO, LED_LAT_PIN); led_write_byte(address); led_write_byte(dat); GPIO_SetBits(LED_LAT_GPIO, LED_LAT_PIN); } void led_init() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = LED_LAT_PIN | LED_OE_PIN | LED_SCLK_PIN | LED_SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(LED_LAT_GPIO, LED_LAT_PIN); GPIO_SetBits(LED_OE_GPIO, LED_OE_PIN); GPIO_ResetBits(LED_SCLK_GPIO, LED_SCLK_PIN); GPIO_ResetBits(LED_SDA_GPIO, LED_SDA_PIN); } int main() { led_init(); // 在此处添加要显示的图案的代码 // 例如:led_write(0x00, 0x00); while (1); } ``` 在 `main` 函数中,您可以使用 `led_write` 函数来控制LED点阵。函数的第一个参数表示要写入的地址,第二个参数表示要写入的数据。此外,您还可以在 `led_init` 函数中进行引脚的初始化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值