×
嵌入式 > 技术百科 > 详情

STM8控制LCD12864液晶屏实验

发布时间:2023-06-20 发布时间:
|

第一部分 并口传输显示中英文

主要是以下几个函数:

首先:写一个LCD_write函数来给LCD发送数据.根据时序图,发送数据是RW要置0,E要产生下降沿,RS置1为数据,RS置0为命令,由于是并口传输PSB置1.

其次:能够给LCD发命令后,我们就要使用LCD_init函数发送初始化命令。初始化命令至少包括:1、设置显示,2、功能设定,3、初始化清屏3个部分。

写命令时注意每个命令都有自己的运行时间,记得保证足够延时。

第三:写一个LCD_display函数可以分行分列显示内容。


void LCD_write(u8 data,u8 cmd_flag);

void LCD_init(void);

void LCD_display(u8 row,u8 col,u8 *string);


一、并口方式理论及资料

1.先上时序图:

这里要注意的是 PWeh 要大于450ns 以STM8S208MB内部16M RC振荡器计算,每次执行时间为: 1s/(16M/8分频) =500ns 所以必须延时保证E引脚上升区域大于450ns。

同理 tdsw也需要延时。

2.指令表

ST7920指令集分为2种,第一种:10种基础指令集RE=0,第二种:6种高级指令集RE=0

第一部分是显示中英文,所以只需用到基础指令集RE=0

3.引脚图和硬件电路

4.为什么每行可以写八个汉字或16个英文/数字?

因为每个汉字需要占2个字节。

此外还要留意,第一行和第三行的内存地址是连在一起的,不控制光标的话,写完第一行就会换行到第三行。(光标写完是自动加一的)

5.程序代码


//------------------------------header------------------------------------------

#include "iostm8s208mb.h"

//------------------------------common datatype---------------------------------

typedef unsigned char uint8_t;

typedef unsigned short uint16_t;

typedef unsigned long uint32_t;

#define u8 uint8_t

#define u16 uint16_t

#define u32 uint32_t

//------------------------------macros------------------------------------------

#define LCDRS PF_ODR_ODR0

#define LCDRW PF_ODR_ODR3

#define LCDEN PF_ODR_ODR4

#define LCDPSB PF_ODR_ODR5

#define LCDDATA PB_ODR

//------------------------------function declare--------------------------------

void delay(u8 count);

void GPIO_init(void);

void LCD_write(u8 data,u8 cmd_flag);

void LCD_init(void);

void LCD_display(u8 row,u8 col,u8 *string);

//------------------------------global------------------------------------------

//------------------------------main--------------------------------------------

void main( void )

{

GPIO_init();

LCD_init();

LCD_display(1,0,"熊爸的学习时间");

LCD_display(2,0,"================");

LCD_display(3,0,"使用LCD12864显示");

LCD_display(4,0,"屏来并口显示数据");

}

//------------------------------functions---------------------------------------

void delay(u8 count)

{

u8 i,j;

while (count--)

{

for(i=0;i<50;i++)

for(j=0;j<20;j++);

}

}

void GPIO_init(void)

{

//lcd DB0~DB7

PB_DDR |=0XFF;

PB_CR1 |=0XFF;

PB_CR2 &=0X00;

PB_ODR &=0X00;


//LCD RS RW EN PSB

PF_DDR |=0X39;

PF_CR1 |=0X39;

PF_CR2 &=0XC6;

PF_ODR &=0XC6;


LCDPSB=1;

LCDRW=0;

}

void LCD_write(u8 data,u8 cmd_flag)

{

LCDRS=cmd_flag;

LCDEN=0;

delay(1);

LCDEN=1;

LCDDATA=data;

delay(1); //delay保证E的周期

LCDEN=0;

delay(1);

}

void LCD_init(void)

{

LCD_write(0X0C,0);

delay(1);

LCD_write(0X30,0);

delay(1);

LCD_write(0X01,0);

delay(1);

}

void LCD_display(u8 row,u8 col,u8 *string)

{

switch (row)

{

case 1:row=0X80;break;

case 2:row=0X90;break;

case 3:row=0X88;break;

case 4:row=0X98;break;

default:row=0X80;

}

LCD_write(row+col,0);

while (*string != '


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
NTMD6N03R2G的技术参数