第七课 控制液晶屏LCD1602实验准备:LCD1602 面包板 杜邦线 电阻:10k 8只 或排阻(用于P0上拉) (或直接使用完整的开发板) 课程内容:一、 原理图与接线这里分析下 几个接口信号 V0、RS、RW、EN 表示的意义: 3脚:V0,液晶显示偏压信号,用于调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。 4脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602进行数据字节的传输操作,而为低电平时,则是进行命令字节的传输操作。命令字节,即是用来对LCD1602的一些工作方式作设置的字节;数据字节,即使用以在1602上显示的字节。值得一提的是,LCD1602的数据是8位的。 5脚:R/W,读写选择端。当此脚为高电平可对LCD1602进行读数据操作,反之进行写数据操作。 6脚:E,使能信号(LCDE),其实是LCD1602的数据控制时钟信号,利用该信号的上升沿实现对LCD1602的数据传输。 7~14脚:8位并行数据口,使得对LCD1602的数据读写大为方便。 还有就是在单片机开发板上的接线:数据线接P0,控制线用P2中的三个IO sbit LCD_RS = P2^6; sbit LCD_RW = P2^5; sbit LCD_EP = P2^7; 二、 底层操作写命令 RS=L,RW=L,D0—D7=命令,EN=高脉冲 H 写数据 RS=H,RW=L,D0—D7=数据,EN=高脉冲H 三、 时序图这节课引入时序图,其他器件类似,只要看懂时序图,就可以通过编程轻松控制这些器件按自己的需求工作,注意时间轴从左往右。 我们先不读出它的数据的状态或者数据本身。所以只需要看两个写时序: ① 当我们要写指令字,设置LCD1602的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。 ② 当我们要写入数据字,在1602上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。 发现了么,写指令和写数据,差别仅仅在于RS的电平不一样而已。 操作步骤:(要对照时序图) 1) RS 确定 写数据还是命令 2) RW写模式 给0 3) P0 放数据或命令,延时5微秒 4) EN 给 1 延时5微秒 再给0 (即是给了脉冲) 这个表的命令也不需要记,在下面例程中LCD初始化部分就有厂家提供的代码. 还有下表是控制操作需要消耗的时间:ns表示纳秒 四、 按时序图编程一个 _nop_(); 大约1微秒 void lcd_cmd(BYTE cmd) { // 写入指令数据到LCD LCD_RS = 0; LCD_RW = 0; LCD_EP = 0; P0 = cmd; _nop_();_nop_();_nop_();_nop_();_nop_(); LCD_EP = 1; _nop_();_nop_();_nop_();_nop_();_nop_(); LCD_EP = 0; } void lcd_wdat(BYTE dat) { //写入字符显示数据到LCD LCD_RS = 1; LCD_RW = 0; LCD_EP = 0; P0 = dat; _nop_();_nop_();_nop_();_nop_();_nop_(); LCD_EP = 1; _nop_();_nop_();_nop_();_nop_();_nop_(); LCD_EP = 0; } void lcd_init() { //LCD初始化设定 lcd_cmd(0x38); //16*2显示,5*7点阵,8位数据 lcd_cmd(0x0c); //显示开,关光标 lcd_cmd(0x06); //移动光标 lcd_cmd(0x01); //清除LCD的显示内容 } BYTE code dis1[] = {' WELCOME TO '}; //要放最前面定义 BYTE code dis2[] = {' My C51 '};//要放最前面定义 main() { BYTE i; lcd_init(); // 初始化LCD delay(10); while(1) { lcd_wcmd(0x06); //向右移动光标 lcd_ wcmd (0x80); //设置显示位置为第一行的第1个字符 i = 0; while(dis1[ i ] != '\0') // \0 是C语言中字符串最后一个字符 { //显示字符'WLCOME TO' lcd_wdat(dis1[ i ]); i++; } lcd_ wcmd (0x80+0x40); //设置显示位置为第二行第1个字符 i = 0; while(dis2[ i ] != '\0') { lcd_wdat(dis2[ i ]); //显示字符' My C51' i++; delay(30); //控制两字之间显示速度 } } } 可以修改程序 让向左显示 ,或者移出移入 可以在在程序 中 需要的位置加入 延时 让数据稳定 五、增补C语言基础--数组简单理解:数组是同种类型元素的集合。(特别注意:同种类型) 1. 一维数组定义 int a[10]; 这样我们便定义了一个数组a,它分配10个int类型空间。 2.数组的初始化 例程中: BYTE code dis1[] = {' WELCOME TO '}; 定义了一个类型为 BYTE code 的数组,同时做初始化,这数组的各个元素都是一个字符,其中有空格,字母. 3.数组元素的访问 访问数组中的元素可以采用数组名加下标的方式,下标是从0开始,C语言并不检查数组下标是否越界,所以在访问数组中的元素时需要注意,需要对数组下标做判断,防止访问数组越界。 例子: int a[10]; int i; for (i = 0; i < 10;=""> { a[i] = i + 1; } 至于二维数组,简单可理解为一个XX行YY列的表格,本教程现时还没有用到,所以暂时不作详解. |
|