【嵌入式协议外设篇】-8×8 点阵屏
一、适用场景
适用场景:字符/图形显示教学、滚动字幕、小游戏(贪吃蛇、贪吃蛇小屏版)、电子徽章、表盘/动画演示等。8×8 点阵是入门图形显示和扫描驱动的经典硬件平台,便于理解多路复用与显示驱动原理。
二、器材清单
8*8点阵屏模块 ×1
STM32F103VET6 ×1
若干杜邦线(母对母/公对公,根据引脚)
5V/3.3V电源
三、工作原理(要点)
数据实际上是写入到MAX7219芯片中,写入的流程是,先将CS设置为低电平表示写入开始,然后将要发送的数据输入一位到DIN引脚中,然后CLK产生一个下降沿,最后CS设置为高点平表示写入结束。
四、接线示意
VCC → +5V
GND → GND
标准库
DIN→ PA0
CS→ PA1
CLK→ PA4
HAL库
DIN→ PA0
CS→ PA1
CLK→ PA2
五、示例代码
//标准库
int buffer[8]={0x00,0x66,0xff,0xff,0xff,0x7e,0x3c,0x18};
int buffer1[8]={0x18,0x18,0xff,0x99,0x99,0xff,0x18,0x18};
int buffer2[8]={0x7E,0x7E,0x5A,0x7E,0x7E,0x5E,0x7E,0x7E};
int buffer3[8]={0x7E,0x10,0x10,0x1C,0x24,0x4C,0x84,0x00};
int buffer4[8]={0x2A,0x2A,0x3E,0x08,0x0E,0x12,0x26,0x42};void gpio_init()
{GPIO_InitTypeDef PA;//使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);PA.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 |GPIO_Pin_4;PA.GPIO_Mode = GPIO_Mode_Out_PP;PA.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&PA);}void send_num(int bytedata)//写入数据到DIN
{int i;for(i=0;i<8;i++) //将数据一位一位发送出去{if(bytedata & 0x80)GPIO_SetBits(GPIOA,GPIO_Pin_0);elseGPIO_ResetBits(GPIOA,GPIO_Pin_0);bytedata=bytedata<<1;GPIO_SetBits(GPIOA,GPIO_Pin_4); //CLK产生下降沿表示此数据有效GPIO_ResetBits(GPIOA,GPIO_Pin_4);}
}void write_news(int address,int num)//写入数据
{GPIO_SetBits(GPIOA,GPIO_Pin_1);GPIO_ResetBits(GPIOA,GPIO_Pin_1);GPIO_ResetBits(GPIOA,GPIO_Pin_4);//提前拉低CLK,防止在后面造成干扰send_num(address);send_num(num);GPIO_SetBits(GPIOA,GPIO_Pin_1);
}void show_num(char num)//显示数字
{int j;for(j=0;j<8;j++){switch(num){case 'x':write_news(j+1,buffer[j]);break;case 'z':write_news(j+1,buffer1[j]);break;case 'g':write_news(j+1,buffer2[j]);break;case 'w':write_news(j+1,buffer3[j]);break;case 's':write_news(j+1,buffer4[j]);break;}}Delay_us(1000000);
}int main(void)
{ SysTick_Init(); //延时函数初始化 gpio_init(); //初始化与LED连接的硬件接口write_news(0x09,0x00);write_news(0x0a,0x03);write_news(0x0b,0x07);write_news(0x0c,0x01);write_news(0xff,0x00);while(1){ show_num('x');show_num('z');show_num('g');show_num('w');show_num('s');}
}
//HAL库
int buffer[8]={0x00,0x66,0xff,0xff,0xff,0x7e,0x3c,0x18};
int buffer1[8]={0x18,0x18,0xff,0x99,0x99,0xff,0x18,0x18};
int buffer2[8]={0x7E,0x7E,0x5A,0x7E,0x7E,0x5E,0x7E,0x7E};
int buffer3[8]={0x7E,0x10,0x10,0x1C,0x24,0x4C,0x84,0x00};
int buffer4[8]={0x2A,0x2A,0x3E,0x08,0x0E,0x12,0x26,0x42};void send_num(int bytedata)
{int i;for(i=0;i<8;i++) //将数据一位一位发送出去{if(bytedata & 0x80)HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);elseHAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);bytedata=bytedata<<1;HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);}
}void write_news(int address,int num)
{
// HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);send_num(address);send_num(num);HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
}void show_num(char num)
{int j;for(j=0;j<8;j++){switch(num){case 'x':write_news(j+1,buffer[j]);break;case 'z':write_news(j+1,buffer1[j]);break;case 'g':write_news(j+1,buffer2[j]);break;case 'w':write_news(j+1,buffer3[j]);break;case 's':write_news(j+1,buffer4[j]);break;}}HAL_Delay(1000);
}void led_init()
{write_news(0x09,0x00);write_news(0x0a,0x03);write_news(0x0b,0x07);write_news(0x0c,0x01);write_news(0x0f,0x00);
}
while (1){show_num('x');show_num('z');show_num('g');show_num('w');show_num('s');/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}
六、讲解视频
https://www.bilibili.com/video/BV1JXpczjEyo/?spm_id_from=333.1387.search.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719
https://www.bilibili.com/video/BV1kmpczUEW3/?spm_id_from=333.1387.search.video_card.click
https://www.bilibili.com/video/BV1A2pcznEJQ/?spm_id_from=333.1387.search.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719