目的

买了这块并口的屏幕,是为了做一个nes模拟器的游戏机,之前用的SPI的屏幕,显示游戏画面还是比较耗时,毕竟是串行数据,所以准备试一下并行接口的屏幕,顺便理解一下并口8080的驱动方式。

并口协议

8080 时序也叫因特尔总线,一般mcu(mpu)模式的lcd上。
Inter总线控制线有四根:

  • RD:写使能
  • WR:读使能
  • DC(RS): - 数据/命令
  • CS:片选
    然后就是若干根数据线,例如8或者16根。
    写时序图

    读时序图

    这里值得注意的就是,数据的读写,都是在RD或者WR的上升沿有效,这个很重要。所以我们可以先写数据,再制造一个上升沿,或者先拉低,写入数据后再拉高都是可以的。但是从图上来看,推荐前者。

ST7789 引脚定义

ST7789的用法有好几种,今天只说一下16bit的并口驱动。
硬件连接

#define P_LEDA_PORT      GPIOA
#define P_LEDA_PIN      GPIO_PIN_5          //背光
#define P_RD_PORT       GPIOA
#define P_RD_PIN        GPIO_PIN_9         //RD
#define P_WR_PORT       GPIOA
#define P_WR_PIN        GPIO_PIN_10       //WR
#define P_CD_PORT       GPIOA
#define P_CD_PIN        GPIO_PIN_11      //RS  0是命令  1:数据#define P_CS_PORT       GPIOA
#define P_CS_PIN        GPIO_PIN_12       //cs 0是选中#define P_RESET_PORT GPIOA
#define P_RESET_PIN     GPIO_PIN_14        //REST#define P_DATA_PORT        GPIOB
#define P_DATA_PIN      0xFFFF

其中,
背光,有的屏幕叫BLK,我们可以直接接高电平。
CS,我们可以直接接低电平,默认选中。
RD,我们可以直接拉高电平,不用读取功能。
CD,有的屏幕叫RS。

数据线,我们用的是GPIOB 0~15。这里要细心一点,接错了就会花屏

然后定义如下的控制宏

#define P_CD_LOW     P_CD_PORT->DATA &= ~P_CD_PIN
#define P_CD_HIGH       P_CD_PORT->DATA |= P_CD_PIN#define P_RESET_LOW      P_RESET_PORT->DATA &= ~P_RESET_PIN
#define P_RESET_HIGH    P_RESET_PORT->DATA |= P_RESET_PIN#define P_WR_LOW       P_WR_PORT->DATA &= ~P_WR_PIN
#define P_WR_HIGH       P_WR_PORT->DATA |= P_WR_PIN

这里是w801的写法,引脚的高低置位。

ST7789核心函数

LCD显示屏最基础的两个控制 函数,就是写寄存器和写数据,

void P_WriteReg(uint16_t reg)
{P_CD_LOW;WRITE_REG(P_DATA_PORT->DATA,reg);P_WR_LOW;P_WR_HIGH;P_CD_HIGH;
}void P_WriteData(uint16_t data)
{WRITE_REG(P_DATA_PORT->DATA,data);P_WR_LOW;P_WR_HIGH;
}

这里我们将控制线的修改,完全放在写寄存器上,因为写寄存器用的少,这样写数据的时候,就效率高了一些。

然后就是初始化函数

void LCD_Init(void)
{LCD_Reset_On();HAL_Delay(120);LCD_Reset_Off();HAL_Delay(120);LCD_WriteReg(0x3A);      //65k modeLCD_WriteData8(0x05);LCD_WriteReg(0xC5); //VCOMLCD_WriteData8(0x1A);LCD_WriteReg(0x36);                // 屏幕显示方向设置LCD_WriteData8(0x00);//-------------ST7789V Frame rate setting-----------//LCD_WriteReg(0xb2);LCD_WriteData8(0x05);LCD_WriteData8(0x05);LCD_WriteData8(0x00);LCD_WriteData8(0x33);LCD_WriteData8(0x33);LCD_WriteReg(0xb7);LCD_WriteData8(0x35);//--------------ST7789V Power setting---------------//LCD_WriteReg(0xBB);//VCOMLCD_WriteData8(0x3F);LCD_WriteReg(0xC0); //Power controlLCD_WriteData8(0x2c);LCD_WriteReg(0xC2);LCD_WriteData8(0x01);LCD_WriteReg(0xC3);LCD_WriteData8(0x0F);//0D       gvddLCD_WriteReg(0xC4);LCD_WriteData8(0x20);LCD_WriteReg(0xC6);LCD_WriteData8(0X11);//0x0FLCD_WriteReg(0xd0);LCD_WriteData8(0xa4);LCD_WriteData8(0xa1);LCD_WriteReg(0xE8);LCD_WriteData8(0x03);LCD_WriteReg(0xE9);LCD_WriteData8(0x09);LCD_WriteData8(0x09);LCD_WriteData8(0x08);//---------------ST7789V gamma setting-------------//LCD_WriteReg(0xE0); //Set GammaLCD_WriteData8(0xD0);LCD_WriteData8(0x05);LCD_WriteData8(0x09);LCD_WriteData8(0x09);LCD_WriteData8(0x08);LCD_WriteData8(0x14);LCD_WriteData8(0x28);LCD_WriteData8(0x33);LCD_WriteData8(0x3F);LCD_WriteData8(0x07);LCD_WriteData8(0x13);LCD_WriteData8(0x14);LCD_WriteData8(0x28);LCD_WriteData8(0x30);LCD_WriteReg(0XE1); //Set GammaLCD_WriteData8(0xD0);LCD_WriteData8(0x05);LCD_WriteData8(0x09);LCD_WriteData8(0x09);LCD_WriteData8(0x08);LCD_WriteData8(0x03);LCD_WriteData8(0x24);LCD_WriteData8(0x32);LCD_WriteData8(0x32);LCD_WriteData8(0x3B);LCD_WriteData8(0x14);LCD_WriteData8(0x13);LCD_WriteData8(0x28);LCD_WriteData8(0x2F);LCD_WriteReg(0x11);HAL_Delay(120);LCD_Clear(0x0000);            /*先手动清屏再显示,防止花屏显示*/LCD_WriteReg(0x29);      //开启显示   }

其中屏幕方向是可以修改的
LCD_WriteReg(0x36); // 屏幕显示方向设置
LCD_WriteData8(0x00);

0x00 就是正常的竖屏
0xA0 是向左横屏
还有两种0x60, 0xC0 估计是倒置和向右横屏,有兴趣的可以试一下。

易出错点

16bit驱动最容易出错的地方就是坐标设置,我以为坐标是16bit的,那么我就直接写四个坐标不就行了,恰恰错了,这里需要兼容8bit的,要把每个16bit分两次写入。否则就会出现花屏问题。
这个bug我搞了一天。

void LCD_Address_Set(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye)
{LCD_WriteReg(0x2a);LCD_WriteData(xs>>8);LCD_WriteData(xs&0xff);LCD_WriteData(xe>>8);LCD_WriteData(xe&0xff);LCD_WriteReg(0x2b);LCD_WriteData(ys>>8);LCD_WriteData(ys&0xff);LCD_WriteData(ye>>8);LCD_WriteData(ye&0xff);LCD_WriteReg(0x2c);}

代码提供

《完整代码下载》
其实是建议大家按照前面的方法自己写出来,基本的重要地方都已经提供了,所以还是要自己尝试一下,印象才更深刻。

结束语

谁支持我们伟大复兴,谁就是朋友,谁阻拦,那就是敌人。

单片机---HLK-W801并口驱动ST7789相关推荐

  1. 基于Proteus学习单片机系列(二)——驱动数码管

    获取更多资源,请关注微信公众号:嵌入式基地 获取项目资源:公众号后台回复:单片机仿真 基于Proteus学习单片机系列(一)--点亮LED 基于Proteus学习单片机系列(二)--驱动数码管 基于P ...

  2. 电平是什么?单片机的I/0口输入和输出,1和0是什么?什么是TTL电平?TTL电平分析?TTL、CMOS、RS232、RS485电平差异?usb转ttl?CH340模块驱动安装?电平之间的转换?

    电平是什么 理想的数字电路电平是这样的: 输入小于1/2VCC(电源电压)就是低电平,反之是高电平.实际的器件是做不到的,也不实用,如果输入电压在1/2VCC附近有干扰,就会发生错误的输入信号.现在常 ...

  3. 51单片机8255扩展c语言,51单片机8255A扩展IO口

    <51单片机8255A扩展IO口>由会员分享,可在线阅读,更多相关<51单片机8255A扩展IO口(23页珍藏版)>请在人人文库网上搜索. 1.一个芯片可扩展多个并行I/O口 ...

  4. usb转com口驱动

    usb-serial controller驱动是一款usb转com口驱动,连接路由器交换机时可能需要转接,里面有两个软件,其中plc_2003(recommend)我在xp上验证过,可以用,另一个没有 ...

  5. 树莓派 IO 口驱动开发

    关注+星标公众号,不错过精彩内容 转自 | 一口Linux IO开发是最基础的,也是入门必备技能,虽然很多已入门的读者来说,IO操作很简单,但对于很多初学者却不那么简单. 微机总线地址 地址总线: 百 ...

  6. 51单片机系列知识5--并口(2)

    2.P1口 P1口对应的专用寄存器的助记符是P1,它是一个8位的专用寄存器,字节地址是90H,它的每一位都有位地址,可以对位进行直接访问. PI口的位结构如图2-20所示.P1口也是准双向口,它的用途 ...

  7. 51单片机入门 - I/O口直接输入输出实例

    博主福利:100G+电子设计学习资源包! http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5 ...

  8. 如何巧妙利用4个IO口驱动12个LED灯

    在电路设计过程中有时经常遇到单片机的IO口不够用的情况.对于这样的问题,我们可以选择换单片机,也可以尝试一些巧妙的设计来避免IO口不够用的问题.例如当我们在设计中遇到许多LED灯需要控制的时候,而单片 ...

  9. pci串口驱动安装失败_TSC TTP-243E Pluse装LTP并口驱动无法安装

    一.前言描述 接到客户报修说,电脑无法开机,即到哥上门维修立即安排人员到现场查看原因,到现场后,查看的确是电脑系统问题,重新安装系统,安装完成系统后,发现打印机无法使用.这个打印机型号是TSC TTP ...

  10. Linux 如何加载并口/打印口驱动

    实际上Linux是自带并口驱动的,因此不需要再使用第三方驱动编译加载了. 设置并口的具体步骤如下: rmmod lp rmmod parport_pcinsmod /usr/lib/modules/$ ...

最新文章

  1. 吴 恩 达 教 你 做 机 器 学 习 职 业 规 划
  2. 数据库内核月报 - 2015 / 11-MySQL · 社区见闻 · OOW 2015 总结 MySQL 篇
  3. php mpdf html 转pdf,使用 MPDF 将HTML转为PDF,然后将该PDF转为PNG图片的时候,中文报错... ......
  4. SmartForms 小技巧
  5. coming music shows
  6. Linux-Rsync命令参数详解
  7. 微型计算机常用的worm是,2010江西省计算机等级考试试题 二级C试题考试答题技巧...
  8. spring mvc 传中文 到controller层乱码的 解决方法
  9. 深度学习笔记(17) 误差分析(二)
  10. vue 打开html流_【报Bug】“纯nvue”模式下,web-view无法打开本地html
  11. 全国最新省市县联动mysql_全国省市县区三级联动数据库mysql3500条数据-html资源网...
  12. 鉴定网站是否允许IPV6访问方法(湖大IPV6下载流量免费)
  13. 西门子博途TIA PORTAL硬件目录中无法找到CPU的固件版本时,如何下载项目数据?
  14. 第7-9节项目2-歌手大奖赛计分系列(1)
  15. 新计算机如何用光盘安装系统,win7如何用光盘装系统_使用光盘重装win7系统步骤...
  16. python getA() 函数
  17. [bzoj1023][SHOI2008]cactus仙人掌图【仙人掌】
  18. 阿里云Linux服务器部署Mysql,JDK以及Tomcat教程
  19. 查看Window系列本地账户密码
  20. SAP---安装方法

热门文章

  1. anaconda版本选择_Anaconda简介
  2. 深度学习caffe--手写字体识别例程(一)——运行手写字体识别例程
  3. 小程序之父子组件传值详解
  4. canvas小球绕斜椭圆轨迹运动
  5. RF(射频) - VSWR(电压驻波比)
  6. editorMd插件的使用总结(包括开启图片上传及拖拉粘贴上传图片)
  7. TFS2010新建项目失败
  8. Android 开发系列教程之(一)Android基础知识
  9. 工商银行计算机网银不能连接u盾,工商银行网银U盾无法识别怎么办
  10. 问题匹配/文本匹配数据集(自用)