51单片机lcd1602全过程C语言编程显示大全

合集下载

lcd1602程序流程图

lcd1602程序流程图

LCD1602程序代码及显示流程图LCD1602显示程序代码DB P0//--P0=DB0~DB7位LCD_RS=P2;//--P2.0=RS位LCD UrW=P2;//--P2.1=RW位LCD_Ue=P2;//-P2.2=E//--/--/----定义函数ා define uchar unsigned charා define uint unsigned int///—定义子例程函数void LCD_Uiinit(void);//-初始化LCD1602函数void LCD_2;write_uchar命令(uchar命令);//-写入命令功能无效LCD到LCD1602_Char数据(uchar DAT);//-将无效的LCD数据写入LCD1602_Uxset_XY(uchar x,uchar y);//设置LCD1602 void LCD_uchar(uchar x,uchar y,uchar DAT)的显示位置x(0-16),y(1-2);//-在LCD1602中,显示包含无效字符的LCD;uchar x,uchar y,uchar*s);在LCD1602上显示一个字符串//void LCD_ucheck_uBusy(void);//检查Busy函数。

我没有使用这个功能,因为通过率很低。

LCD_u2;delay_10us(uint n);//-10微秒延迟子程序void LCD_udelay_50uS(uint n);/-延迟子程序50微秒初始化(无效){LCD_udelay_10us(20);LCD_uwrite_10us(0x38);//-设置8位格式,2行,5x7 LCD_2;delay_10us(5);LCD_uwrite_u命令(0x0c);//-整体显示,关闭光标,不闪烁LCD 不闪烁LCD_延时延时10us(5);LCD_写写写命令(0x06);///-设置输入模式,增量增量不移位LCD_延时延时10us 10us(5);LCD_写写写命令(0x01);///-清除LCD_延时延时50uS在屏幕上的显示屏(40);}//将无效的LCD命令写入lcd602_写写写的命令(uchar dat){LCD_u写写写的命令(uchar dat){LCD_延迟延迟_10us(5;5);LCD液晶显示无Rs=0;//命令LCD液晶显示u 10us(5);LCD_Rs=0;//命令LCD_LCD_ _在LCD_Udb=dat;LCD_uDelay_10us(5);LCD_ue=1;//允许LCD_delay_10us(5);LCD_ue=0;}/-将无效的LCD写入LCD1602_写数据(uchar dat){LCD_u延时_10us(5);LCD_urs=1;//数据液晶显示液晶显示u RW=0;//数据液晶显示显示uu RW=0;//向LCD写入液晶显示的DB=dat;LCD_延迟延时10us 10us(5;5);LCD_E=E=1;//将无效的LCD写入LCD_延迟_延迟_(u (5);LCD液晶显示LCD_u延迟10us(5);LCD_E=0;}/-设置显示位置无效LCD_uxy(uchar (x,uchary y){uchar地址;如果(y==1){address=0x80+x;/-第一行位置}其他{地址=0xc0+x;///第二行位置}液晶显示器延时延时延时10us(5);LCD液晶显示写写命令(地址);}/-显示字符功能功能voidlcd xdisp char(ucharx,uchary y,uchardat的uchar dat)//--液晶显示器显示器的disp char(0,1,0x38 0x38);//-显示8{LCD显示液晶显示器xxxxx0,1,0x38);//-显示8{LCD[液晶显示设设设设设设设设设设设设设设设设设(x,y);液晶显示器延迟_10us(5);LCD_write_u2;Data(DAT);}/-显示字符串函数void LCD_uP_u3;string (uchar x,uchar y,uchar*s){LCD_uxset_xy(x,y);LCD_uuDelay_10us(5);while(*s!='\0'){LCD_2;write_uData(*s);s++;}//∠s++;}/∠s++/>check_Busy()///实践证明,在我的LCD1602上,check Busy命令的通过率很低,LCD正常使用。

基于51单片机的1602液晶显示温度和时间的C程序

基于51单片机的1602液晶显示温度和时间的C程序

//液晶显示温度#include "AT89X52.H"#define Ddata P0sbit RS=P2^7; //命令数据控制端sbit RW=P2^6; //读写选择端sbit LCDE=P2^5; //液晶使能端sbit DQ=P2^0; //ds18b20与单片机连接口#define uchar unsigned char#define uint unsigned intunsigned char hour=0,min=0,sec=0; //定义初值unsigned int count=0;unsigned char line1[16]={" temp: "}; //16个字符unsigned char line2[16]={" time: 00:00:00"}; //16个字符unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组uchar data disdata[5];uint tvalue; //温度值uchar tflag; //温度正负标志void time();/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<110;j++);}void delay5ms()//延时5毫秒(不够精确的){unsigned int i;for (i=0;i<1000;i++);}void delay50us(){register int i;for (i=0;i<20;i++);}void delay(){unsigned char m,n;for(m=255;m>0;m--)for(n=255;n>0;n--);}void wr_com(unsigned char comm) //********写控制字符程序E=1 RS=0RW=0 **********//{LCDE=0; //使能端RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。

1602液晶滚动显示 C语言详细程序

1602液晶滚动显示 C语言详细程序

/****************************************************************************** *** 描述: LCD1602 滚动显示** 显示方式:* * 1、从左到右逐字显示,闪动二次,清屏。

* * 2、再从右到左逐字显示,闪动二次,清屏。

* * 3、周期性地重复上述显示方式。

* ******************************************************************************* */#include <reg51.h>#include <intrins.h>typedef unsigned char BYTE;typedef bit BOOL;sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EP = P2^7;BYTE code dis1[] = {" WELCOME TO "};BYTE code dis2[] = {" "};BYTE code dis3[] = {" OT EMOCLEW "};BYTE code dis4[] = {" MOC.NIHCERP.WWW "};delay(int ms){ // 延时子程序int i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}BOOL lcd_bz(){ // 测试LCD忙碌状态BOOL result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result = (BOOL)(P0 & 0x80);LCD_EP = 0;return result;}lcd_wcmd(BYTE cmd){ // 写入指令数据到LCD while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_pos(BYTE pos){ //设定显示位置lcd_wcmd(pos | 0x80);}lcd_wdat(BYTE dat){ //写入字符显示数据到LCD while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_init(){ //LCD初始化设定lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据delay(1);lcd_wcmd(0x0c); //显示开,关光标delay(1);lcd_wcmd(0x06); //移动光标delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}main(){BYTE i;lcd_init(); // 初始化LCDdelay(10);while(1){lcd_wcmd(0x06); //向右移动光标lcd_pos(0); //设置显示位置为第一行的第1个字符i = 0;while(dis1[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis1[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x40); //设置显示位置为第二行第1个字符i = 0;while(dis2[ i ] != '\0'){lcd_wdat(dis2[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(1);lcd_wcmd(0x04); //向左移动光标lcd_pos(15); //设置显示位置为第一行的第16个字符i = 0;while(dis3[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis3[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x4F); //设置显示位置为第二行的第16个字符i = 0;while(dis4[ i ] != '\0'){lcd_wdat(dis4[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(200); //控制两屏转换时间}}。

LCD1602-51单片机汇编程序.

LCD1602-51单片机汇编程序.

1602汇编程序,刃单片机汇编程序,仅需修改引脚定义即可。

晶振大小12M,程序测试完全正确。

内部包含写数据、写命令(包括读忙和不读忙、初始化等子函数。

调用时先给LCD_DAT赋值,给出需要写入的数据或命令,然后调用。

;端口引脚定义区LCD_RS BIT P2.4 ;1602数据命令选择端口LCD_RW BIT P2.5 ;1602 读写选择端口LCD_EN BIT P2.6 ;1602 使能端口LCD_DATA EQU P0 ;1602 数据端口;变量声明区ALL_FLAG EQU 20H ;标志位LCD_FLAG EQU AL「FLAG.7 ;1602 读忙标志位LCD_DAT EQU 30H ;1602 数据命令字DELAYED EQU 31H 涎时字广★★★****★★★★★★★*★*★★**★*★★★*★*★★★★★*★*★*★1602读命令函数,高位存至LCD_LAG中★★★★★★★★★★★★★★★★★★★★★if******************* /LCD_R_DATA:MOV LCD_DATA,#OFFHSETB L CD RWNOPSETB L CD_ENNOPMOV Acc丄CD_DATAMOV C,Acc.7MOV LCD_FLAG,CCLR LCD_ENNOPJB LCD_FLAG ,L CD_BUSYRET/★****★***★*★***********************★*★*★*1602写数据函数,数据存在LCD_DAT★ if*************************************** /LCD_W_DATA:LCALLLCD_R_DATASETB L CD_RSNOPMOV LCD_DATA丄CD_DATSETB L CD_ENNOPCLR LCD_ENRET/* 1602LCD_DAT,检测忙信号LCD_W_CMD:LCALLLCD_R_DATACLR LCD_RSCLR LCD_RWNOPMOV LCD_DATA, LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET /* 1602 与命令函数,命令存在LCD_DAT,不检测忙信号LCD CMD: 才***********才********************才才*****7写命令函数,命令存F在CLR LCD RWNOPMOV LCD_DATA, LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET/***************************************** 4 QCC初始化函数★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/ LCD INIT:MOV DELAYED,#30LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD CMDMOV DELAYED,#®LCALL DELAY_MSMOV LCD_DAT,#038HLCALL LCD_W_CMDMOV LCD_DAT,#08HLCALL LCD_W_CMDMOV LCD_DAT,#01HLCALL LCD_W_CMDMOV LCD_DAT,#06HLCALL LCD_W_CMDMOV LCD_DAT,#OCHLCALL LCD_W_CMDRET****************************************延时函数,延时时间为DELAYEDP.5毫秒0-100毫秒的延时***************************************** /DELAY_MS:MOV R7QELAYEDD1: MOV R6,#0F8HD2: DJNZ R6,D2DJNZ R7,D1RET广****************************************延时函数,延时时间为DELAYED*2微秒0-500微秒的延时***************************************** /DELAY_US:MOV R乙ADU1:DJNZ R7,DU1RET。

LCD1602控制C语言编程讲解

LCD1602控制C语言编程讲解

LCD1602之msp430单片机和C51单片机C语言/**************************************************************************/1.msp430单片机C语言/*************************************************************************/#include"msp430f6638.h"/*******************************************P5.3----E P57 P56 P55 P54 P53 P52 P51 P50P5.4----RSP5.5----RW P57 P56 RW RS E P52 P51 P50P2OUT---wdata********************************************/#define uchar unsigned char;#define uint unsigned int;//*********显示字符串可将字符串放入数组,例如显示ancd efdg******//**定义一个数组**//**uchar code ttt[]="ancd efdg";//字符串用双引号引起来,空格计入字符串的元素/*uchar code kkk[]="ffba ggddmm";//上句加空格9个元素,该句加两个空格12个元素/**********************************元素个数在循环显示时要使用*****/*********************为循环显示字符串还得定义一个变量**/// uchar n;/定义变量nvoid delay(int time) //延迟函数{while(time--); //延迟时间}void writeCommandLcd(unsigned char comd)// 写入命令{P5OUT &= ~0x10; //RS清0 (运算后P5=xxx0 xxxx,即RS=0其他位状态不变) P5OUT &= ~0x20; //RW清0 (运算后P5=xx0x xxxx, 即RW=0其他位状态不变) P5OUT &= ~0x08; //使能E清0 (运算后P5=xxxx 0xxx, 即E=0其他位状态不变)//上面三个语句执行完后P5OUT=xx000xxx,用P5OUT&=~0x38;可一次完成。

51单片机控制1602LCD显示程序

51单片机控制1602LCD显示程序

LCD显示电路#include<reg51.h>sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚#define Lcd_Data P0#include <string.h>#include<intrins.h> //包含_nop_()函数定义的头文件unsigned char code string1[ ]={0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符void Lcd_delay1ms() // 函数功能:延时1ms//注:不同单片机不同晶振需要对此函数进行修改{ unsigned char i,j;for(i=0;i<90;i++)for(j=0;j<33;j++);}void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n{ unsigned int i;for(i=0;i<n;i++)Lcd_delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。

result=1,忙碌;result=0,不忙***************************************************/bit Lcd_BusyTest(void)bit result;RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF; //将忙碌标志电平赋给resultE=0;return result;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/void Lcd_WriteCom (unsigned char dictate){ while(Lcd_BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置ぜ? _nop_();_nop_(); //空操作两个机器周期,给硬件反应时间Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址x入口参数:注:此函数已经加上了0x80,故只需写上实际地址就行***************************************************/void Lcd_WriteAddress(unsigned char x){ Lcd_WriteCom(x|0x80); //显示位置的确定方法规定为80H+地址码x/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/void Lcd_WriteData(unsigned char y){while(Lcd_BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(写指令时就是让E从0到1发生正跳变所以应先置ぜ?Lcd_Data=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/void Lcd_Int(void){Lcd_delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间Lcd_WriteCom(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口Lcd_delay(5); //延时5msLcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);设置模式次写9// Lcd_WriteCom(0x38);Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x38); //9次写设置模式Lcd_delay(5);Lcd_WriteCom(0x0C); //显示模式设置:显示开,有光标,光标闪烁Lcd_delay(5);Lcd_WriteCom(0x06); //显示模式设置:光标右移,字符不移Lcd_delay(5);Lcd_WriteCom(0x01); //清屏幕指令,将以前的显示内容清零Lcd_delay(5); }void hanying_show(void){unsigned char Lcd_i;Lcd_WriteCom(0x01);//清显示:清屏幕指令Lcd_delay(2);Lcd_WriteAddress(0x00); // 设置显示位置为最左侧Lcd_delay(2);Lcd_i=0;while(string1[Lcd_i]!='\0') //'\0'是数组结束标志需先将字符存入{Lcd_WriteData(string1[Lcd_i]); // 显示字符Lcd_i++;Lcd_delay(4);}}void main(){Lcd_Int(); //1602初始化while(1){hanying_show();}}。

51单片机计算器1602显示程序

51单片机计算器1602显示程序
{
delay_jsq(5);
if(P2!=0xfb)
{
if(P2!=0xfb)
{
temp=P2&0xf0;
switch(temp)
{
case 0xe0:num=8;
break;
case 0xd0:num=9;
break;
case 0xb0:num=10;
break;
case 0x70:num=11;
case 0x70:num=7;
break;
}
}
while(P2!=0xfd);
if(j!=0)
{
write_lcd1602(0x01,0);
delay(1);
j=0;
}
if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'
{
if(flag1==0)//没有按过符号键
break;
}
}
}
}
void main()
{
ini_lcd1602();
while(1)
{
keyscan_4_4();
}
}
write_lcd1602(0x06,0);
delay(1);
write_lcd1602(0x01,0);
delay(1);
num_1=0;
i=0;
j=0;
a=0; //第一个参与运算的数
b=0; //第二个参与运算的数
c=0;
flag1=0; //flag1表示是否有符号键按下,
fuhao=0; // fuhao表征按下的是哪个符号

LCD1602显示~~C程序

LCD1602显示~~C程序

1、关于1602液晶的电气参数一般市场上的1602液晶使用的驱动器为HD44780U或HD44780S,市场上大部分液晶用的是后者。

HD44780S的供电电压为5V±10%,而HD44780U 的供电电压为2.7V~5.5V。

也就是说,绝大部分1602液晶只能工作在5V 电压下,其供电电压必须为5V。

经过试验发现,1602液晶的供电虽然必须为5V,但其控制总线和数据总线可以用3.3V电平(因为对于TTL电平,一般大于2.5V以上都算高电平,不过最可靠的是大于3.6V),只不过在3.3V 电平下,数据的通信速度会大大降低,这一点需要在写驱动时注意。

需要时,可以将MCU的IO配置为漏极开路方式,用上拉电阻拉到5V电平;实在不能配置为漏极开路方式时,请查阅MCU的电气参数,在允许的条件下,直接使用电阻弱上拉也可以。

2、硬件连接1602液晶可以使用4位或8位通信模式,通信可以是双向的或单向的,双向通信主要是为了读取LCD忙标志和AC地址寄存器和DDRAM和CGRAM中的值,一般用处不大,因为1602不支持点阵绘图功能。

在连接时,注意4位通信方式下,LCD只使用DB7~DB4,一般情况下会使用MCU 某端口的高4位或低4位与之连接,注意写驱动时在必要的情况下对端口的其它几位要保护,防止破坏其数据;当然如果没有使用其它4位时则不必要保护(奇怪,不使用其它4位干嘛用4位通信方式嘛?)。

还要注意的是,如果需要双向通信,则必须选择既能做输入又能做输出的IO口,特别是对于RS、RW和E这三条控制线,若能选择支持位寻址的IO口则可以方便编程。

3、底层驱动问题通用1602液晶的时序如图:(1)、写时序(2)、读时序总的说来,按照这个时序图来编写驱动程序是不会出什么问题的,只是要深刻理解时序图中各参数的涵义。

编程中要特别关注E这根控制线。

写操作的时序应该是:①、RS=0(写指令寄存器)或RS=1(写数据寄存器);②、RW=0(写操作);③、将数据写到数据线上;④、E=1;⑤、E=0 。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
所谓 1602 是指显示的内容为 16*2,即可以显示两行,每行 16 个字符。目前市面 上字符液晶绝大多数是基于 HD44780 液晶芯片的,控制原理是完全相同的,因此基于 HD44780 写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
背光,黑色字体)
1602 液晶的正面(绿色
光,黑色字体)
“study up”程序中没有用到忙检测,而是用的是延时函数来替代忙检测
#include<reg52.h> //包含头文件,这个嘛,就不用多说了~~
#define uint unsigned int //预定义一下
#define uchar unsigned char sbit rs=P3^5; //1602 的数据/指令选择控制线
3.进入模式设置指令
功能:设定每次定入 1 位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。 参数设定的情况如下数据后光标左移 1=写入新数据后光标右移 0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右移 1 个字
4.显示开关控制指令
功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:
位名
设置
D
0=显示功能关
1=显示功能开
C
0=无光标
1=有光标
B
0=光标闪烁
1=光标不闪烁
5.设定显示屏或光标移动方向指令
功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下:
S/C
R/L
设定情况
0
0
光标左移 1 格,且 AC 值减 1
0
1
光标右移 1 格,且 AC 值加 1
1
0
显示器上字符全部左移一格,但光标不动
1.清屏指令
功能:<1> 清除液晶显示器,即将 DDRAM 的内容全部填入"空白"的 ASCII 码 20H; <2> 光标归位,即将光标撤回液晶显示屏的左上方; <3> 将地址计数器(AC)的值设为 0。
2.光标归位指令
功能:<1> 把光标撤回到显示器的左上方; <2> 把地址计数器(AC)的值设置为 0; <3> 保持 DDRAM 的内容不变
来的数据或指令; 当 BF=0 时,液晶显示器可以接收单片机送来的数据或指令;
<2> 读取地址计数器(AC)的内容。
10.数据写入 DDRAM 或 CGRAM 指令一览
功能:<1> 将字符码写入 DDRAM,以使液晶显示屏显示出相对应的字符; <2> 将使用者自己设计的图形存入 CGRAM。
11.从 CGRAM 或 DDRAM 读出数据的指令一览
功能:读取 DDRAM 或 CGRAM 中的内容。
基本操作时序:
读状态
输入:RS=L,RW=H,E=H
输出:DB0~DB7=状态字
写指令
输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码
输出:无
读数据
输入:RS=H,RW=H,E=H
输出:DB0~DB7=数据
写数据
输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据
1602 液晶背面(绿色背
背光白色字体
另一种 1602 液晶模块,显示屏是蓝色
字符型 LCD1602 通常有 14 条引脚线或 16 条引脚线的 LCD,多出来的 2 条线是 背光电源线 VCC(15 脚)和地线 GND(16 脚),其控制原理与 14 脚的 LCD 完全一样,引脚 定义如下表所示:
功能:设定下一个要存入数据的 CGRAM 的地址。 8.设定 DDRAM 地址指令
功能:设定下一个要存入数据的 CGRAM 的地址。 (注意这里我们送地址的时候应该是 0x80+Address,这也是前面说到写地址命令的时候要 加上 0x80 的原因)
9.读取忙信号或 AC 地址指令
功能:<1> 读取忙碌信号 BF 的内容,BF=1 表示液晶显示器忙,暂时无法接收单片机送
0x20~0x7F 为标准的 ASCII 码,0xA0~0xFF 为日文字符和希腊文字符,其余字 符码(0x10~0x1F 及 0x80~0x9F)没有定义。
那么如何对 DDRAM 的内容和地址进行具体操作呢,下面先说说 HD44780 的指令 集及其设置说明,请浏览该指令集,并找出对 DDRAM 的内容和地址进行操作的指令。共 11 条指令:
这就是我做测试用的最小系统,单片机是 STC89C516,晶振为 12M。液晶为蓝底 白字的那种 1602。
当我们硬件连接错误,或者程序错误时就会出现下图这种情况,就是上排显示 16 的 白色的块(蓝底黑字的液晶则显示的是 16 个黑块)。
下面我们来驱动 1602 吧在 1602 的上排显示“LCD1602 check ok”下排显示
1602 液晶模块内部的字符发生存储器(CGROM)已经存储了 160 个不同的点阵字 符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文 假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是 01000001B (41H),显示时模块把地址 41H 中的点阵字符图形显示出来,我们就能看到字母“A”
输出:无
呵呵,看到这么多的控制指令希望你没有头晕。其实这么多的指令刚开始的时候没 有必要全部掌握,随着学习的深入可以再尝试去用更复杂的控制指令。下面让我们一起驱动 1602 的液晶吧。下面是我的液晶的连接图,用的是那种蓝底白字的液晶,其实蓝底白字和 那种绿底黑字的液晶唯一的区别就是颜色的问题,至于用哪种液晶,就看各位自己的喜好 咯。
DDRAM 地址与显示位置的对应关系
(事实上我们往 DDRAM 里的 00H 地址处送一个数据,譬如 0x31(数字 1 的代码) 并不能显示 1 出来。这是一个令初学者很容易出错的地方,原因就是如果你要想在 DDRAM 的 00H 地址处显示数据,则必须将 00H 加上 80H,即 80H,若要在 DDRAM 的 01H 处 显示数据,则必须将 01H 加上 80H 即 81H。依次类推。大家看一下控制指令的的 8 条: DDRAM 地址的设定,即可以明白是怎么样的一回事了)
HD44780 内置了 DDRAM、CGROM 和 CGRAM。 DDRAM 就是显示数据 RAM,用来寄存待显示的字符代码。共 80 个字节,其地址 和屏幕的对应关系如下表:
也就是说想要在 LCD1602 屏幕的第一行第一列显示一个"A"字,就要向 DDRAM 的
00H 地址写入“A”字的代码就行了。但具体的写入是要按 LCD 模块的指令格式来进行的, 后面我会说到的。那么一行可有 40 个地址呀?是的,在 1602 中我们就用前 16 个就行了。 第二行也一样用前 16 个地址。对应如下:
for(m=0;m<16;m++) //将 table[]中的数据依次写入 1602 显示
{
lcd_wdat(table[m]);
delay(200);
} lcd_wcom(0x80+0x44); //重新设定显示地址为 0xc4,即下排第 5 位 for(n=0;n<8;n++) //将 table1[]中的数据依次写入 1602 显示
{ rs=1;
//选择数据寄存器
rw=0;
//选择写
P2=dat; delay(5); en=1;
//把要显示的数据送入 P2 //延时一小会儿,让 1602 准备接收数据
//使能线电平变化,数据送入 1602 的 8 位数据口
en=0;
} void lcd_init()
//1602 初始化函数
{ lcd_wcom(0x38); lcd_wcom(0x0c); lcd_wcom(0x06); lcd_wcom(0x01);
{ rs=0;
//选择指令寄存器
rw=0;
//选择写
P2=com;
//把命令字送入 P2
delay(5);
//延时一小会儿,让 1602 准备接收数据
en=1;
//使能线电平变化,命令送入 1602 的 8 位数据口
en=0;
} void lcd_wdat(uchar dat)
//1602 写数据函数
1602 字符液晶在实际的产品中运用的也比较多了,前几天留意了一下,发现宿舍门 前的自动售水机就是采用的 1602 液晶进行显示的。而且对于单片机的学习而言,掌握 1602 的用法是每一个学习者必然要经历的过程。在此,我将使用 1602 过程中遇到的问题以及感 受记录下来,希望能够给初学者带来一点指导,少走一点弯路。
//8 位数据,双列,5*7 字形 //开启显示屏,关光标,光标不闪烁 //显示地址递增,即写一个数据后,显示位置右移一位 //清屏
} void main()
//主函数
{
uchar n,m=0;
lcd_init();
//液晶初始化
lcd_wcom(0x80); //显示地址设为 80H(即 00H,)上排第一位
阿拉教你轻松学 51 系列(作者:就抽精品)
发布: 2010-2-05 16:03 | 作者: tiankai | 来源: 电子园 51 单片机学习网
阿拉教你轻松学 51--------液晶篇(1602)
写在开始:(借此灌下水^_^ ) 之前,发了一个帖子,大意是看见杀手和水剑写的帖子,心 里也痒痒了,想写一写以前学习单片机过程中的一些经历,希望能给大家一点参考。无奈最 近时间很是紧张,因此,一直都没能着手整理。本打算星期六写的,但是接到一个朋友的电 话,说想买 CPLD 的开发板。于是,计划被迫打乱,只好先陪他去电子市场买板子。回来 之后,虽然头很晕(坐车的原因),但是不能再拖了,否则留给大家一个只说不做的印象就不 好了。虽然头晕,但是下面的写出来的东西可不晕。OK,LET’S GO !
相关文档
最新文档