stc15 - ST7920-12864并口通讯和串口通讯的整理(在一个实现中)

news2024/11/30 8:54:40

文章目录

    • stc15 - ST7920-12864并口通讯和串口通讯的整理(在一个实现中)
    • 概述
    • 笔记
    • 原理图
    • END

stc15 - ST7920-12864并口通讯和串口通讯的整理(在一个实现中)

概述

为板子写测试程序, 整到12864 LCD这里.
STC原厂工程只提供并口通讯.
找了网上同学的串口通讯实现, 整理了一下, 将串口通讯和并口通讯放在在一个实现中.
在程序中, 轮流调用串口通讯和并口通讯来点亮ST7920-12864 LCD.
在STC官方工程上改的, 测试好使.
等下一步, 我将这个ST7920-12864实现迁移到我的出厂测试程序中, 将变量都移动到XDATA, 再节省一些data空间.
实际用的时候, 可以选串行方式或并口方式, 给初始化函数的参数不同ST7290_Init(is_ST7920_need_spi), 实现代码不用动.

笔记

// @file main.c
// @brief ST7920的基本驱动程序 根据PSB管脚状态, 来决定ST7920-12864 LCD 是并口通讯还是串口通讯
// 在STC官方工程上改的, 原版工程只能并口通讯

#define 	MAIN_Fosc		22118400UL	//定义主时钟

#include	"STC15Fxxxx.H"

sbit ST7920_RS_CS = P2 ^ 5; // ST7920-CS
sbit ST7920_RW_SID = P2 ^ 6; // ST7920-SID
sbit ST7920_E_SCLK  = P2 ^ 7; // ST7920-SCLK
sbit ST7920_PSB    = P2 ^ 4; // ST7920-PSB脚为 串、并通讯功能切换,PSB=1 为并口通讯, PSB = 0 为串口通讯
sbit ST7920_RESET	=	P2 ^ 3;	// ST7920-RESET

#define	ST7920_DATA_PORT P0 // 只有并口通讯才用ST7920_DATA_PORT
#define ST7920_FLAG_BUSY 0x80 //用于检测LCD状态字中的Busy标识

void	delay_ms(u16 ms);

void	ST7290_WriteData(u8 WDLCD, BuysC);
void	ST7290_WriteCmd(u8 WCLCD, BuysC);

u8		ST7290_ReadStatus(void);
void	ST7290_Init(u8 is_spi);
void	ST7290_Clear(void);

void	ST7290_show_text(u8 X, u8 Y, u8 code* DData);
void	ST7290_show_pic(u8 code* DData);

void GPIO_init(void);
void ST7920_SPI_SendByte(u8 Dbyte);
u8 ST7920_SPI_RecvByte(void);

u8  code uctech[] = {"南通国芯微电子  "};
u8  code net[]    = {" www.gxwmcu.com "};
u8  code mcu[]    = {"专业制造51单片机"};
u8  code qq[]     = {" QQ: 800003751  "};

//128*64点阵图形数据
code u8 gImage_gxw[1024] = { /* 0X10,0X01,0X00,0X80,0X00,0X40, */
	0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
	0X00, 0X3F, 0X03, 0XF0, 0X3F, 0X03, 0XF0, 0X00, 0X00, 0X00, 0X0C, 0X00, 0X00, 0X00, 0XC0, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X00, 0X00, 0X0C, 0X00, 0X18, 0XFF, 0XE0, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X00, 0X00, 0X08, 0X1C, 0X1C, 0X1B, 0X00, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X00, 0X1F, 0XFF, 0XFE, 0X0C, 0X0E, 0X00, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X00, 0X00, 0X0C, 0X00, 0X00, 0X8C, 0X60, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X00, 0X04, 0X0C, 0X10, 0X00, 0XFF, 0XF0, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X00, 0X07, 0XFF, 0XF8, 0X0C, 0XCC, 0X60, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X00, 0X06, 0X63, 0X18, 0X7E, 0XCC, 0X60, 0X00,
	0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X06, 0X33, 0X98, 0X0C, 0XFF, 0XE0, 0X00,
	0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X06, 0X32, 0X18, 0X0C, 0XCC, 0X60, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X06, 0X05, 0XD8, 0X0C, 0XCC, 0X60, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X06, 0XFF, 0X78, 0X0C, 0XFF, 0XE0, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X06, 0X08, 0XD8, 0X0C, 0XCC, 0X60, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X07, 0XFF, 0XF8, 0X0C, 0XCC, 0X60, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X06, 0X0C, 0X18, 0X0C, 0XCF, 0XE0, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X06, 0X0C, 0X18, 0X3E, 0X80, 0X40, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X06, 0X0C, 0X18, 0X73, 0XC0, 0X00, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X06, 0X0D, 0XF0, 0X20, 0X7F, 0XF8, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X06, 0X00, 0X30, 0X00, 0X00, 0X00, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X06, 0X00, 0X18, 0X01, 0X84, 0X00, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X07, 0XFF, 0XFC, 0X01, 0XC6, 0X00, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X06, 0X00, 0X58, 0X01, 0X86, 0X30, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X07, 0XFF, 0XD8, 0X7F, 0XFF, 0XF8, 0X00,
	0X60, 0X00, 0XFD, 0X1F, 0XF0, 0X7A, 0X00, 0X18, 0X00, 0X06, 0X0C, 0X18, 0X01, 0X86, 0X00, 0X00,
	0X60, 0X01, 0X87, 0X13, 0X30, 0XC6, 0X00, 0X18, 0X00, 0X06, 0X0C, 0X18, 0X01, 0X86, 0X00, 0X00,
	0X60, 0X03, 0X03, 0X33, 0X11, 0X83, 0X00, 0X18, 0X00, 0X06, 0X0C, 0X18, 0X00, 0X40, 0X00, 0X00,
	0X60, 0X03, 0X03, 0X03, 0X01, 0X83, 0X00, 0X18, 0X00, 0X06, 0X0C, 0XD8, 0X00, 0X30, 0X00, 0X00,
	0X60, 0X03, 0X80, 0X03, 0X03, 0X80, 0X00, 0X18, 0X00, 0X06, 0XFF, 0XF8, 0X03, 0X38, 0X00, 0X00,
	0X60, 0X01, 0XC0, 0X03, 0X03, 0X00, 0X00, 0X18, 0X00, 0X06, 0X0F, 0X18, 0X0B, 0X98, 0X80, 0X00,
	0X60, 0X00, 0X78, 0X03, 0X03, 0X00, 0X00, 0X18, 0X00, 0X06, 0X0D, 0X98, 0X0B, 0X18, 0XC0, 0X00,
	0X60, 0X00, 0X1E, 0X03, 0X03, 0X00, 0X00, 0X18, 0X00, 0X06, 0X0C, 0XD8, 0X1B, 0X00, 0X70, 0X00,
	0X60, 0X00, 0X07, 0X03, 0X03, 0X00, 0X00, 0X18, 0X00, 0X06, 0X0C, 0X18, 0X1B, 0X01, 0X30, 0X00,
	0X60, 0X00, 0X03, 0X03, 0X03, 0X80, 0X00, 0X18, 0X00, 0X06, 0X0C, 0XD8, 0X3B, 0X01, 0X30, 0X00,
	0X60, 0X03, 0X03, 0X03, 0X03, 0X83, 0X00, 0X18, 0X00, 0X07, 0XF7, 0XB8, 0X33, 0X01, 0X80, 0X00,
	0X60, 0X03, 0X03, 0X03, 0X01, 0X82, 0X00, 0X18, 0X00, 0X06, 0X00, 0X18, 0X03, 0X01, 0X80, 0X00,
	0X60, 0X01, 0XC6, 0X03, 0X01, 0XC6, 0X00, 0X18, 0X00, 0X07, 0XFF, 0XF8, 0X01, 0XFF, 0X80, 0X00,
	0X60, 0X01, 0X7C, 0X07, 0XC0, 0X7C, 0X00, 0X18, 0X00, 0X06, 0X00, 0X18, 0X00, 0X00, 0X00, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X21, 0X86, 0X00, 0X07, 0X00, 0X00, 0X00, 0X10,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X31, 0X86, 0X00, 0X07, 0X00, 0X03, 0XFF, 0XF8,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X65, 0X66, 0X00, 0X02, 0X00, 0X00, 0X00, 0X68,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0XC7, 0X7C, 0X00, 0X02, 0X08, 0X00, 0X00, 0XC0,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X95, 0X6C, 0X41, 0XFF, 0XFC, 0X00, 0X03, 0X80,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X19, 0X3D, 0X6F, 0XE1, 0X82, 0X0C, 0X00, 0X0E, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X3E, 0XE9, 0XA1, 0X82, 0X0C, 0X00, 0X0E, 0X00,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X60, 0X59, 0X81, 0X82, 0X0C, 0X00, 0X0C, 0X0C,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0X6F, 0XFD, 0X81, 0XFF, 0XFC, 0X1F, 0XFF, 0XFE,
	0X60, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X18, 0XE0, 0X15, 0X81, 0X82, 0X0C, 0X00, 0X0C, 0X02,
	0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0XA6, 0X45, 0X81, 0X82, 0X0C, 0X00, 0X0C, 0X00,
	0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF9, 0X27, 0XC7, 0X01, 0X82, 0X0C, 0X00, 0X0C, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X26, 0X47, 0X01, 0XFF, 0XFC, 0X00, 0X0C, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X26, 0X5F, 0X01, 0X82, 0X0B, 0X00, 0X0C, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X26, 0X77, 0X01, 0X02, 0X03, 0X00, 0X0C, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X26, 0XEF, 0X80, 0X02, 0X03, 0X00, 0X0C, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X24, 0X59, 0XC0, 0X02, 0X03, 0X00, 0X0C, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X38, 0X30, 0XE0, 0X03, 0XFF, 0X80, 0X7C, 0X00,
	0X00, 0X21, 0X02, 0X10, 0X21, 0X02, 0X10, 0X00, 0X38, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X18, 0X00,
	0X00, 0X3F, 0X03, 0XF0, 0X3F, 0X03, 0XF0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
};

void GPIO_init(void)
{
	P0M1 = 0;
	P0M0 = 0;	// 设置为准双向口
	P1M1 = 0;
	P1M0 = 0;	// 设置为准双向口
	P2M1 = 0;
	P2M0 = 0;	// 设置为准双向口
	P3M1 = 0;
	P3M0 = 0;	// 设置为准双向口
	P4M1 = 0;
	P4M0 = 0;	// 设置为准双向口
	P5M1 = 0;
	P5M0 = 0;	// 设置为准双向口
	P6M1 = 0;
	P6M0 = 0;	// 设置为准双向口
	P7M1 = 0;
	P7M0 = 0;	// 设置为准双向口
}

void main(void)
{
	u8 is_ST7920_need_spi = 0; // 假设开始是ST7920并口通讯
	// GPIO初始化
	GPIO_init();
	delay_ms(100); // 启动等待,等LCD讲入工作状态

	while (1) {
		ST7290_Init(is_ST7920_need_spi); // LCM初始化
		ST7290_Clear();
		ST7290_show_pic(gImage_gxw); // 显示图形
		delay_ms(is_ST7920_need_spi ? 1000 : 3000); // 交替显示时, 可以根据图像显示的时长, 分出哪种显示是哪种通讯方式
		ST7290_Clear();
		ST7290_show_text(0, 1, uctech); // 显示字库中的中文数字
		ST7290_show_text(0, 2, net); // 显示字库中的中文数字
		ST7290_show_text(0, 3, mcu); // 显示字库中的中文
		ST7290_show_text(0, 4, qq); // 显示字库中的中文数字
		delay_ms(is_ST7920_need_spi ? 1000 : 3000); // 交替显示时, 可以分出哪种显示是哪种通讯方式
		is_ST7920_need_spi = !is_ST7920_need_spi; // 下一次显示时, 换另外一种显示方式(并口通讯/串行通讯)
	}
}

//========================================================================
// 函数: void  delay_ms(u8 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
void  delay_ms(u16 ms)
{
	u16 i;

	do {
		i = MAIN_Fosc / 13000;

		while (--i)	;  //14T per loop
	} while (--ms);
}

//******************************************
void	LCD_delay(void)
{
	NOP(10);
}

void ST7920_SPI_SendByte(u8 Dbyte)
{
	u8 i = 0;

	for (i = 0; i < 8; i++) {
		ST7920_E_SCLK = 0;
		Dbyte = Dbyte << 1;    //左移一位
		ST7920_RW_SID = CY;              //移出的位给SID
		ST7920_E_SCLK = 1;
		ST7920_E_SCLK = 0;
	}

	// LCD_delay();
}

u8 ST7920_SPI_RecvByte(void)
{
	u8 i, temp1, temp2;
	temp1 = 0;
	temp2 = 0;

	for (i = 0; i < 8; i++) {
		temp1 = temp1 << 1;
		ST7920_E_SCLK = 0;
		ST7920_E_SCLK = 1;
		ST7920_E_SCLK = 0;

		if (ST7920_RW_SID) {
			temp1++;
		}
	}

	for (i = 0; i < 8; i++) {
		temp2 = temp2 << 1;
		ST7920_E_SCLK = 0;
		ST7920_E_SCLK = 1;
		ST7920_E_SCLK = 0;

		if (ST7920_RW_SID) {
			temp2++;
		}
	}

	return ((0xf0 & temp1) + (0x0f & temp2));
}

//读状态
u8 ST7290_ReadStatus(void)
{
	u8 u8_status = 0;

	if (1 == ST7920_PSB) {
		ST7920_DATA_PORT = 0xFF;
		ST7920_RS_CS = 0;
		ST7920_RW_SID = 1;
		LCD_delay();
		ST7920_E_SCLK = 1;
		LCD_delay();

		do {
			u8_status = ST7920_DATA_PORT;
		} while (u8_status & ST7920_FLAG_BUSY); // 检测忙信号

		ST7920_E_SCLK = 0;
	} else {
		ST7920_RS_CS = 1;

		do {
			ST7920_SPI_SendByte(0xfc); // 11111,RW(1),RS(0),0
			u8_status = ST7920_SPI_RecvByte();
		} while (u8_status & ST7920_FLAG_BUSY); // 检测忙信号
	}

	return u8_status;
}

void ST7290_Init(u8 is_spi) // LCM初始化
{
	if (is_spi) {
		ST7920_PSB = 0;	// SPI口
		ST7920_RS_CS = 1;
	} else {
		ST7920_PSB = 1;	//并口
	}

	delay_ms(10);
	ST7920_RESET = 0;
	delay_ms(10);
	ST7920_RESET = 1;
	delay_ms(100);
	ST7290_WriteCmd(0x30, 1); // 显示模式设置,开始要求每次检测忙信号
	ST7290_WriteCmd(0x01, 1); // 显示清屏
	ST7290_WriteCmd(0x06, 1); // 显示光标移动设置
	ST7290_WriteCmd(0x0C, 1); // 显示开及光标设置
}

void ST7290_Clear(void) // 清屏
{
	ST7290_WriteCmd(0x01, 1); //显示清屏
	ST7290_WriteCmd(0x34, 1); // 显示光标移动设置
	ST7290_WriteCmd(0x30, 1); // 显示开及光标设置
}

//按指定位置显示一串字符
void ST7290_show_text(u8 X, u8 Y, u8 code* DData)
{
	u8 ListLength = 0;
	u8 X2 = X;

	if (Y < 1)	{
		Y = 1;
	}

	if (Y > 4)	{
		Y = 4;
	}

	X &= 0x0F; //限制X不能大于16,Y在1-4之内

	switch (Y) {
		case 1:
			X2 |= 0X80;
			break;	//根据行数来选择相应地址

		case 2:
			X2 |= 0X90;
			break;

		case 3:
			X2 |= 0X88;
			break;

		case 4:
			X2 |= 0X98;
			break;
	}

	ST7290_WriteCmd(X2, 1); //发送地址码

	while (DData[ListLength] >= 0x20) { //若到达字串尾则退出
		if (X <= 0x0F) { //X坐标应小于0xF
			ST7290_WriteData(DData[ListLength], 1); //
			ListLength++;
			X++;
		}
	}
}

void ST7290_show_pic(u8 code* DData)
{
	u8 x, y, i;
	unsigned int tmp = 0;

	for (i = 0; i < 9;) {	// 分两屏,上半屏和下半屏,因为起始地址不同,需要分开
		for (x = 0; x < 32; x++) { // 32行
			ST7290_WriteCmd(0x34, 1);
			ST7290_WriteCmd((0x80 + x), 1); // 列地址
			ST7290_WriteCmd((0x80 + i), 1);	// 行地址,下半屏,即第三行地址0X88
			ST7290_WriteCmd(0x30, 1);

			for (y = 0; y < 16; y++) {
				ST7290_WriteData(DData[tmp + y], 1); // 读取数据写入LCD
			}

			tmp += 16;
		}

		i += 8;
	}

	ST7290_WriteCmd(0x36, 1);	// 扩充功能设定
	ST7290_WriteCmd(0x30, 1);
}

// 写数据
void ST7290_WriteData(u8 WDLCD, BuysC)
{
	if (BuysC) {
		ST7290_ReadStatus();    //根据需要检测忙
	}

	if (1 == ST7920_PSB) {
		// ST7920并口通讯
		ST7920_RS_CS = 1;
		ST7920_RW_SID = 0;
		ST7920_DATA_PORT = WDLCD;
		LCD_delay();
		ST7920_E_SCLK = 1;
		LCD_delay();
		ST7920_E_SCLK = 0;
	} else {
		// ST7920串口通讯
		ST7920_SPI_SendByte(0xfa);              //11111,RW(0),RS(1),0
		ST7920_SPI_SendByte(0xf0 & WDLCD);      //高四位
		ST7920_SPI_SendByte(0xf0 & (WDLCD << 4)); //低四位(先执行<<)
	}
}

//写指令
void ST7290_WriteCmd(u8 WCLCD, BuysC) //BuysC为0时忽略忙检测
{
	if (BuysC) {
		ST7290_ReadStatus();    //根据需要检测忙
	}

	if (1 == ST7920_PSB) {
		ST7920_RS_CS = 0;
		ST7920_RW_SID = 0;
		ST7920_DATA_PORT = WCLCD;
		LCD_delay();
		ST7920_E_SCLK = 1;
		LCD_delay();
		ST7920_E_SCLK = 0;
	} else {
		ST7920_RS_CS = 1;
		ST7920_SPI_SendByte(0xf8);              //11111,RW(0),RS(0),0
		ST7920_SPI_SendByte(0xf0 & WCLCD);      //高四位
		ST7920_SPI_SendByte(0xf0 & (WCLCD << 4)); //低四位(先执行<<)
		delay_ms(1); // ST7920的串口方式比并口方式反应慢点, 需要延时, 否则第一行花屏. 必须加延时!!!
	}
}

原理图

在这里插入图片描述
官方板子这么接ST7920-12864时, 既可以用并口通讯方式, 也可以用串口通讯方式.
如果是自己实际工程用ST7920-12864, 还是用串口方式好些, 省8个连续的数据IO. 实际的IO可以挑选零散闲置的GPIO来代替.

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当成为全球第二大汽车出口国后,中国车企的下一步是什么?

新一轮汽车出口浪潮在疫情期间悄然启动&#xff0c;中国汽车工业协会发布数据显示&#xff0c;自2021年起&#xff0c;汽车出口销量呈现高速增长的势头&#xff0c;2022年前三季度汽车出口量超过2021年全年出口量&#xff0c;并超越德国&#xff0c;成为仅次于日本的全球第二大…

熊市链游模型如何设计开发?

GameFi的全局趋势 自第一款视频游戏诞生以来&#xff0c;游戏世界已经发生了翻天覆地的变化。技术和玩游戏的目的是不断围绕游戏本身发展着的两件主要事情。曾经的街机游戏、主机游戏、电脑游戏&#xff0c;再到如今智能手机时代&#xff0c;手机游戏已经无处不在。随着时间的…

Navicat 被广泛的应用于各行各业的原因

近期&#xff0c;Navicat 发起了一场用户线上投票活动&#xff0c;受到了众多用户的关注和热情响应&#xff01;今天&#xff0c;我们就带大家了解此次投票数据通过用户的职业、使用频率、连接的数据库种类以及最常用的功能&#xff0c;通过用户视角了解 Navicat 产品的适用范畴…

Https加密超文本传输协议的运用

内容预知 1.https的相关知识 1.1 https的简介 1.2 HTTP 与 HTTPS 的区别 1 .3 SSL的相关了解 1.3 SSL/TLS协议和证书的关系 1.4 https的工作流程 1.5 客户端是如何验证证书是否有效 1.6 web网站并未全部采用https的原因 2. SSL证书获取的方法 2.1 阿里云证书的获取 2…

linux不显示当前路径的解决方法

1.输入vim ~/.bashrc进入用户的shell环境变量的配置文件(可以设置环境变量以及通过alias设置别名&#xff09; 2.按下“i”键进入编辑模式(底部显示INSERT&#xff09; 3.修改\w为$PWD&#xff1a; 修改为&#xff1a; 4.按“esc”键后输入":wq"保存并退出&#xff…

IPSec NAT穿越原理

在IPSec VPN部署中&#xff0c;如果发起者位于私网内部&#xff08;如下图FW_C&#xff09;&#xff0c;而它希望与FW_A之间直接建立一条IPSec隧道&#xff0c;这种情况下NAT会对部署IPSec VPN网络造成障碍。 PC2发业务报文给PC1&#xff0c;IPSec先对IP包头或端口信息进行验证…

10 个用图表解释JavaScript 闭包的面试题

闭包是函数式编程中的核心概念之一&#xff0c;是每个 JavaScript 开发人员必备的知识。在这里&#xff0c;我准备了 10 个关于闭包的面试挑战题&#xff0c;这些基本都是面试中经常被问到的。 你准备好了吗&#xff1f;我们现在要开始了。 每个题目都有一个代码片段&#xf…

代码随想录算法训练营第五十天| LeetCode123. 买卖股票的最佳时机 III、LeetCode188. 买卖股票的最佳时机 IV

一、LeetCode123. 买卖股票的最佳时机 III 1&#xff1a;题目描述&#xff08;123. 买卖股票的最佳时机 III&#xff09; 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意…

小学生学Arduino---------点阵(一)静态图片显示

今天来看一下&#xff0c;点阵模块这一模块可以做出非常有意思的东西。 学习目标&#xff1a; 1、了解点阵原理 2、掌握图形绘制&#xff08;心形、三角形等&#xff09; 3、掌握图形显示器的功能 4、掌握led点阵屏幕的功能 5、搭建电路 6、编写程序 一、点阵的原理 LED点阵屏…

Functional Programming in Java venkat(16) Being Lazy part3

文章目录Functional Programming in Java venkat(16): Being LazyLeveraging the Laziness of StreamsIntermediate and Terminal OperationsMethod Evaluation OrderPeeking into the LazinessFunctional Programming in Java venkat(16): Being Lazy 这里是记录学习这本书 F…

linux权限详解

文章目录1.用户转换1.将普通用户转换成root1.su -2. su2.将root转换为普通用户2.文件的权限1.文件访问者的分类拥有者和other所属组2.rwx的含义3.修改权限第一种修改方式1.拥有者修改2.所属组的修改3.other的修改4.整体修改第二种修改方式666000777使用权限的修改1.拥有者用户的…

[事务]-事务概念/特性/并发问题/传播特性

1. 事务的概念 事务&#xff08;Transaction&#xff09;指的是一个操作序列&#xff0c;该操作序列中的多个操作要么都做&#xff0c;要么都不做&#xff0c;是一个不可分割的工作单位&#xff0c;是数据库环境中的逻辑工作单位&#xff0c;由DBMS中的事务管理子系统负责…

爬虫工作流程、请求与响应原理、requests库讲解

爬虫工作流程、请求与响应原理、requests库讲解 爬虫分类主要分为两大板块 web爬虫&#xff08;浏览器爬虫&#xff09; APP爬虫&#xff08;手机端爬虫&#xff09; 在这两大板块中又可以把爬虫归类为聚焦爬虫和通用爬虫 聚焦爬虫&#xff1a;针对某一个接口&#xff08;ur…

对话框被遮罩层挡住

element-ui 解决方法一&#xff1a; 在el-dialog中写去掉遮罩层 :modal"false" 解决方法二&#xff1a; 在el-dialog中写&#xff08;遮罩层是否插入至 body 元素上&#xff0c;若为 false&#xff0c;则遮罩层会插入至 Dialog 的父元素上&#xff09; :modal-ap…

[附源码]SSM计算机毕业设计医院挂号系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

专业硕士招生占比将达到三分之二,那么跟学术硕士有哪些区别?

近年来的研究生招生考试中&#xff0c;专业硕士的招生培养规模正稳步增长。据统计&#xff0c;2009年专业学位硕士招生人数在硕士招生总人数中的占比仅为15.9%&#xff0c;其后在2017年首次超过学硕招生人数&#xff0c;到2020年专硕招生人数占比已超60%。国务院学位委员会、教…

SpringBoot - 集成Actuator(应用信息显示、修改系统日志、增加账号密码登录)

文章目录Actuator概述官网入口支持的埋点信息查询、修改使用访问actuator埋点信息添加账号密码登录验证动态修改日志级别Actuator 概述 官网入口 官网&#xff1a; https://docs.spring.io/spring-boot/docs/2.7.6/reference/html/actuator.html#actuator.endpoints 支持的埋…

csdn中书写数学公式简单介绍

参考&#xff1a;https://www.zybuluo.com/codeep/note/163962#3%E5%9C%A8%E5%AD%97%E7%AC%A6%E9%97%B4%E5%8A%A0%E5%85%A5%E7%A9%BA%E6%A0%BC 常识、常用 一行公式使用$$开始和结尾&#xff0c;常用符号表示 符号功能$$多行公式的开始和结尾&#xff0c;一个$表示单行公式开…

Cisco ASA基础——安全算法与基本配置

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 本章重点 一.Cisco防火墙简介 1.什么是防火墙 2.防火墙的作用…

PHP表单处理的案例分析

目录 知识补充 实现过程 前端代码 后端代码 简单分析 知识补充 表单简介&#xff08;来自Mr._Dang&#xff09; action&#xff1a;提交的地址 method&#xff1a;提交的方式 get&#xff1a; 参数是在url中的&#xff0c;不安全&#xff0c;传输量比较少&#xff…