当前位置: 首页 > news >正文

【LCD模块】液晶显示模块PDF笔记

LCD显示的步骤(默认已经完成片选): 

一、LCD每画一个点,实际上就是写寄存器:

   每个寄存器有相应的地址,写寄存器之前,要用A0A1A2这三个bit的地址选择你要改写的寄存(如:状态字寄

存器PSW:地址A2A1A0=111)。寄存器的地址如下,分别控制着:行(Y坐标)、列(X坐标)、前景色、背景色、数据、状态控制寄存器

所以,步骤就是:

1、写前景色、背景色寄存器

2、写状态控制寄存器(亮度控制、坐标自动+1、单点/多点写入方式)

3、写X,Y坐标寄存器。(用前两步设置的属性,在(x,y)处画点。

 上面每一步又可分为两步:1、通过地址A0A1A2选择寄存器,2、写入值。

“WLAT80控制板中有8个寄存器,它们是行(Y坐标)、列(X坐标)、前景色、背景色、数据、状态控制寄存器,通过对相关寄存器操作,可实现单点读屏,单点、多点、8点写屏。”

 

【LCD模块】液晶显示模块PDF笔记

【LCD模块】液晶显示模块PDF笔记

【LCD模块】液晶显示模块PDF笔记

寄存器:
X坐标寄存器:存即将显示的点的X坐标值,地址:A2A1A0=000,001,低字节在前,高字节在后

【LCD模块】液晶显示模块PDF笔记

Y坐标寄存器:地址:A2A1A0=010,011,低字节在前,高字节在后

【LCD模块】液晶显示模块PDF笔记

 状态控制寄存器:

【LCD模块】液晶显示模块PDF笔记

Bri1,bri0为亮度控制:=11,最亮;=10,较亮;=01,较暗;=00,黑屏。
D3和D2位根据用户需要可设置成以下两种功能:
Xinc为列(X坐标)号自动增加控制位,=1时允许X自动增加,写满一行后自动换行,=0时则禁止增加。单点写屏时,X自动加1,多点(或8点)写屏时自动加8;
YINC为行(Y坐标)自动加1控制位,=1时允许自动加1,=0时则禁止加1;
WRCON1,WRCON0为写入方式:
WRCON1,WRCON0=00时为单点写入方式,直接将颜色值写入数据寄存器,而与前景色、背景色寄存器内容无关;
WRCON1,WRCON0=01时为多点写入方式,将点位信息写入数据寄存器,如写入数据寄存器为‘01010101b’则显示‘原色、前景色、原色、前景色、原色、前景色、原色、前景色’。
WRCON1,WRCON0=10时为8点写入方式,将点位信息写入数据寄存器,如写入数据寄存器为‘01010101b’则显示‘背景色、前景色、背景色、前景色、背景色、前景色、背景色、前景色’。
**原色:显示屏原有颜色,前景色、背景色是事先存入前景、背景寄存器中的颜色值。

‘01010101b’

 set_lcd_status(0xC0);      11000000   直接将颜色值写入数据寄存器

 set_lcd_status(0xC1);      11000001   原色、前景色

 set_lcd_status(0xC2);      11000010   背景色、前景色

   如下图,显示屏原有颜色是一幅照片,“多点”两个字是用多点写入方式写入的,只写前景色蓝色,不写背景色;而“8点” 两字是用8点写入方式写入的,前景色为绿色,背景色为白色,前景和背景同时写入。

更多寄存器的功能和用法看PDF。

【LCD模块】液晶显示模块PDF笔记

二、实例:

 写寄存器:

void write_reg(uchar Addr,uchar Data)

  P5OUT|=BIT4;            //RD=1  
  P5OUT&=~BIT1;           //片选有效     
  P10DIR|=BIT0+BIT1+BIT2; //P10口的0、1、2脚设为输入,为向LCD模块写寄存器地址:A0A1A2 做准备
  Addr=Addr&0x07+(P10OUT&BIT3);//保持P10.3原来的电平状态(我们的P10.3口有其他用途,不能改变它)
  P10OUT=Addr;             //写寄存器地址:A0A1A2 选择要操作的寄存器   
  P4OUT=Data;             //数据挂在P4口上准备好 

  P5OUT&=~BIT5;           //写有效,将数据数据写入寄存器。

  P5OUT|=BIT5;            //写撤销     
  P5OUT|=BIT1;            //片选无效
}

void set_status(uchar status)
{
  write_reg(0x0F,status);
}

void set_front_color(uchar status)
{
  write_reg(0x0C,status);
}

void set_background_color(uchar status)
{
  write_reg(0x0D,status);
}

写汉字的函数:


void draw_hz(uint16 x,uint16 y,uint8 hz_height,uint8 hz_width, const uint8 *data)
{
  uint16 p = 0;
  set_lcd_status(0xC6);                                  // X自增8点写入
  for(uint8 i=0;i<hz_height;i++)
  {
    set_xcoord(x);                                       // 写X坐标数据
    set_ycoord(y+i);                                     // 写Y坐标数据

    for(uint8 j = 0; j < hz_width; j ++)
    {
      write_lcdreg(0x06,data[p]);                        //0x06写显示数据寄存器 
      p++;
    }
  }
}

汉字的高度和宽度,由取模取出来的字体的宽度高度决定:如:


const uint8 num[11][144]@0x010000={     
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x06,0x00,0x00,0x70,
0x07,0xFF,0xFF,0xF0,0x06,0x0C,0x30,0x70,0x06,0x0C,0x30,0x70,0x06,0x0C,0x30,0x70,
0x07,0xFF,0xFF,0xF0,0x06,0x01,0x00,0x70,0x04,0x01,0xC0,0x50,0x00,0x03,0x80,0x38,
0x3F,0xFF,0xFF,0xFC,0x10,0x03,0x00,0x00,0x00,0x83,0x06,0x00,0x00,0xFF,0xFF,0x00,
0x00,0xC0,0x07,0x00,0x00,0xC0,0x06,0x00,0x00,0xFF,0xFE,0x00,0x00,0xFF,0xFE,0x00,
0x00,0xC0,0x06,0x00,0x00,0xC0,0x06,0x00,0x00,0xFF,0xFE,0x00,0x00,0xC0,0x06,0x00,
0x00,0xC0,0x06,0x00,0x00,0xFF,0xFE,0x00,0x00,0xC0,0x06,0x00,0x00,0xC0,0x06,0x18,
0x00,0xC0,0x06,0x3C,0x3F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00}

 ……

}

高度为:33   宽度为:32/8= 4; 所填入的参数应为: 33 4  hz_height=33  hz_width=4

取字模,字模数组加括号和不加花括号的区别:

加花括号的时候,num[11][144] 数组的单元个数可以不精确,调用的时候num[x],以花括号为结束,

不加花括号的时候,数组的单元个数必须精确,调用时候会按定义的个数调用,如果里面的字模点阵数不一致,就会出现错误。

相关文章:

  • 【IAR中的char】IAR中的char默认没有负值等于unsigned char
  • 【C获取系统时间】C语言获取系统时间的几种方式|sleep休眠|time
  • 【端口中断进不去】Px中断进不去 原因
  • 【zigbee】zigbee vs 433  zigbee与433模块的优劣
  • 【C语言位段】C语言位段的特点和应用
  • 【GPRS发送控制符】SIM908/508 GPRS发送数据中的控制符
  • 【charconst* char】char **const p const char **p char *const *p
  • 【static、extern、头文件】static、extern、头文件的一点总结
  • 【strstr()函数的局限】strstr()检测不到存在的字符/数据/strcmp, strncmp和memcmp
  • 【ZIGBEE资料】zigbee资料下载
  • 【指针有效性】指针有效性的有效性检测的必要性!!
  • 【GPRS透明传输】GPRS透明传输
  • 【GPRS拨号错误】GPRS 某条指令一直ERRO
  • 【IAR编译和单片机】IAR编译和单片机的一些积累
  • 【C++】C++获取系统日期时间
  • angular2开源库收集
  • dva中组件的懒加载
  • vue-router 实现分析
  • 大数据与云计算学习:数据分析(二)
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • ------- 计算机网络基础
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 跳前端坑前,先看看这个!!
  • 用quicker-worker.js轻松跑一个大数据遍历
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 走向全栈之MongoDB的使用
  • const的用法,特别是用在函数前面与后面的区别
  • raise 与 raise ... from 的区别
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #NOIP 2014#Day.2 T3 解方程
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (第一天)包装对象、作用域、创建对象
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (十)c52学习之旅-定时器实验
  • (四)linux文件内容查看
  • (转)C#调用WebService 基础
  • .Net 4.0并行库实用性演练
  • .net refrector
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .php文件都打不开,打不开php文件怎么办
  • [ solr入门 ] - 利用solrJ进行检索
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • []FET-430SIM508 研究日志 11.3.31
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [android] 练习PopupWindow实现对话框
  • [BUG] Authentication Error
  • [BUUCTF 2018]Online Tool
  • [C#]科学计数法(scientific notation)显示为正常数字