嵌入式外设 -- 16X16点阵显示器

目录

一、模块介绍

二、资料获取

关注微信公众号--星之援工作室 发送关键字(16X16点阵)

效果展示  

接线规则(可在lcd.h中自行修改)

三、代码编写

main

lcd.h

lcd.c


一、模块介绍

16X16点阵显示器是一种采用LED点阵组成的显示设备,

它由16行16列的LED点组成,用于显示字符、图形等信息。每个LED点可以独立控制亮灭,通过控制每个点的亮度,可以组合成不同的字符和图形,实现信息的显示。 16X16点阵显示器通常用于户外广告、公交车站信息显示、商场信息公告、停车场引导等领域,具有显示效果好、可视距离远、使用寿命长等特点。

16X16点阵显示器的工作原理是通过控制器发送指令,控制每个LED点的亮灭,形成所需的字符和图形。控制器可以通过串口、并口、网络等方式与计算机或其他设备连接,实现信息的传输和显示。

16X16点阵显示器的优点包括:

1. 显示效果好:采用LED点阵显示,字符和图形清晰,可视距离远。

2. 使用寿命长:LED灯具有很长的使用寿命,一般可以达到10万小时以上。

3. 低功耗:LED灯具有较低的功耗,有利于节能降耗。

4. 安装方便:可以根据需要进行悬挂、固定等方式安装。

5. 维护简单:LED点阵显示器采用模块化设计,维护方便。

6. 广泛应用:适用于各种场合的信息显示,如户外广告、公交车站、商场、停车场等。 总之,16X16点阵显示器是一种性能优良、应用广泛的显示设备,具有很高的实用价值。

二、资料获取

关注微信公众号--星之援工作室 发送关键字(16X16点阵

➡️🫡🫡🫡🫡🫡🫡🫡🫡➡️

效果展示  

接线规则(可在lcd.h中自行修改)

 

三、代码编写

main

/*--------------------------------------------------------*
 *                                       								  *
 *   星之援网络科技工作室学习资料v1.0    									*
 *		              																			*
 *		 程序介绍:16*16实验               								  *
 *		 实现效果:显示汉字何   								 						 *
 *                                      							    *
 *--------------------------------------------------------*
*/

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "usart.h"
#include "lcd.h"

const unsigned char  Word1[1][32] = 
{

0xF7,0xF7,0xF0,0xEF,0xEF,0xCC,0xCD,0xAD,0x6D,0xED,0xEC,0xED,0xEF,0xEF,0xEF,0xEF,
0xFF,0xFF,0x01,0xF7,0xF7,0x37,0xB7,0xB7,0xB7,0xB7,0x37,0xB7,0xF7,0xF7,0xD7,0xEF,/*"何",0*/

};

int main(void)
{
	char str[50];
	u8 key=0;
	delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	// LED 端口初始化 
	LED_GPIO_Config();
	// 串口初始化
	uart_init(115200);
	
	System_PB34_setIO();
	lcd_GPIO_init();

	printf("init ok\n");
				
  while(1)
	{
		Display(Word1);
  }   
}

lcd.h

可以自行修改定义的io口

#ifndef __lcd12864_H_
#define __lcd12864_H_

#include "sys.h"
//  引脚定义
#define D_GPIO_CLK RCC_APB2Periph_GPIOB
#define D_GPIO_PORT GPIOB
#define D_GPIO_PIN GPIO_Pin_0

#define C_GPIO_CLK RCC_APB2Periph_GPIOB
#define C_GPIO_PORT GPIOB
#define C_GPIO_PIN GPIO_Pin_9

#define B_GPIO_CLK RCC_APB2Periph_GPIOB
#define B_GPIO_PORT GPIOB
#define B_GPIO_PIN GPIO_Pin_8

#define A_GPIO_CLK RCC_APB2Periph_GPIOB
#define A_GPIO_PORT GPIOB
#define A_GPIO_PIN GPIO_Pin_7

#define G_GPIO_CLK RCC_APB2Periph_GPIOB
#define G_GPIO_PORT GPIOB
#define G_GPIO_PIN GPIO_Pin_6

#define DI_GPIO_CLK RCC_APB2Periph_GPIOB
#define DI_GPIO_PORT GPIOB
#define DI_GPIO_PIN GPIO_Pin_5

#define CLK_GPIO_CLK RCC_APB2Periph_GPIOB
#define CLK_GPIO_PORT GPIOB
#define CLK_GPIO_PIN GPIO_Pin_4

#define LAT_GPIO_CLK RCC_APB2Periph_GPIOB
#define LAT_GPIO_PORT GPIOB
#define LAT_GPIO_PIN GPIO_Pin_3
// 状态
#define D_ON digitalHi(D_GPIO_PORT, D_GPIO_PIN)
#define D_OFF digitalLo(D_GPIO_PORT, D_GPIO_PIN)

#define C_ON digitalHi(C_GPIO_PORT, C_GPIO_PIN)
#define C_OFF digitalLo(C_GPIO_PORT, C_GPIO_PIN)

#define B_ON digitalHi(B_GPIO_PORT, B_GPIO_PIN)
#define B_OFF digitalLo(B_GPIO_PORT, B_GPIO_PIN)

#define A_ON digitalHi(A_GPIO_PORT, A_GPIO_PIN)
#define A_OFF digitalLo(A_GPIO_PORT, A_GPIO_PIN)

#define G_ON digitalHi(G_GPIO_PORT, G_GPIO_PIN)
#define G_OFF digitalLo(G_GPIO_PORT, G_GPIO_PIN)

#define DI_ON digitalHi(DI_GPIO_PORT, DI_GPIO_PIN)
#define DI_OFF digitalLo(DI_GPIO_PORT, DI_GPIO_PIN)

#define CLK_ON digitalHi(CLK_GPIO_PORT, CLK_GPIO_PIN)
#define CLK_OFF digitalLo(CLK_GPIO_PORT, CLK_GPIO_PIN)

#define LAT_ON digitalHi(LAT_GPIO_PORT, LAT_GPIO_PIN)
#define LAT_OFF digitalLo(LAT_GPIO_PORT, LAT_GPIO_PIN)



void lcd_GPIO_init(void);


void Scan_Line(unsigned char Dbyte);
void Send( unsigned char dat);
void Display(const unsigned char dat[][32]);		

/*********************************************************************************
 * @Function	:	系统设置PB3和PB4为普通IO口
 * @Input		:	deviceSta,设备状态
 * @Output		: 	None
 * @Return		: 	None
 * @Others		: 	JTAG调试方式会受影响
 * @Date			:  2020-04-22
 **********************************************************************************/
void System_PB34_setIO(void);
	
#endif

lcd.c

#include "lcd.H"
#include "delay.h"


unsigned char Display_Buffer[2];

/*!
 *  @brief      GPIO_init
 *  @since      v1.0
 *  @param  None
 */
void lcd_GPIO_init()
{

	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(D_GPIO_CLK, ENABLE); // 使能PB,PE端口时钟

	GPIO_InitStructure.GPIO_Pin = D_GPIO_PIN|C_GPIO_PIN |B_GPIO_PIN|A_GPIO_PIN|G_GPIO_PIN|DI_GPIO_PIN|CLK_GPIO_PIN|LAT_GPIO_PIN; // 端口配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	   // 推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	   // IO口速度为50MHz

	GPIO_Init(GPIOB, &GPIO_InitStructure); // 根据设定参数初始化GPIOB.5

}
/*!
 *  @brief     扫描行
 *  @since      v1.0
 *  @param 
 *  @author     hr
 */
void Scan_Line( unsigned char Dbyte)
{	
	switch(Dbyte)
	{
		case 0:			
			D_OFF;C_OFF;B_OFF;A_OFF; 					
			break;
		case 1:					
			D_OFF;C_OFF;B_OFF;A_ON; 		
			break;
		case 2:					
			D_OFF;C_OFF;B_ON;A_OFF; 		
			break;
		case 3:					
			D_OFF;C_OFF;B_ON;A_ON; 		
			break;
		case 4:
			D_OFF;C_ON;B_OFF;A_OFF; 		
			break;
		case 5:
			D_OFF;C_ON;B_OFF;A_ON; 		
			break;
		case 6:
			D_OFF;C_ON;B_ON;A_OFF; 		
			break;
		case 7:
			D_OFF;C_ON;B_ON;A_ON; 		
			break;
		case 8:
			D_ON;C_OFF;B_OFF;A_OFF; 		
			break;
		case 9:
			D_ON;C_OFF;B_OFF;A_ON; 		
			break;	
		case 10:
			D_ON;C_OFF;B_ON;A_OFF; 		
			break;
		case 11:
			D_ON;C_OFF;B_ON;A_ON; 		
			break;
		case 12:
			D_ON;C_ON;B_OFF;A_OFF; 		
			break;
		case 13:
			D_ON;C_ON;B_OFF;A_ON; 		
			break;
		case 14:
			D_ON;C_ON;B_ON;A_OFF; 		
			break;
		case 15:
			D_ON;C_ON;B_ON;A_ON; 		
			break;
		default : break;	
	}
}
/*!
 *  @brief     发送数据
 *  @since      v1.0
 *  @param 
 *  @author     hr
 */
void Send( unsigned char dat)
{
	unsigned char i;
	CLK_OFF;
	delay_us(1);;	
	LAT_OFF;
	delay_us(1);;

	for( i = 0 ; i < 8 ; i++ )
	{
		if( dat&0x01 )
		{
			DI_ON;	
		}
		else
		{
			DI_OFF;
		}

		delay_us(1);
		CLK_ON;				//上升沿发送数据   
		delay_us(1);
		CLK_OFF;
		delay_us(1);		
		dat >>= 1;
			
	}			
}
/*!
 *  @brief     num为字数  dat[][32]为字模的名称
 *  @since      v1.0
 *  @param 
 *  @author     hr
 */
void Display(const unsigned char dat[][32])					
{
	unsigned char i;

	for( i = 0 ; i < 16 ; i++ )
	{
		G_ON;		//更新数据时候关闭显示。等更新完数据,打开138显示行。防止重影。
		
		Display_Buffer[0] = dat[0][i];		
		Display_Buffer[1] = dat[0][i+16];

		Send(Display_Buffer[1]);
		Send(Display_Buffer[0]);

		LAT_ON;					//锁存数据   
		delay_us(1);
		LAT_OFF;
		delay_us(1);
		Scan_Line(i);							//选择第i行
		G_OFF;
		delay_us(100);;			//延时一段时间,让LED亮起来。    				
	}	
}

/*********************************************************************************
 * @Function	:	系统设置PB3和PB4为普通IO口
 * @Input		:	deviceSta,设备状态
 * @Output		: 	None
 * @Return		: 	None
 * @Others		: 	JTAG调试方式会受影响
 * @Date			:  2020-04-22
 **********************************************************************************/
void System_PB34_setIO(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 打开AFIO时钟
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
}

四、参考

单片机 LED点阵_单片机点阵-CSDN博客文章浏览阅读1.3w次,点赞44次,收藏156次。单片机 LED点阵一、简述 使用8×8LED点阵显示汉字。向上滚动"中华"两个汉字。 文件打包:链接: https://pan.baidu.com/s/1oHSAIY6qVA7qFFWUvMvJEA 密码: snyg二、效果三、工程文件结构1、Keil工程2、仿真电路图四、代码88led.c文件#include<reg51.h>#define uint unsigne..._单片机点阵https://blog.csdn.net/nanfeibuyi/article/details/80539461?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171438431616800222828963%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171438431616800222828963&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-17-80539461-null-null.nonecase&utm_term=%E7%82%B9%E9%98%B5&spm=1018.2226.3001.445051单片机入门——8X8点阵LED_单片机8×8led点阵-CSDN博客文章浏览阅读2.7w次,点赞47次,收藏369次。文章目录1.初识点阵LED1.1.什么是点阵LED1.2.点亮LED点阵1.3.点阵显示图案2.点阵的动画显示2.1.点阵的纵向移动2.2.点阵的横向移动1.初识点阵LED1.1.什么是点阵LEDLED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,是各部分组件都模块化的显示器件,通常由显示模块、控制系统及电源系统组成。LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。点阵LED显示屏作为一种现代电子媒体设备,具有灵活的的显_单片机8×8led点阵https://blog.csdn.net/m0_56646606/article/details/122980667?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171438431616800222828963%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=171438431616800222828963&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-19-122980667-null-null.nonecase&utm_term=%E7%82%B9%E9%98%B5&spm=1018.2226.3001.4450


  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
16×16点阵LED显示汉字 Proteus中点阵LED最大为8×8点阵,不能用来显示汉字,而四片接在一起又因为引脚太近,无法接线。然而,是不是这样就意味着不能仿真“点阵汉字”了呢?笔者经过研究,将库里的8×8点阵LED修改后,将四片8×8点阵LED合并成一体,就成了16×16的点阵LED了。 该LED的特点是:共阴、逐行扫描、低在前高位在后,上面的引脚为数据口,下面的引脚为行选引脚,低电平有效。 电路由AT89C52、4片74HC138、4片8×8点阵组成。74HC138用于选择行,4片74HC138的有效顺序为:左上,右上,左下,右下。P0口作为数据口,4片74HC138列引脚都接到P0口。显示汉字的示意图如下图所示: ---------------------> ----------------------> ---------------------------------------------------------------- LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB ---------------------------------------------------------------- LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB LSB 0 1 2 3 4 5 6 7 MSB | LSB 0 1 2 3 4 5 6 7 MSB ---------------------------------------------------------------- 以下程序在16×16点阵LED上依次显示“梅川酷子”四个字,分别用正向显示和反向显示,间隔两秒钟变换一次,电路图和效果图下图所示。 AT89c52晶振频率为24MHz,用T0定时,改变变量flag值,从而让程序确定显示哪个汉字和显示方式(正向or反向)。 #i nclude #define int8 unsigned char #define int16 unsigned int #define int32 unsigned long int8 flag; /* flag变量 MSB 7 6 5 4 3 2 1 0 LSB × × × Bit5=1,Bit4=0 时,负向显示 Bit5=0,Bit4=1 时,负向显示 Bit[2..0]74HC138的片选信号 */ int8 n; int8 code table[][32]={ {0x88,0x00,0x88,0x00,0x88,0x7F,0x48,0x00,0xDF,0x1F,0xA8,0x10,0x9C,0x12,0xAC,0x14,0xEA,0x7F,0x8A,0x12,0x89,0x14,0x88,0x10,0x88,0x7F,0x08,0x10,0x08,0x14,0x08,0x08},/*"梅",0*/ {0x08,0x20,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x04,0x21,0x04,0x20,0x02,0x00},/*"川",1*/ {0x00,0x08,0xFE,0x08,0x28,0x0A,0x28,0x7E,0xFE,0x0A,0xAA,0x09,0xAA,0xFF,0xEA,0x00,0x86,0x00,0x82,0x7E,0xFE,0x42,0x82,0x42,0x82,0x42,0xFE,0x7E,0x82,0x42,0x00,0x00},/*"酷",2*/ {0x00,0x00,0xF8,0x1F,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x41,0xFE,0xFF,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x40,0x01,0x80,0x00}/*"子",3*/ }; void delay(void); void main(void){ int8 i; int8 j; int8 index; flag=0x10; n=0; //定时器T0初始化 TMOD=0x01; TH0=0xb1; TL0=0xe0; ET0=1; EA=1; TR0=1; while(1) { index=flag&0x03; if((flag&0x30)==0x10) { //正向显示 for(i=0;i<8;i++) { //显示上半屏 P0=table[index][2*i]; //左上 P2=i|0x08; delay(); P0=table[index][2*i+1]; //右上 P2=i|0x10; delay(); } for(i=8;i<16;i++) { //显示下半屏 P0=table[index][2*i]; //左下 P2=(i-8)|0x20; delay(); P0=table[index][2*i+1]; //右下 P2=(i-8)|0x40; delay(); } } if((flag&0x30)==0x20) { //反向显示 for(i=0;i<8;i++) { P0=~(table[index][2*i]); //左上 P2=i|0x08; delay(); P0=~(table[index][2*i+1]); //右上 P2=i|0x10; delay(); } for(i=8;i<16;i++) { P0=~(table[index][2*i]); //左下 P2=(i-8)|0x20; delay(); P0=~(table[index][2*i+1]); //右下 P2=(i-8)|0x40; delay(); } } } } void delay(void){ int16 i; for(i=0;i<50;i++); } void timer0() interrupt 1 using 3 { TF0=0; TH0=0xb1; TL0=0xe0; //10ms中断一次 if(n<200) { n++; } else { //2秒改变一次 switch(flag) { case 0x10: { flag=0x11;//下次显示正向“川” break; } case 0x11: { flag=0x12;//下次显示正向“酷” break; } case 0x12: { flag=0x13;//下次显示正向“子” break; } case 0x13: { flag=0x20;//下次显示负向“川” break; } case 0x20: { flag=0x21;//下次显示负向“梅” break; } case 0x21: { flag=0x22;//下次显示负向“酷” break; } case 0x22: { flag=0x23;//下次显示负向“子” break; } case 0x23: { flag=0x10;//下次显示正向“梅” break; } } n=0; } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿柒学起来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值