|
本帖最后由 慕名而来 于 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接口时,虽然上述图片上的东西看着挺复杂的,但是配置上述提到的寄存器其实只需要两行代码:
- //----16BIT-8080-硬件LCM接口初始化------
- void LCM_Config(void)
- {
- LCMIFCFG = 0x82;//BD7=1 (使能LCM接口中断),B3、B2 =00 (16bit总线时P2=高8位、P0=低8位),B1=1 (16bit接口),B0=0 (I8080接口模式)
- LCMIFCFG2 = 0x09; //RS:P45,RD:P44,WR:P42; Setup Time=2,HOLD Time=1
- LCMIFSTA = 0x00;//清除LCM中断标志
- }
复制代码
配置好了上述寄存器后接下来要用到的就是所有LCD屏驱动中都有的两个基础函数;
1.写指令函数
- //LCM接口中断模式发送指令、数据的相关函数
- //----写指令函数------------------------
- void LCD_WR_REG(u8 cmd)
- {
- LCMIFDATH = 0;
- LCMIFDATL = cmd; //(低8位=cmd)
- LCD_CS_CLR();
- LCMIFCR = 0x84; //使能LCM接口、发送"写命令"脉冲
- }
复制代码
2.写数据函数:
- //----写8bit数据函数-------------------
- void LCD_WR_DATA(u8 dat)
- {
- LCMIFDATH = 0;
- LCMIFDATL = dat;//(低8位=dat)
- LCD_CS_CLR();
- LCMIFCR = 0x85; //使能LCM接口、发送"写数据"脉冲
- }
复制代码
还有一个经常用到的就是写16位数据的函数:
- //----写入16bit颜色数据函数------------
- //输出R-5BIT,G-6BIT,B-5BIT
- void LCD_RGB_DATA(u16 dat)
- {
- LCMIFDATH = ((u8)(dat >> 8)); //发送数据高8位字节
- LCMIFDATL = ((u8)dat); //发送数据低8位字节
- LCD_CS_CLR();
- LCMIFCR = 0x85; //使能LCM接口、发送"写数据"脉冲
- }
复制代码
使用STC32G硬件LCM接口驱动ST7796彩屏有两种驱动方式,1.查询方式,可不开启LCM接口中断。2.中断方式,需要开启LCM接口中断并且配备中断函数。我分享的代码中两种方式的代码都有,可以根据用途选择使用那种驱动方式,对于我的这块屏幕感觉使用中断方式显示更加稳定,这段代码在调试时因为开启了中断而没有匹配中断函数很久没有调好,后来到相关论坛求问并得到了详细的指点后才实现了刷屏在此一并谢过。
完整代码如下:
1. .c文件
- #include "LCD.h"
- #include "delay.h"
- //--------------------------------------------------
- //--------------------------------------------------
- unsigned char code shu_zi_32[] =
- {
- //32*32数码数字
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xC0,
- 0x03, 0x7F, 0xFF, 0xB0, 0x07, 0x80, 0x00, 0x78, 0x07, 0xC0, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8,
- 0x07, 0xC0, 0x00, 0xF8, 0x0F, 0xC0, 0x01, 0xF8, 0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x01, 0xF0,
- 0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x00, 0x01, 0xF0, 0x06, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00,
- 0x0E, 0x00, 0x00, 0xC0, 0x1F, 0x00, 0x01, 0xE0, 0x1F, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0,
- 0x1F, 0x00, 0x03, 0xE0, 0x3F, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x07, 0xE0, 0x3E, 0x00, 0x07, 0xC0,
- 0x3E, 0x00, 0x07, 0xC0, 0x3E, 0x00, 0x07, 0xC0, 0x3C, 0x00, 0x07, 0xC0, 0x1B, 0xFF, 0xFB, 0xC0,
- 0x07, 0xFF, 0xFD, 0x80, 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //0
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
- 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00,
- 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00,
- 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x01, 0x80, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00,
- 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00,
- 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x80, 0x00,
- 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //1
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x80, 0x01, 0xFF, 0xFF, 0xC0,
- 0x00, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xF8,
- 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0,
- 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0xFF, 0xFD, 0xE0, 0x01, 0xFF, 0xFE, 0xC0,
- 0x0E, 0xFF, 0xFE, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00,
- 0x1F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00,
- 0x3E, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFE, 0x00,
- 0x07, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //2
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xC0,
- 0x00, 0x7F, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xF8,
- 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x01, 0xF8, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0,
- 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0xFF, 0xFE, 0xE0, 0x01, 0xFF, 0xFF, 0x00,
- 0x00, 0xFF, 0xFE, 0xC0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
- 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xC0,
- 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x03, 0xFF, 0xFB, 0xC0,
- 0x07, 0xFF, 0xFD, 0x80, 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //3
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x03, 0x00, 0x00, 0x30, 0x07, 0x80, 0x00, 0x78, 0x07, 0xC0, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8,
- 0x07, 0xC0, 0x00, 0xF8, 0x0F, 0xC0, 0x01, 0xF8, 0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x80, 0x01, 0xF0,
- 0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x00, 0x01, 0xF0, 0x06, 0xFF, 0xFE, 0xE0, 0x01, 0xFF, 0xFF, 0x00,
- 0x00, 0xFF, 0xFE, 0xC0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
- 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xC0,
- 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xC0,
- 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //4
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xC0,
- 0x03, 0x7F, 0xFF, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00,
- 0x07, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
- 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00,
- 0x00, 0xFF, 0xFE, 0xC0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
- 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xC0,
- 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x03, 0xFF, 0xFB, 0xC0,
- 0x07, 0xFF, 0xFD, 0x80, 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //5
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xC0,
- 0x03, 0x7F, 0xFF, 0x80, 0x07, 0x80, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00,
- 0x07, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00,
- 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00,
- 0x0E, 0xFF, 0xFE, 0xC0, 0x1F, 0x00, 0x01, 0xE0, 0x1F, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0,
- 0x1F, 0x00, 0x03, 0xE0, 0x3F, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x07, 0xE0, 0x3E, 0x00, 0x07, 0xC0,
- 0x3E, 0x00, 0x07, 0xC0, 0x3E, 0x00, 0x07, 0xC0, 0x3C, 0x00, 0x07, 0xC0, 0x1B, 0xFF, 0xFB, 0xC0,
- 0x07, 0xFF, 0xFD, 0x80, 0x03, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //6
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFF, 0x80,
- 0x00, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x01, 0xF0,
- 0x00, 0x00, 0x01, 0xF0, 0x00, 0x00, 0x03, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
- 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0,
- 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x0F, 0x80,
- 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x80,
- 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //7
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xA0,
- 0x03, 0x7F, 0xFF, 0x70, 0x07, 0x80, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8,
- 0x07, 0xC0, 0x00, 0xF8, 0x0F, 0xC0, 0x01, 0xF0, 0x0F, 0xC0, 0x01, 0xF0, 0x0F, 0x80, 0x01, 0xF0,
- 0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x00, 0x01, 0xE0, 0x06, 0xFF, 0xFE, 0xC0, 0x01, 0xFF, 0xFF, 0x00,
- 0x06, 0xFF, 0xFE, 0xC0, 0x0F, 0x00, 0x01, 0xE0, 0x1F, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0,
- 0x1F, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0, 0x1F, 0x00, 0x03, 0xE0, 0x3E, 0x00, 0x07, 0xC0,
- 0x3E, 0x00, 0x07, 0xC0, 0x3E, 0x00, 0x07, 0xC0, 0x3C, 0x00, 0x07, 0xC0, 0x1B, 0xFF, 0xFB, 0x80,
- 0x07, 0xFF, 0xFD, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //8
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0xFF, 0xFF, 0xA0,
- 0x03, 0x7F, 0xFF, 0x70, 0x07, 0x80, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8, 0x07, 0xC0, 0x00, 0xF8,
- 0x07, 0xC0, 0x00, 0xF8, 0x0F, 0xC0, 0x01, 0xF0, 0x0F, 0xC0, 0x01, 0xF0, 0x0F, 0x80, 0x01, 0xF0,
- 0x0F, 0x80, 0x01, 0xF0, 0x0F, 0x00, 0x01, 0xE0, 0x06, 0xFF, 0xFE, 0xC0, 0x01, 0xFF, 0xFF, 0x00,
- 0x00, 0xFF, 0xFE, 0xC0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0,
- 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xC0,
- 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x07, 0xC0, 0x03, 0xFF, 0xFB, 0x80,
- 0x07, 0xFF, 0xFD, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //9
- 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, 0x07, 0xE0, 0x00,
- 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 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, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 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, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x07, 0xE0, 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, //:
- };
- /*
- //----16BIT-8080-硬件LCM接口初始化------
- void LCM_Config(void)
- {
- LCMIFCFG = 0x02;//BD7=0 (不使能LCM接口中断),B3、B2 =00 (16bit总线时P2=高8位、P0=低8位),B1=1 (16bit接口),B0=0 (I8080接口模式)
- LCMIFCFG2 = 0x09; //RS:P45,RD:P44,WR:P42; Setup Time=2,HOLD Time=1
- LCMIFSTA = 0x00;//清除LCM中断标志
- }
- //LCM接口查询模式发送指令、数据的相关函数
- //----写指令函数------------------------
- void LCD_WR_REG(u8 cmd)
- {
- LCMIFDATH = 0;
- LCMIFDATL = cmd; //(低8位=cmd)
- LCD_CS_CLR();
- LCMIFCR = 0x84; //使能LCM接口、发送"写命令"脉冲
- while(!LCMIFSTA);
- LCMIFSTA=0x00;
- LCD_CS_SET();
- }
- //----写8bit数据函数-------------------
- void LCD_WR_DATA(u8 dat)
- {
- LCMIFDATH = 0;
- LCMIFDATL = dat;//(低8位=dat)
- LCD_CS_CLR();
- LCMIFCR = 0x85; //使能LCM接口、发送"写数据"脉冲
- while(!LCMIFSTA);
- LCMIFSTA=0x00;
- LCD_CS_SET();
- }
- //----写入16bit颜色数据函数------------
- //输出R-5BIT,G-6BIT,B-5BIT
- void LCD_RGB_DATA(u16 dat)
- {
- LCMIFDATH = ((u8)(dat>>8)); //发送数据高8位字节
- LCMIFDATL = ((u8)dat); //发送数据低8位字节
- LCD_CS_CLR();
- LCMIFCR = 0x85; //使能LCM接口、发送"写数据"脉冲
- while(!LCMIFSTA);
- LCMIFSTA=0x00;
- LCD_CS_SET();
- }
- */
- //----16BIT-8080-硬件LCM接口初始化------
- void LCM_Config(void)
- {
- LCMIFCFG = 0x82;//BD7=1 (使能LCM接口中断),B3、B2 =00 (16bit总线时P2=高8位、P0=低8位),B1=1 (16bit接口),B0=0 (I8080接口模式)
- LCMIFCFG2 = 0x09; //RS:P45,RD:P44,WR:P42; Setup Time=2,HOLD Time=1
- LCMIFSTA = 0x00;//清除LCM中断标志
- }
- //LCM接口中断模式发送指令、数据的相关函数
- //----写指令函数------------------------
- void LCD_WR_REG(u8 cmd)
- {
- LCMIFDATH = 0;
- LCMIFDATL = cmd; //(低8位=cmd)
- LCD_CS_CLR();
- LCMIFCR = 0x84; //使能LCM接口、发送"写命令"脉冲
- }
- //----写8bit数据函数-------------------
- void LCD_WR_DATA(u8 dat)
- {
- LCMIFDATH = 0;
- LCMIFDATL = dat;//(低8位=dat)
- LCD_CS_CLR();
- LCMIFCR = 0x85; //使能LCM接口、发送"写数据"脉冲
- }
- //----写入16bit颜色数据函数------------
- //输出R-5BIT,G-6BIT,B-5BIT
- void LCD_RGB_DATA(u16 dat)
- {
- LCMIFDATH = ((u8)(dat >> 8)); //发送数据高8位字节
- LCMIFDATL = ((u8)dat); //发送数据低8位字节
- LCD_CS_CLR();
- LCMIFCR = 0x85; //使能LCM接口、发送"写数据"脉冲
- }
- //----LCM中断函数----------------------
- void LCM_Interrupt(void) interrupt 59
- {
- LCMIFSTA = 0x00;
- LCD_CS_SET();
- }
- //----ST7796液晶屏初始化(简化版)---------------
- void LCD_Init(void)
- {
- LCD_RST = 1;
- delay_ms(50);
- LCD_RST = 0;
- delay_ms(50);
- LCD_RST = 1;
- delay_ms(50);
- LCD_WR_REG(0x11); // 退出睡眠
- delay_ms(120);
- LCD_WR_REG(0x36); // 屏显模式
- LCD_WR_DATA(0x28); // 横屏 0x2a=x,0x2b=y //屏幕横放、接线口在左侧,上至下扫描&向上显示字符(正显)
- LCD_WR_REG(0x3A); // 像素格式
- LCD_WR_DATA(0x55); // 16-bit(RGB565)
- LCD_WR_REG(0x29);
- delay_ms(100);
- }
- //---------------------------------------------------------
- void LCD_SetPos(u16 x0, u16 x1, u16 y0, u16 y1)
- {
- //横屏显示
- LCD_WR_REG(0x2a);
- LCD_WR_DATA((u8)(x0 >> 8)); //起始列地址高8位SC(15:8]
- LCD_WR_DATA((u8)x0); //起始列地址低8位SC[7:0]
- LCD_WR_DATA((u8)(x1 >> 8)); //终止列地址高8位EC[15:8]
- LCD_WR_DATA((u8)x1); //终止列地址低8位EC[7:0]
- LCD_WR_REG(0x2b);
- LCD_WR_DATA((u8)(y0 >> 8)); //行地址同上操作
- LCD_WR_DATA((u8)y0);
- LCD_WR_DATA((u8)(y1 >> 8));
- LCD_WR_DATA((u8)y1);
- LCD_WR_REG(0x2c);//开始写入GRAM;地址指针累加
- }
- //----全屏刷新一种颜色----------------------------------------------------
- void ClearScreen(u16 color)
- {
- uint i, j;
- LCD_SetPos(0, 480 - 1, 0, 320 - 1); //给出起始与终止坐标
- for(i = 0; i < 320; i++) //
- {
- for(j = 0; j < 480; j++) //横屏显示
- LCD_RGB_DATA(color);
- }
- }
- //====32*32数码字型显示函数==================================================
- //使用单片机内部存储的32*32特殊字型数组,bit mode
- void Put32_32(uint x, uint y, uchar shuzi)//, uint fColor
- {
- uchar i, j, m;
- LCD_SetPos(x, x + 32 - 1, y, y + 32 - 1);
- for(i = 0; i < 128; i++)
- {
- m = shu_zi_32[shuzi * 128 + i];
- for(j = 0; j < 8; j++)
- {
- if((m & 0x80) == 0x80)
- {
- LCD_RGB_DATA(Black);
- }
- else
- {
- LCD_RGB_DATA(White);
- }
- m <<= 1;
- }
- }
- }
复制代码
2. .h文件:
- #ifndef __LCD_H
- #define __LCD_H
- #include <STC32G.h>
- //----RGB-16bit色值表--------------------
- #define White 0xFFFF
- #define Black 0x0000
- #define Red 0xF800
- #define Yellow 0xFFE0
- #define Blue 0x001F
- #define Green 0x07E0
- #define Blue2 0x051F
- #define Magenta 0xF81F
- #define Cyan 0x7FFF
- //-----16bit-8080总线端口配置--------------------------------------
- //使用LCM硬件接口完成相关寄存器配置后无需再次定义以下接口引脚
- //sbit LCD_RS = P4^5;
- //sbit LCD_RD = P4^4;
- //sbit LCD_WR = P4^2;
- //sfr LCD_BUS_H = 0xA0; //P0--0x80,P1=0x90,P2=0xA0,P3=0x0B0, P6= 0xE8
- //sfr LCD_BUS_L = 0x80; //P0--0x80,P1=0x90,P2=0xA0,P3=0x0B0, P6= 0xE8
- //LCD屏的CS、RST引脚不在LCM接口控制范围内、需要单独定义引脚
- sbit LCD_CS = P1^1;
- sbit LCD_RST = P1^0;
- /**** LCD基本操作宏定义 ***********/
- #define LCD_CS_SET() LCD_CS = 1
- #define LCD_CS_CLR() LCD_CS = 0
- #define LCD_RST_SET() LCD_RST = 1
- #define LCD_RST_CLR() LCD_RST = 0
- #define LCD_RS_SET() LCD_RS = 1
- #define LCD_RS_CLR() LCD_RS = 0
- #define LCD_WR_SET() LCD_WR = 1
- #define LCD_WR_CLR() LCD_WR = 0
- #define LCD_RD_SET() LCD_RD = 1
- #define LCD_RD_CLR() LCD_RD = 0
- #define LCD_WriteWord(n) LCD_BUS_H = (u8)(n>>8); LCD_BUS_L = (u8)n; NOP1(); LCD_WR_CLR(); NOP1(); LCD_WR_SET(); NOP1();
- #define LCD_WR_PULSE() NOP1(); LCD_WR_CLR(); NOP1(); LCD_WR_SET()
- //-----------声明函数---------------------------------
- void LCM_Config(void);
- void LCD_WR_REG(u8 dat);
- void LCD_WR_DATA(u8 dat);
- void LCD_RGB_DATA(u16 dat);
- void LCD_SetPos(u16 x0,u16 x1,u16 y0,u16 y1);
- void ClearScreen(uint bColor);
- void Put32_32(uint x, uint y, uchar shuzi);//, uint fColor
- #endif
复制代码
3. 主函数文件:
- #include "STC32G.h"
- #include "ST7796.h"
- #include "LCD.h"
- #include "delay.h"
- //=============================================
- void main()
- {
- EAXSFR();//使能P_SW2
- GPIO_set();//所有I/O口初始化(准双向口)
- WTST = 0;
- P2M0 = 0xff; //P2口推挽输出做高8位数据输出口
- P2M1 = 0x00;
- P0M0 = 0xff; //P0口推挽输出做低8位数据输出口
- P0M1 = 0x00;
- P4M0 |= 0x34; //P4.5、P4.4、P4.2推挽输出
- P4M1 &= ~0x34;
- P1M0 |= 0x03; //P1.0、P1.1推挽输出
- P1M1 &= ~0x03;
- P0PU = 0xff; //P0各口配置4k上拉电阻
- P2PU = 0xff; //P2各口配置4k上拉电阻
- P1PU |= 0x03;//P1.0、P1.1配置4k上拉电阻
- P4PU |= 0x34;//P4.5、P4.4、P4.2配置4k上拉电阻
- EA = 1;
- LCM_Config();
- LCD_Init(); //TFT初始化
- ClearScreen(Blue);//清屏、显示白屏
- while(1)
- {
- Put32_32(100, 100, 7);
- delay_ms(1000);
- /*
- ClearScreen(Red);
- delay_ms(1000);
- ClearScreen(Green);
- delay_ms(1000);
- ClearScreen(Blue);
- delay_ms(1000);
- ClearScreen(Yellow);
- delay_ms(1000);
- ClearScreen(White);
- delay_ms(1000);
- */
- }
- }
复制代码
屏幕图片如下:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|