郭天祥的10天学会51单片机_第八节

开发板电源按钮上面的滑动变阻器(1602标号的是控制1602液晶的,12864标号的是控制12864液晶的)是控制液晶的颜色,可以把矩阵检测的程序写入单片机,然后然液晶显示,同时顺时针调节滑动变阻器,让液晶颜色变亮

这里用的1602(16对应一行显示十六个字符,02对应一共两行)液晶阵脚是十六针的,一行显示十六个字符,一共两行;12864(横的128个点,竖的 64点)图像液晶,

1602液晶说明的P1RS是数据命令选择端,高电平表示数据选择端,低电平表示命令选择端,程序中写命令,RS状态是H,程序中写数据,4号口接到单片机的P3.5

RL高电平是读选择端状态,低电平是写选择端

在使用一个芯片的之前要将这个芯片的资料搞明白,搞明白之后再操作该芯片

1602液晶说明的P2的基本操作时序,高脉冲指的是一个凸型脉冲,低脉冲指的是一个凹型脉冲,这里只看写指令和写数据;见P5写操作时序中,RS先给低电平写指令再给高电平写数据,RW给低电平开始写指令或数据,tsp2为有效数据准备时间,当E高电平时,开始将有效数据送出,在tpw时间内DB0DB7的数据必须有效才能写进去,这里我们给RW始终低电平让液晶始终在写;见P2的显示模式设置,5*7点阵就是横行5个点、竖行7个点显示一个字符,指令码对应0x38;见P3的设置指针设置,80H+0对应RAM地址(见P2)上面的0080H+1对应RAM(数据存储区)地址的01,从0027,然后断开,再从4067P2RAM地址映射图是液晶数据存储区的地址映射

开发板上液晶在蜂鸣器的下面,HEADER161管脚是地,2管脚是VCC1516管脚是背光的作用,15管脚接电阻用来限流并且不让光太亮,D0D7是数据口接单片机的P0口,6管脚是使能,对应TX-1C型单片机实验板原理图上的LCDEN接单片机的P3.4口,管脚5是读写选择端R/W,这里只写不读,给5管脚低电平,数据命令选择端RS接单片机的P3.5口,3管脚是偏压信号,液晶显示需要一个负电压,上面有个滑动变阻器,调节滑动变阻器内部显示的对比度就发生变化;程序中控制LCDEN接单片机的P3.4口和数据命令选择端RS接单片机的P3.5口即可

液晶使用时先把光标弄出来,可以写两个函数,一个用来写指令一个用来写程序

买完液晶就看资料,看完资料就按资料连接控制就行了

寄存器等一些知识不用记的,我们是应用,应用时可以查书

使用时要关掉数码管,防止和液晶一起使用时功率过大,所以用锁存器关掉数码管

液晶显示不用大循环,显示后不给命令改变就不会变

先让液晶有显示:

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit lcden=P3^4;

sbit lcdrs=P3^5;

sbit dula=P2^6;//使用时要关掉数码管,防止和液晶一起使用时功率过大,所以用锁存器关掉//数码管

sbit wela=P2^7;

uchar num;

void delay(uint z)

{

       uint x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void write_com(uchar com)

{

       lcdrs=0;

       P0=com;//数据口送上数据,有效数据准备好后让使能端lcden置高

       delay(5);//1602液晶说明P2的写程序时序图

       lcden=1;

       delay(5);

       lcden=0;

}

void write_data(uchar date)//液晶写指数据

{

       lcdrs=1;

       P0=date;

       delay(5);

       lcden=1;

       delay(5);

       lcden=0;

}

void init()

{

       dula=0;

       wela=0;

       lcden=0;

       write_com(0x38);//1602液晶说明P2,初始化设置中第一步显示模式设置

       write_com(0x0e);//显示开关及光标设置

       write_com(0x06);//地址指针加1 ,整屏不移动

}

void main()

{

       init();

       while(1);

}

写数字1见字符手册的PDFP16的表,当送去‘1’(‘1’实际上是ASCII码,对应一个十六进制数)时,实际上送去的是313为横坐标,1为纵坐标),程序中可以送0x31

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

//uchar code table[]="I LIKE MCU!";//写单字符用单引号引,多字符用双引号引

//uchar code table1[]="WWW.TXMCU.COM";

sbit lcden=P3^4;

sbit lcdrs=P3^5;

sbit dula=P2^6;//使用时要关掉数码管,防止和液晶一起使用时功率过大,所以用锁存器关掉//数码管

sbit wela=P2^7;

uchar num;

void delay(uint z)

{

       uint x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void write_com(uchar com)

{

       lcdrs=0;

       P0=com;//数据口送上数据

       delay(5);//见见1602液晶说明P2的写程序时序图

       lcden=1;

       delay(5);

       lcden=0;

}

void write_data(uchar date)//液晶写指数据

{

       lcdrs=1;

       P0=date;

       delay(5);

       lcden=1;

       delay(5);

       lcden=0;

}

void init()

{

       dula=0;

       wela=0;

       lcden=0;

       write_com(0x38);//1602液晶说明P2,初始化设置中第一步显示模式设置

       write_com(0x0e);//显示开关及光标设置

       write_com(0x06);//地址指针加1 ,整屏不移动,当write_com(0x07)时,在初始化//write_com(0x80)地址没有变化时,所有字符移动到液晶左侧的外面,

       write_com(0x01);//01为清屏指令

       write_com(0x80);//数据指针初始化,设置数据的初始位置

}

void main()

{

       init();

       write_data('1');//注意要有单引号,如果没有单引号write_data(1),就会显示乱码

       while(1);//保持住

}

主程序中写入AB

void main()

{

       init();

       write_data(0x41);

       delay(10);

       write_data('B');

       while(1);

}

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

uchar code table[]="I LIKE MCU!";//写单字符用单引号引,多字符用双引号引

uchar code table1[]="WWW.TXMCU.COM";//注意数组是从序号0开始的

sbit lcden=P3^4;

sbit lcdrs=P3^5;

sbit dula=P2^6;//使用时要关掉数码管,防止和液晶一起使用时功率过大,所以用锁存器关掉//数码管

sbit wela=P2^7;

uchar num;

void delay(uint z)

{

       uint x,y;

       for(x=z;x>0;x--)

              for(y=110;y>0;y--);

}

void write_com(uchar com)//液晶写指令,见1602液晶说明P2的写指令

{

       lcdrs=0;//RS给低电平写指令,这里就不用把RS置为高电平

       P0=com;//数据口送上数据

       delay(5);//见见1602液晶说明P2的写程序时序图

       lcden=1;

       delay(5);

       lcden=0;

}

void write_data(uchar date)//液晶写指数据

{

       lcdrs=1; //RS给高电平读指令,这里就不用把RS置为低电平

       P0=date;

       delay(5);

       lcden=1;

       delay(5);

       lcden=0;

}

void init()

{

       dula=0;//关掉数码管

       wela=0;

       lcden=0;

       write_com(0x38);//1602液晶说明P2,初始化设置中第一步显示模式设置

       write_com(0x0e);//显示开关及光标设置

       write_com(0x06);//地址指针加1 ,整屏不移动

       write_com(0x01);//01为清屏指令

       write_com(0x80+0x10);//数据指针初始化

}

void main()

{

       init();

       for(num=0;num<11;num++)

       {

              write_data(table[num]);

              delay(20);//延长的时间长可以看出动态效果,如delay(300)

       }//在该句下面添加清屏write_com(0x01)table[]的字符显示完就清屏,继续显示下面的

       write_com(0x80+0x40);//放到第二行可以write_com(0x80+0x40),见1602液晶说明

//想空几位,可以write_com(0x80+0x40+0x03),右移三位,也可以write_com(0x80+0x40+3)//这里十进制和十六进制可以通用

       for(num=0;num<13;num++)

       {

              write_data(table1[num]);

              delay(20);

       }

       while(1);

}

字符串先显示出来,再全部左移:

编译后错误提示:UNCALLED SEGMENT表示一个函数没有调用

显示从右到左滚动:将数据指针指到10那,写完再用整屏移动,见EN_TC1602PDFP12Cursor or Display Shift命令,S/CR/L10时表示显示左移,光标跟随显示移动,code0x18左移一下:

void main()

{

       init();

       for(num=0;num<11;num++)// 这里写的数据是在液晶外面写的,初始化程序的0x10是液晶外面

       {

              write_data(table[num]);

              delay(200);//延长的时间长可以看出动态效果,如delay(300)

       }

       write_com(0x80+0x53);

       for(num=0;num<13;num++)// 这里写的数据是在液晶外面写的,0x53是液晶外面

       {

              write_data(table1[num]);

              delay(20);

       }

       for(num=0;num<16;num++)

       {

              write_com(0x18);//写完数据就移动,整屏左移

              delay(200);

       }

       while(1);

}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值