STM8控制LCD12864液晶屏实验

本文详细介绍了如何使用STM8微控制器控制LCD12864液晶屏进行并口和串口传输。内容涵盖并口传输显示中英文的函数实现、初始化、显示内容;并行显示图片的指令集、步骤和GDRAM的理解;以及串口传输的时序图和关键函数解析。
摘要由CSDN通过智能技术生成
本文分以下几个部分:
第一部分:并口传输显示中英文
第二部分:并口传输显示图片
第三部分:串口传输
首先说明,我使用的LCD12864是采用ST7920控制器芯片的,操作LCD12864其实是在操作ST7920

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

主要是以下几个函数:

首先:写一个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.先上时序图:

v2-5c4ea05c0124f30002bfce557413bcb1_b.jpg

v2-a1ae0c8d223898ab1f6ade1889bcbeaa_b.jpg

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

同理 tdsw也需要延时。

2.指令表

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

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

v2-5abad00a055342759fb23865ddd69e15_b.jpg

3.引脚图和硬件电路

v2-f282877151b6beebf3261d47556b158f_b.jpg

v2-7de96606aa5ebf1d034014ce632e3b59_b.jpg

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

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

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

v2-530d5faffe9a483878a817bfd588419a_b.jpg

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 != '\0')
  {
     
    LCD_write(*string,1);
    string++;
  }  
}
      

5.实验效果

v2-8e65051d15e390b0c783eab3ea1e745c_b.jpg

第二部分 并行显示图片

1、指令集

使用绘图功能需要打开扩展指令集

v2-f21bab6f51eca81628f06d483460a8c4_b.jpg

v2-050e3e3e6200535fde840a3d62b8104b_b.jpg

2、绘画步骤

1.使用扩展指令集并关闭绘图显示功能 0X34
2.设置垂直地址
3.设置水平地址
4.写D15~D8位
5.写D7~D0位
6.打开绘图显示功能 0X36
7.返回基本指令集

垂直地址:表示方法 第几行+偏移量 例如: 0x80+j

水平地址:第一行0X80 第二行0X90 第三行0X88 第四行0X98

这部分处理函数如下:

        void LCD_pic(u8 *pic)
{
     
  u8 i,j,k;
  LCD_write(0X34,0);delay(10);
  for ( i = 0; i <2; i++)
  {
     
    for ( j = 0; j <32; j++)
    {
     
      LCD_write(0X80+j,0);
      LCD_write(0X80+8*i,0);
      for ( k = 0; k <16; k++)
      {
     
        LCD_write(*pic++,1);
      }
    }
  }
  LCD_write(0X36,0);delay(10);
  LCD_write(0X30,0);delay(10);
}
      

3、再来看GDRAM

v2-fe9c09500a47316537ab44caa5c4a958_b.jpg

其实12864 只用了GDRAM的一半

v2-0d570e28db355086827a82e93db4145a_b.jpg

Y坐标取值范围:0X80+0-31

X坐标取值范围:0X80或者0X88

        //------------------------------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_pic(u8 *pic);
//------------- -----------------global------------------------------------------
u8 dis[]={
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值