数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 105|回复: 4

[C51] STC32G单片机硬件LCM接口16位并口驱动3.5寸ST7796彩屏 分享源码

[复制链接]
发表于 4 小时前 | 显示全部楼层 |阅读模式
本帖最后由 慕名而来 于 2025-8-11 11:29 编辑

前些时有心想仿制STC老梁的示波器玩玩,就上网找了一个并口屏,STC官网上有视频展示16位并口刷新速度可以达到视频级刷屏效果,只是原文用的是ILI9481驱动的屏而我入手的是ST7796驱动的屏,我相中这块屏的地方是它引出了M0、M1、M2引脚,在底板上通过电阻配置这三个引脚的电平可以实现mcu8bit/16bit并口及SPI串口多种接口驱动模式,新屏入手总是心情激动跃跃欲试,经过几天的努力并在高人的指点下终于搞定了,在此分享源码、如果谁有兴趣就一起玩玩吧。

单片机的型号为:STC32G12K128
它的LCM接口又叫做TFT彩屏接口(8/16位I8080/M6800接口),使用这个接口需要配置相关寄存器,其中1-4个寄存器用于定义引脚、使能接口、使能中断、接口模式的配置,第5个寄存器是输出/输入数据寄存器,无需配置直接使用就可以了,详见下列图片:





使用硬件LCM接口时,虽然上述图片上的东西看着挺复杂的,但是配置上述提到的寄存器其实只需要两行代码:

  1. //----16BIT-8080-硬件LCM接口初始化------
  2. void LCM_Config(void)
  3. {
  4.     LCMIFCFG = 0x82;//BD7=1 (使能LCM接口中断),B3、B2        =00 (16bit总线时P2=高8位、P0=低8位),B1=1 (16bit接口),B0=0 (I8080接口模式)
  5.     LCMIFCFG2 = 0x09;        //RS:P45,RD:P44,WR:P42; Setup Time=2,HOLD Time=1
  6.     LCMIFSTA = 0x00;//清除LCM中断标志
  7. }
复制代码



配置好了上述寄存器后接下来要用到的就是所有LCD屏驱动中都有的两个基础函数;
1.写指令函数
  1. //LCM接口中断模式发送指令、数据的相关函数
  2. //----写指令函数------------------------
  3. void LCD_WR_REG(u8 cmd)
  4. {
  5.     LCMIFDATH = 0;
  6.     LCMIFDATL = cmd;  //(低8位=cmd)
  7.     LCD_CS_CLR();
  8.     LCMIFCR = 0x84;  //使能LCM接口、发送"写命令"脉冲
  9. }
复制代码

2.写数据函数:

  1. //----写8bit数据函数-------------------
  2. void  LCD_WR_DATA(u8 dat)
  3. {
  4.     LCMIFDATH = 0;
  5.     LCMIFDATL = dat;//(低8位=dat)
  6.     LCD_CS_CLR();
  7.     LCMIFCR = 0x85;  //使能LCM接口、发送"写数据"脉冲
  8. }
复制代码


还有一个经常用到的就是写16位数据的函数:
  1. //----写入16bit颜色数据函数------------
  2. //输出R-5BIT,G-6BIT,B-5BIT
  3. void LCD_RGB_DATA(u16 dat)
  4. {
  5.     LCMIFDATH = ((u8)(dat >> 8));        //发送数据高8位字节
  6.     LCMIFDATL = ((u8)dat);                        //发送数据低8位字节
  7.     LCD_CS_CLR();
  8.     LCMIFCR = 0x85;  //使能LCM接口、发送"写数据"脉冲
  9. }
复制代码

使用STC32G硬件LCM接口驱动ST7796彩屏有两种驱动方式,1.查询方式,可不开启LCM接口中断。2.中断方式,需要开启LCM接口中断并且配备中断函数。我分享的代码中两种方式的代码都有,可以根据用途选择使用那种驱动方式,对于我的这块屏幕感觉使用中断方式显示更加稳定,这段代码在调试时因为开启了中断而没有匹配中断函数很久没有调好,后来到相关论坛求问并得到了详细的指点后才实现了刷屏在此一并谢过。

完整代码如下:
1. .c文件

  1. #include "LCD.h"
  2. #include "delay.h"
  3. //--------------------------------------------------

  4. //--------------------------------------------------
  5. unsigned char code shu_zi_32[] =
  6. {
  7. //32*32数码数字
  8.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xC0,
  9.     0x03, 0x7F, 0xFF, 0xB0, 0x07, 0x80, 0x00, 0x78, 0x07, 0xC0, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8,
  10.     0x07, 0xC0, 0x00, 0xF8, 0x0F, 0xC0, 0x01, 0xF8, 0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x01, 0xF0,
  11.     0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x00, 0x01, 0xF0, 0x06, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00,
  12.     0x0E, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x01, 0xE0, 0x1F, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0,
  13.     0x1F, 0x00, 0x03, 0xE0, 0x3F, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x07, 0xE0, 0x3E, 0x00, 0x07, 0xC0,
  14.     0x3E, 0x00, 0x07, 0xC0, 0x3E, 0x00, 0x07, 0xC0, 0x3C, 0x00, 0x07, 0xC0, 0x1B, 0xFF, 0xFB, 0xC0,
  15.     0x07, 0xFF, 0xFD, 0x80, 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0

  16.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
  17.     0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00,
  18.     0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00,
  19.     0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
  20.     0x00, 0x01, 0x80, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00,
  21.     0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00,
  22.     0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00,
  23.     0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //1

  24.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0xC0,
  25.     0x00, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xF8,
  26.     0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0,
  27.     0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0xFF, 0xFD, 0xE0, 0x01, 0xFF, 0xFE, 0xC0,
  28.     0x0E, 0xFF, 0xFE, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00,
  29.     0x1F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00,
  30.     0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFE, 0x00,
  31.     0x07, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //2

  32.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xC0,
  33.     0x00, 0x7F, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xF8,
  34.     0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0,
  35.     0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0xFF, 0xFE, 0xE0, 0x01, 0xFF, 0xFF, 0x00,
  36.     0x00, 0xFF, 0xFE, 0xC0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
  37.     0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xC0,
  38.     0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x03, 0xFF, 0xFB, 0xC0,
  39.     0x07, 0xFF, 0xFD, 0x80, 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //3

  40.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  41.     0x03, 0x00, 0x00, 0x30, 0x07, 0x80, 0x00, 0x78, 0x07, 0xC0, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8,
  42.     0x07, 0xC0, 0x00, 0xF8, 0x0F, 0xC0, 0x01, 0xF8, 0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x01, 0xF0,
  43.     0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x00, 0x01, 0xF0, 0x06, 0xFF, 0xFE, 0xE0, 0x01, 0xFF, 0xFF, 0x00,
  44.     0x00, 0xFF, 0xFE, 0xC0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
  45.     0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xC0,
  46.     0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xC0,
  47.     0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //4

  48.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xC0,
  49.     0x03, 0x7F, 0xFF, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00,
  50.     0x07, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
  51.     0x0F, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00,
  52.     0x00, 0xFF, 0xFE, 0xC0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
  53.     0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xC0,
  54.     0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x03, 0xFF, 0xFB, 0xC0,
  55.     0x07, 0xFF, 0xFD, 0x80, 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //5

  56.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xC0,
  57.     0x03, 0x7F, 0xFF, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00,
  58.     0x07, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
  59.     0x0F, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00,
  60.     0x0E, 0xFF, 0xFE, 0xC0, 0x1F, 0x00, 0x01, 0xE0, 0x1F, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0,
  61.     0x1F, 0x00, 0x03, 0xE0, 0x3F, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x07, 0xE0, 0x3E, 0x00, 0x07, 0xC0,
  62.     0x3E, 0x00, 0x07, 0xC0, 0x3E, 0x00, 0x07, 0xC0, 0x3C, 0x00, 0x07, 0xC0, 0x1B, 0xFF, 0xFB, 0xC0,
  63.     0x07, 0xFF, 0xFD, 0x80, 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //6

  64.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0x80,
  65.     0x00, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0,
  66.     0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
  67.     0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00,
  68.     0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0,
  69.     0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80,
  70.     0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x80,
  71.     0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //7

  72.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xA0,
  73.     0x03, 0x7F, 0xFF, 0x70, 0x07, 0x80, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8,
  74.     0x07, 0xC0, 0x00, 0xF8, 0x0F, 0xC0, 0x01, 0xF0, 0x0F, 0xC0, 0x01, 0xF0, 0x0F, 0x80, 0x01, 0xF0,
  75.     0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x00, 0x01, 0xE0, 0x06, 0xFF, 0xFE, 0xC0, 0x01, 0xFF, 0xFF, 0x00,
  76.     0x06, 0xFF, 0xFE, 0xC0, 0x0F, 0x00, 0x01, 0xE0, 0x1F, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0,
  77.     0x1F, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x07, 0xC0,
  78.     0x3E, 0x00, 0x07, 0xC0, 0x3E, 0x00, 0x07, 0xC0, 0x3C, 0x00, 0x07, 0xC0, 0x1B, 0xFF, 0xFB, 0x80,
  79.     0x07, 0xFF, 0xFD, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //8

  80.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xA0,
  81.     0x03, 0x7F, 0xFF, 0x70, 0x07, 0x80, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8,
  82.     0x07, 0xC0, 0x00, 0xF8, 0x0F, 0xC0, 0x01, 0xF0, 0x0F, 0xC0, 0x01, 0xF0, 0x0F, 0x80, 0x01, 0xF0,
  83.     0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x00, 0x01, 0xE0, 0x06, 0xFF, 0xFE, 0xC0, 0x01, 0xFF, 0xFF, 0x00,
  84.     0x00, 0xFF, 0xFE, 0xC0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
  85.     0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xC0,
  86.     0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x03, 0xFF, 0xFB, 0x80,
  87.     0x07, 0xFF, 0xFD, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //9

  88.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  89.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  90.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  91.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00,
  92.     0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  93.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  94.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  95.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //.

  96.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  97.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  98.     0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00,
  99.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  100.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  101.     0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
  102.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  103.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //:
  104. };
  105. /*
  106. //----16BIT-8080-硬件LCM接口初始化------
  107. void LCM_Config(void)
  108. {
  109.         LCMIFCFG = 0x02;//BD7=0 (不使能LCM接口中断),B3、B2        =00 (16bit总线时P2=高8位、P0=低8位),B1=1 (16bit接口),B0=0 (I8080接口模式)
  110.         LCMIFCFG2 = 0x09;        //RS:P45,RD:P44,WR:P42; Setup Time=2,HOLD Time=1
  111.         LCMIFSTA = 0x00;//清除LCM中断标志
  112. }
  113. //LCM接口查询模式发送指令、数据的相关函数
  114. //----写指令函数------------------------
  115. void LCD_WR_REG(u8 cmd)
  116. {
  117. LCMIFDATH = 0;
  118. LCMIFDATL = cmd;  //(低8位=cmd)
  119. LCD_CS_CLR();
  120. LCMIFCR = 0x84;  //使能LCM接口、发送"写命令"脉冲
  121. while(!LCMIFSTA);
  122. LCMIFSTA=0x00;
  123. LCD_CS_SET();
  124. }
  125. //----写8bit数据函数-------------------
  126. void  LCD_WR_DATA(u8 dat)
  127. {
  128. LCMIFDATH = 0;
  129. LCMIFDATL = dat;//(低8位=dat)
  130. LCD_CS_CLR();
  131. LCMIFCR = 0x85;  //使能LCM接口、发送"写数据"脉冲
  132. while(!LCMIFSTA);
  133. LCMIFSTA=0x00;
  134. LCD_CS_SET();
  135. }
  136. //----写入16bit颜色数据函数------------
  137. //输出R-5BIT,G-6BIT,B-5BIT
  138. void LCD_RGB_DATA(u16 dat)
  139. {
  140. LCMIFDATH = ((u8)(dat>>8));        //发送数据高8位字节
  141. LCMIFDATL = ((u8)dat);                        //发送数据低8位字节
  142. LCD_CS_CLR();
  143. LCMIFCR = 0x85;  //使能LCM接口、发送"写数据"脉冲
  144. while(!LCMIFSTA);
  145. LCMIFSTA=0x00;
  146. LCD_CS_SET();
  147. }
  148. */


  149. //----16BIT-8080-硬件LCM接口初始化------
  150. void LCM_Config(void)
  151. {
  152.     LCMIFCFG = 0x82;//BD7=1 (使能LCM接口中断),B3、B2        =00 (16bit总线时P2=高8位、P0=低8位),B1=1 (16bit接口),B0=0 (I8080接口模式)
  153.     LCMIFCFG2 = 0x09;        //RS:P45,RD:P44,WR:P42; Setup Time=2,HOLD Time=1
  154.     LCMIFSTA = 0x00;//清除LCM中断标志
  155. }
  156. //LCM接口中断模式发送指令、数据的相关函数
  157. //----写指令函数------------------------
  158. void LCD_WR_REG(u8 cmd)
  159. {
  160.     LCMIFDATH = 0;
  161.     LCMIFDATL = cmd;  //(低8位=cmd)
  162.     LCD_CS_CLR();
  163.     LCMIFCR = 0x84;  //使能LCM接口、发送"写命令"脉冲
  164. }
  165. //----写8bit数据函数-------------------
  166. void  LCD_WR_DATA(u8 dat)
  167. {
  168.     LCMIFDATH = 0;
  169.     LCMIFDATL = dat;//(低8位=dat)
  170.     LCD_CS_CLR();
  171.     LCMIFCR = 0x85;  //使能LCM接口、发送"写数据"脉冲
  172. }
  173. //----写入16bit颜色数据函数------------
  174. //输出R-5BIT,G-6BIT,B-5BIT
  175. void LCD_RGB_DATA(u16 dat)
  176. {
  177.     LCMIFDATH = ((u8)(dat >> 8));        //发送数据高8位字节
  178.     LCMIFDATL = ((u8)dat);                        //发送数据低8位字节
  179.     LCD_CS_CLR();
  180.     LCMIFCR = 0x85;  //使能LCM接口、发送"写数据"脉冲
  181. }
  182. //----LCM中断函数----------------------
  183. void LCM_Interrupt(void) interrupt 59
  184. {
  185.     LCMIFSTA = 0x00;
  186.     LCD_CS_SET();
  187. }

  188. //----ST7796液晶屏初始化(简化版)---------------
  189. void LCD_Init(void)
  190. {

  191.     LCD_RST = 1;
  192.     delay_ms(50);
  193.     LCD_RST = 0;
  194.     delay_ms(50);
  195.     LCD_RST = 1;
  196.     delay_ms(50);

  197.     LCD_WR_REG(0x11);            // 退出睡眠
  198.     delay_ms(120);               

  199.     LCD_WR_REG(0x36);                        // 屏显模式
  200.     LCD_WR_DATA(0x28);                // 横屏 0x2a=x,0x2b=y //屏幕横放、接线口在左侧,上至下扫描&向上显示字符(正显)

  201.     LCD_WR_REG(0x3A);            // 像素格式
  202.     LCD_WR_DATA(0x55);    // 16-bit(RGB565)

  203.     LCD_WR_REG(0x29);
  204.     delay_ms(100);

  205. }

  206. //---------------------------------------------------------
  207. void LCD_SetPos(u16 x0, u16 x1, u16 y0, u16 y1)
  208. {
  209. //横屏显示
  210.     LCD_WR_REG(0x2a);
  211.     LCD_WR_DATA((u8)(x0 >> 8));                //起始列地址高8位SC(15:8]
  212.     LCD_WR_DATA((u8)x0);        //起始列地址低8位SC[7:0]
  213.     LCD_WR_DATA((u8)(x1 >> 8));                //终止列地址高8位EC[15:8]
  214.     LCD_WR_DATA((u8)x1);        //终止列地址低8位EC[7:0]
  215.     LCD_WR_REG(0x2b);
  216.     LCD_WR_DATA((u8)(y0 >> 8));                //行地址同上操作
  217.     LCD_WR_DATA((u8)y0);
  218.     LCD_WR_DATA((u8)(y1 >> 8));
  219.     LCD_WR_DATA((u8)y1);
  220.     LCD_WR_REG(0x2c);//开始写入GRAM;地址指针累加
  221. }
  222. //----全屏刷新一种颜色----------------------------------------------------
  223. void ClearScreen(u16 color)
  224. {
  225.     uint i, j;
  226.     LCD_SetPos(0, 480 - 1, 0, 320 - 1);        //给出起始与终止坐标

  227.     for(i = 0; i < 320; i++)                        //
  228.     {
  229.         for(j = 0; j < 480; j++) //横屏显示
  230.             LCD_RGB_DATA(color);
  231.     }
  232. }
  233. //====32*32数码字型显示函数==================================================
  234. //使用单片机内部存储的32*32特殊字型数组,bit mode
  235. void Put32_32(uint x, uint y, uchar shuzi)//, uint fColor
  236. {
  237.     uchar i, j, m;
  238.     LCD_SetPos(x, x + 32 - 1, y, y + 32 - 1);

  239.     for(i = 0; i < 128; i++)
  240.     {
  241.         m = shu_zi_32[shuzi * 128 + i];

  242.         for(j = 0; j < 8; j++)
  243.         {
  244.             if((m & 0x80) == 0x80)
  245.             {
  246.                 LCD_RGB_DATA(Black);
  247.             }
  248.             else
  249.             {
  250.                 LCD_RGB_DATA(White);
  251.             }

  252.             m <<= 1;
  253.         }
  254.     }
  255. }
复制代码


2. .h文件:

  1. #ifndef __LCD_H
  2. #define __LCD_H
  3. #include <STC32G.h>

  4. //----RGB-16bit色值表--------------------
  5. #define White                0xFFFF
  6. #define Black                0x0000
  7. #define Red                        0xF800
  8. #define Yellow        0xFFE0
  9. #define Blue                0x001F
  10. #define Green                0x07E0
  11. #define Blue2                0x051F
  12. #define Magenta        0xF81F
  13. #define Cyan                0x7FFF

  14. //-----16bit-8080总线端口配置--------------------------------------
  15. //使用LCM硬件接口完成相关寄存器配置后无需再次定义以下接口引脚
  16. //sbit LCD_RS  = P4^5;
  17. //sbit LCD_RD  = P4^4;
  18. //sbit LCD_WR  = P4^2;
  19. //sfr         LCD_BUS_H = 0xA0;        //P0--0x80,P1=0x90,P2=0xA0,P3=0x0B0, P6= 0xE8
  20. //sfr         LCD_BUS_L = 0x80;        //P0--0x80,P1=0x90,P2=0xA0,P3=0x0B0, P6= 0xE8
  21. //LCD屏的CS、RST引脚不在LCM接口控制范围内、需要单独定义引脚
  22. sbit LCD_CS  = P1^1;
  23. sbit LCD_RST = P1^0;
  24. /**** LCD基本操作宏定义 ***********/
  25. #define LCD_CS_SET()                LCD_CS = 1
  26. #define LCD_CS_CLR()                LCD_CS = 0
  27. #define LCD_RST_SET()                LCD_RST = 1
  28. #define LCD_RST_CLR()                LCD_RST = 0
  29. #define LCD_RS_SET()                LCD_RS = 1
  30. #define LCD_RS_CLR()                LCD_RS = 0
  31. #define LCD_WR_SET()                LCD_WR = 1
  32. #define LCD_WR_CLR()                LCD_WR = 0
  33. #define LCD_RD_SET()                LCD_RD = 1
  34. #define LCD_RD_CLR()                LCD_RD = 0
  35. #define LCD_WriteWord(n)         LCD_BUS_H = (u8)(n>>8); LCD_BUS_L = (u8)n; NOP1();        LCD_WR_CLR(); NOP1();        LCD_WR_SET();        NOP1();        
  36. #define        LCD_WR_PULSE()                NOP1();        LCD_WR_CLR(); NOP1();        LCD_WR_SET()
  37. //-----------声明函数---------------------------------
  38. void LCM_Config(void);
  39. void LCD_WR_REG(u8 dat);
  40. void LCD_WR_DATA(u8 dat);
  41. void LCD_RGB_DATA(u16 dat);
  42. void LCD_SetPos(u16 x0,u16 x1,u16 y0,u16 y1);
  43. void ClearScreen(uint bColor);
  44. void Put32_32(uint x, uint y, uchar shuzi);//, uint fColor

  45. #endif
复制代码

3. 主函数文件:


  1. #include "STC32G.h"
  2. #include "ST7796.h"
  3. #include "LCD.h"
  4. #include "delay.h"
  5. //=============================================
  6. void main()
  7. {
  8. EAXSFR();//使能P_SW2
  9. GPIO_set();//所有I/O口初始化(准双向口)
  10. WTST = 0;
  11. P2M0 = 0xff; //P2口推挽输出做高8位数据输出口
  12. P2M1 = 0x00;
  13. P0M0 = 0xff; //P0口推挽输出做低8位数据输出口
  14. P0M1 = 0x00;         
  15. P4M0 |= 0x34; //P4.5、P4.4、P4.2推挽输出
  16. P4M1 &= ~0x34;  
  17. P1M0 |= 0x03;        //P1.0、P1.1推挽输出
  18. P1M1 &= ~0x03;
  19. P0PU = 0xff; //P0各口配置4k上拉电阻
  20. P2PU = 0xff; //P2各口配置4k上拉电阻
  21. P1PU |= 0x03;//P1.0、P1.1配置4k上拉电阻
  22. P4PU |= 0x34;//P4.5、P4.4、P4.2配置4k上拉电阻
  23. EA = 1;
  24. LCM_Config();
  25. LCD_Init();   //TFT初始化
  26. ClearScreen(Blue);//清屏、显示白屏
  27. while(1)
  28. {
  29. Put32_32(100, 100, 7);
  30. delay_ms(1000);
  31. /*
  32. ClearScreen(Red);
  33. delay_ms(1000);
  34. ClearScreen(Green);
  35. delay_ms(1000);
  36. ClearScreen(Blue);
  37. delay_ms(1000);
  38. ClearScreen(Yellow);
  39. delay_ms(1000);
  40. ClearScreen(White);
  41. delay_ms(1000);
  42. */
  43.     }
  44. }
复制代码


屏幕图片如下:






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
发表于 3 小时前 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
蛮漂亮

谢谢分享
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

谢谢楼主分享
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
谢谢楼主分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-8-11 15:36 , Processed in 0.109200 second(s), 8 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表