1602液晶4位接口

合集下载

4根IO口线驱动1602(带PWM调光)

4根IO口线驱动1602(带PWM调光)

4根IO口线驱动1602(带PWM调光)呵呵,不用我说你们也知道为什么只需要4根线:因为咱用了74hc595啊!因为74HC595最近我手里一抓一大把。

但是STC的单片机IO口紧缺。

就算使用4线驱动模式也要8个IO(还要算上背光PWM)。

这一次我几乎做到了他的一半。

如果不用PWM的话。

大概只需要3个IO,如果需要PWM就四个罗。

MCU当然是老掉牙的死特惨89C52罗~画原理图实在是不方便。

就不画了。

另外求酷~也可以在595后面级联类似三极管开关……继电器之类的玩意。

当然友情提醒,别超过4个595.否则速度会慢的可怕。

我现在1个595.写1602都可以丢掉延时函数了。

这一次硬件设计的比较简单,但是IO全反了。

所以需要占用额外的CPU时间修正,但是毕竟方便洞洞板嘛。

还有大家别看到我给A和B赋了好几次值而去“优化”代码。

如果您“优化”的话,那么就根本驱动不起来,因为51的加法减法乘除都要经过ACC和B,如果不去重新赋值的话,那么就会发生改变的现象。

不过我这种位寻址软件修正可比那种xx=xx & xx的效率高多了。

如果我这么写的话。

恐怕刷一个屏幕没1秒下不来啊。

12T的51就这个速度……不过这一次焊板子实在是太仓促了。

对比度电位器焊在液晶下面,结果初始化成功了显示两排方块。

晕了半天。

调试半天还是没用。

后来捅了一下背面就好了……晕……!上代码:#include <stc89c5x.h>//STC89C52//串行驱动1602,powered by 595#define LCD1602_BACKLIGHT P1_3//背光#define LCD1602_SDA P1_0//数据输入#define LCD1602_SCK P1_1//移位时钟,SHCP,11pin#define LCD1602_SCL P1_2//锁存时钟,STCP,12pin/** 硬件连接:* 74HC595 Q7 - 1602 RS* GND - 1602 RW(595没有输入功能,所以判定忙只能靠延时,另外就是MCU的速度比较的慢。

基于AT89s52单片机1602四位数据口液晶显示

基于AT89s52单片机1602四位数据口液晶显示

//*****************************************************************/*程序功能:显示两行字符并且整屏左移(程序使用在接口为4位的1602液晶)涉及芯片:1602液晶显示器*///*****************************************************************#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit rs=P2^0;//数据/命令选择端(H/L)sbit rw=P2^1;//读/写选择端(H/L)sbit en=P2^2; //使能选择端uchar code mingzi[]="Gci fa zhi !_! "; //定义数据mingzi【】uchar code num[]="tel:10778434282 "; //定义数组num【】void delay(uint time)//延时函数(运行的时间与晶振有关系){uint i,j;for(i=time;i>0;i--)for(j=110;j>0;j--);}void write_com(uchar mingling)//命令输入函数{uchar gao,di; //定义高、低四位gao=mingling&0xf0;//分出高四位di=(mingling<<4)&0xf0;//分出低四位//==========================================读走高四位P2=gao;//让数据(mingling)高四位有效rs=0;//rs端为低电平时,为接收命令delay(5);en=1; //en一个高脉冲读走高四位数据(mingling)delay(5);en=0;//把使能端拉回低电平//============================================读走低四位delay(5);P2=di;//让数据(mingling)低四位有效rs=0;//rs端为低电平时,为接收命令delay(5);en=1 ;//en一个高电平读走低四位命令(mingling)delay(5);en=0;//把使能端拉回低电平}void write_date(uchar shuju)//数据输入函数{uchar gao,di;gao=shuju&0xf0;//分出高四位di=(shuju<<4)&0xf0;//分出低四位//=======================================读走高四位P2=gao;//让数据(shuju)高四位有效rs=1;//rs端为高电平时,为接收数据delay(5);en=1;//en一个高电平读走低四位数据(shuju)delay(5);en=0;//把使能端拉回低电平//============================================读走低四位delay(5);P2=di;//让数据(shuju)低四位有效rs=1;//rs端为高电平时,为接收数据delay(5);en=1;//en一个高电平读走低四位数据(shuju)delay(5);en=0;//把使能端拉回低电平}void chushihua(){rw=0;//把数据/命令选择端先置为零en=0;//把使能端先置为零write_com(0x28);//设置16*12显示,5*7点阵,4位数据接口write_com(0x01);//清屏write_com(0x0c);//显示开启,不显示光标write_com(0x06);//整屏不移动}void main()//主函数{uint i,j;chushihua();//对液晶初始化while(1)//死循环{write_com(0x80);for(i=0;i<16;i++){write_date(mingzi[i]);}write_com(0x80+0x40);for(j=0;j<16;j++){write_date(num[j]);}write_com(0x18);//写控制字,在英文文档里介绍。

lcd1602显示屏的选择方案

lcd1602显示屏的选择方案

lcd1602显示屏的选择方案
选择LCD1602显示屏的方案需要考虑以下因素:
1. 接口类型:LCD1602显示屏一般使用并行接口(如8位或4位并行接口)或者I2C接口。

根据你的硬件平台和需求,选择适合的接口类型。

2. 驱动板选择:LCD1602显示屏通常需要一个驱动板连接到单片机或者开发板上,用于控制显示内容。

可以选择购买带有已集成驱动功能的整合板,也可以根据自己的需求自行设计驱动板。

3. 供电电压和电流:确认LCD1602显示屏的供电电压和电流要求,以确保你的系统能够提供足够电源支持。

4. 显示效果和背光:LCD1602显示屏通常带有自身的背光功能,可以选择带有背光或者不带背光的显示屏,根据需要选择合适的显示效果。

5. 底层驱动代码和库函数:确保选择的LCD1602显示屏有对应的底层驱动代码或者库函数,以便于你能够方便地在你的开发环境中使用。

在选择LCD1602显示屏时,可以参考供应商的产品手册和规格说明,同时也可以咨询相关的技术支持或者经验丰富的开发者,以确保选择的方案能够满足你的需求。

51单片机驱动1602液晶(4线串行)

51单片机驱动1602液晶(4线串行)

51单片机驱动1602液晶(4线串行) 2015-06-26 12:04:01 来源:51hei关键字:51单片机1602液晶4线串行/*单片机I/O 口使单片机资源的重要组成部分,也是用来扩展外围设备的必选资源,尽可能以更少的I/O口实现更多的功能是单片机工程师追求的目标,现在的一些串行器件也为这一目标的实现添加了更多的可能性,比如I2C总线,MAXIM力推的1-WIRE等等,都可以以很少的I/O口实现更多的功能,当然这是以降低一定的速度为代价的。

废话少说,进入正题。

显示器件多见的是LED数码管,LCD液晶屏等。

一般的数码管成本低廉,在显示内容要求不多的时候适用;LCD液晶屏以更多的显示空间得到了许多人的爱好,不过成本上要高的多(市场价在20元左右),本文以LCD1602为例说明如何驱动液晶屏。

LCD1602外接的控制接口有RS,R/W,E;数据接口为DB7--DB0。

总共有11跟线与单片机的I/O口连接,若使用标准的51单片机,至少占用了一个端口再加上另一个端口的部分I/O口。

这再很多应用场合是不大可取的。

所以很有必要减少连接数。

从其数据手册上介绍的4线连接方式可以达到只使用7个I/O口即可满足要求,其中为3个控制口RS,R/W,E和数据口的DB7--DB4;写入数据或指令的顺序是先写高半个字节,再写低半个字节。

其中P0口的高四位接到LCD1602的DB7-DB4,P3.0-P3.1分别接RS,R/W,E;下面给出驱动源程序*/#include <reg52.h>#include "intrins.h"#define uint unsigned int#define uchar unsigned char#define TRUE 1#define FALSE 0#define nop _nop_()#define PtData P0 //定义连接口线,#define PtContr P3sbit RS="PtContr"^0;sbit RW="PtContr"^1;sbit E="PtContr"^2;void InitialLcd();void WriteLcdInstr(uchar);void WriteLcdData(uchar);void CheckLcdBusy();uchar HexToDdram(uchar);void Delay(unsigned int);main(){Delay(1000);InitialLcd();WriteLcdInstr(0x80); WriteLcdData('e');WriteLcdData('l');WriteLcdData('k');WriteLcdData('e');WriteLcdData('l');WriteLcdData('i');WriteLcdData('k');WriteLcdData('e');WriteLcdInstr(0xc0); WriteLcdData('L');WriteLcdData('C');WriteLcdData('D');WriteLcdData('1');WriteLcdData('6');WriteLcdData('0');WriteLcdData('2');while(1){WriteLcdInstr(0x0f);Delay(30000);WriteLcdInstr(0x08);Delay(40000);}}//----------------LCD1602函数---------------------////---初始化void InitialLcd(){Delay(600);//延时应大于15ms,不同的晶振使需要修改,本程序再6M下调试通过RS=0;RW=0;nop;E=0;nop;E=1;nop;PtData=0x20;//nop;E=0;Delay(200);//延时应大于4.1msE=1;nop;PtData=0x20;//nop;E=0;Delay(5);//延时应大于100usE=1;nop;PtData=0x20;//nop;E=0;//设置4位操作;WriteLcdInstr(0x01);//清屏WriteLcdInstr(0x28);//设置4位操作,1行显示,5x8WriteLcdInstr(0x02);//光标归位WriteLcdInstr(0x06);//AC自动加1,画面不动WriteLcdInstr(0x0f);//0x0f:光标闪烁开;}//---写指令void WriteLcdInstr(uchar Temp){CheckLcdBusy();RS=0;RW=0;E=0;nop;PtData=Temp;nop;E=0;nop;E=1;nop;PtData=(Temp<<4);nop;E=0;nop;}//---写数据void WriteLcdData(uchar Temp) {CheckLcdBusy();RS=1;RW=0;E=0;nop;E=1;nop;PtData=Temp;nop;E=0;nop;E=1;nop;PtData=(Temp<<4);nop;E=0;nop;}//---查忙void CheckLcdBusy(){uchar Temp,t;PtData=0xff;RW=1;RS=0;nop;E=0;nop;do{nop;E=1;nop;Temp=PtData;nop;nop;nop;E=0;nop;nop;t=PtData;nop;nop;nop;E=0;nop;nop;Temp&=0x80;}while(Temp==0x80);}//---delayvoid Delay(unsigned int N) {unsigned int i;for(i=0;i<N;i++){i=i;}}。

超强的51+LCD1602控制(四位,八位控制),1602函数全集+写入字库

超强的51+LCD1602控制(四位,八位控制),1602函数全集+写入字库

风骚的51+LCD1602控制(四位,八位控制),1602函数全集+写入字库LCD1602写字库在文档后面。

LCD1602演示程序(很多函数哦)控制芯片为HD44780函数都是经过测试的,实物显示都通过了,呵呵,请大家放心使用^_^呵呵,支持四线数据接口模式,可以任意切换编程,只须改模式选择Port_Type_Select就可以咯!很方便的。

并且我说一下我的个人体会,希望大家在写程序的时候,最好考虑一下程序的可移植性,而且要方便更改参数和硬件资源的选择,最好使用条件编译,任意切换硬件资源,可以方便以后更改参数,就会省去以后不少的不必要的麻烦和错误以及宝贵的时间里面有标准测试,如果您觉得好的话,请您帮忙顶一下,,写出更好的功能函数。

先简单介绍一下功能函数吧:/*--------------------------------------------------------------*/ //模式选择(条件编译)#define Port_Type_Select 1 //=1, 选择八位数据模式//=0, 选择四位数据模式, LCD高四位接MCU端口高四位/*--------------------------------------------------------------*/ //函数声明void LCD_busy (void); //检测LCD是否忙void LCD_init (void); //LCD初始化void LCD_cmd (unsigned char cmd); //写入指令void LCD_dat (unsigned char dat); //写入数据void LCD_pos (unsigned char x, unsigned char y); //显示定位void LCD_printc(unsigned char x, unsigned char y, unsigned char c); //定位输出字符void LCD_prints(unsigned char x, unsigned char y, unsigned char *s); //定位输出字符串void LCD_printn(unsigned char x, unsigned char y, unsigned int num); //定位输出16位二进制数字unsigned char LCD_current_addr(void); //读出AC当前地址(DB6~DB0)或忙标志位DB7unsigned char LCD_current_addr_dat(void); //读出AC当前地址的数据unsigned char LCD_addr_dat(unsigned char x, unsigned char y); //读出AC指定地址的数据void LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat); //指定地址(x: 0-7)写入8bytes数据CGRAM/*-------------------------------------------------------------*///光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE LCD_cmd(0x18); //LCD显示左移一位#define LCD_RIGHT_MOVE LCD_cmd(0x1c); //LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE LCD_cmd(0x10); //光标左移一位#define LCD_CURSOR_RIGHT_MOVE LCD_cmd(0x14); //光标右移一位/*--------------------------------------------------------------*///设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON LCD_cmd(0x0c); //LCD开显示#define LCD_DISPLAY_OFF LCD_cmd(0x08); //LCD关显示#define LCD_CURSOR_ON LCD_cmd(0x0e); //光标显示#define LCD_CURSOR_OFF LCD_cmd(0x0c); //光标不显示#define LCD_CURSOR_BLINK_ON LCD_cmd(0x0f); //光标闪烁#define LCD_CURSOR_BLINK_OFF LCD_cmd(0x0e); //光标不闪烁#define LCD_GO_HOME LCD_cmd(0x02); //AC=0,光标、画面回HOME位, DDRAM内容不变#define LCD_CLR LCD_cmd(0x01); //LCD清屏, 清除DDRAM, 清除屏幕, 置AC为0, 光标回位?/*--------------------------------------------------------------*///工作方式设置#define LCD_DISPLAY8_DOUBLE_LINE LCD_cmd(0x38); //两行显示8-bits#define LCD_DISPLAY8_SINGLE_LINE LCD_cmd(0x30); //单行显示8-bits#define LCD_DISPLAY4_DOUBLE_LINE LCD_cmd(0x28); //两行显示4-bits#define LCD_DISPLAY4_SINGLE_LINE LCD_cmd(0x20); //单行显示4-bits/*--------------------------------------------------------------*///输入方式设置#define LCD_AC_AUTO_INCREMENT LCD_cmd(0x06); //数据读、写操作后,AC 自动加 1#define LCD_AC_AUTO_DECREASE LCD_cmd(0x04); //数据读、写操作后,AC自动减 1#define LCD_MOVE_ENABLE LCD_cmd(0x07); //数据读、写操作,画面平移#define LCD_MOVE_DISENABLE LCD_cmd(0x06); //数据读、写操作,画面不动以下是液晶驱动头文件:/*--------------------------------------------------------------*/ //File: LCD1602_8A.H//Time: 20:10//Modi: 09-5-17/*--------------------------------------------------------------*/ //防止被重复定义#ifndef __LCD1602_8A_H__#define __LCD1602_8A_H__/*--------------------------------------------------------------*/ //模式选择(条件编译)#define Port_Type_Select 1 //=1, 选择八位数据模式//=0, 选择四位数据模式, LCD高四位接MCU端口高四位#define Int_Transfer 1 //=1, 允许中断服务函数调用//=0, 不允许中断服务函数调用/*--------------------------------------------------------------*/ //LCD1602与单片机接口定义sfr LCD_IO = 0x80; //P0-0x80,P1-0x90,P2-0xA0,P3-0xB0;sbit LCD_RS = P2^0; //LCD数据/命令选择端(H/L)sbit LCD_RW = P2^1; //LCD 读/写选择端(H/L)sbit LCD_EN = P2^2; //LCD使能控制端/*--------------------------------------------------------------*/ //工作方式设置#define LCD_DISPLAY8_DOUBLE_LINE LCD_cmd(0x38); //两行显示8-bits #define LCD_DISPLAY8_SINGLE_LINE LCD_cmd(0x30); //单行显示8-bits #define LCD_DISPLAY4_DOUBLE_LINE LCD_cmd(0x28); //两行显示4-bits #define LCD_DISPLAY4_SINGLE_LINE LCD_cmd(0x20); //单行显示4-bits/*--------------------------------------------------------------*/ //输入方式设置#define LCD_AC_AUTO_INCREMENT LCD_cmd(0x06); //数据读、写操作后,AC 自动加 1#define LCD_AC_AUTO_DECREASE LCD_cmd(0x04); //数据读、写操作后,AC自动减 1#define LCD_MOVE_ENABLE LCD_cmd(0x07); //数据读、写操作,画面平移#define LCD_MOVE_DISENABLE LCD_cmd(0x06); //数据读、写操作,画面不动/*--------------------------------------------------------------*///设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON LCD_cmd(0x0c); //LCD开显示#define LCD_DISPLAY_OFF LCD_cmd(0x08); //LCD关显示#define LCD_CURSOR_ON LCD_cmd(0x0e); //光标显示#define LCD_CURSOR_OFF LCD_cmd(0x0c); //光标不显示#define LCD_CURSOR_BLINK_ON LCD_cmd(0x0f); //光标闪烁#define LCD_CURSOR_BLINK_OFF LCD_cmd(0x0e); //光标不闪烁#define LCD_GO_HOME LCD_cmd(0x02); //AC=0,光标、画面回HOME位, DDRAM内容不变#define LCD_CLR LCD_cmd(0x01); //LCD清屏, 清除DDRAM, 清除屏幕, 置AC为0, 光标回位?/*--------------------------------------------------------------*///光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE LCD_cmd(0x18); //LCD显示左移一位#define LCD_RIGHT_MOVE LCD_cmd(0x1c); //LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE LCD_cmd(0x10); //光标左移一位#define LCD_CURSOR_RIGHT_MOVE LCD_cmd(0x14); //光标右移一位/*--------------------------------------------------------------*///LCD1602地址相关/*#define LINE1_HEAD 0x80 //第一行DDRAM起始地址#define LINE2_HEAD 0xc0 //第二行DDRAM起始地址#define LINE1 0 //第一行#define LINE2 1 //第二行#define LINE_LENGTH 16 //每行的最大字符长度(40-DDRAM)/*--------------------------------------------------------------*/ //函数声明void LCD_busy (void); //检测LCD是否忙void LCD_init (void); //LCD初始化void LCD_cmd (unsigned char cmd); //写入指令void LCD_dat (unsigned char dat); //写入数据void LCD_pos (unsigned char x, unsigned char y); //显示定位void LCD_printc(unsigned char x, unsigned char y, unsigned char c); //定位输出字符void LCD_prints(unsigned char x, unsigned char y, unsigned char *s); //定位输出字符串void LCD_printn(unsigned char x, unsigned char y, unsigned int num); //定位输出16位二进制数字unsigned char LCD_current_addr(void); //读出AC当前地址(DB6~DB0)或忙标志位DB7unsigned char LCD_current_addr_dat(void); //读出AC当前地址的数据unsigned char LCD_addr_dat(unsigned char x, unsigned char y); //读出AC指定地址的数据void LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat); //指定地址(x: 0-7)写入8bytes数据CGRAM/*--------------------------------------------------------------*/ //读出AC当前地址(DB6~DB0)或忙标志位DB7#if Port_Type_Select //选择八位数据模式unsigned char LCD_current_addr(void){unsigned char ac_addr;LCD_EN = 0;LCD_RS = 0; //指令LCD_RW = 1; //读出LCD_IO = 0xff; //端口置为输入方式(P0)LCD_EN = 1;ac_addr = LCD_IO;LCD_EN = 0;return (ac_addr);}#else //选择四位数据模式unsigned char LCD_current_addr(void){unsigned char ac_addr;LCD_EN = 0;LCD_RS = 0; //指令LCD_RW = 1; //读出LCD_IO |= 0xf0; //端口置为输入方式(P0)LCD_EN = 1;ac_addr = LCD_IO & 0xf0; //高四位LCD_EN = 0;LCD_EN = 1;ac_addr |= LCD_IO >> 4; //低四位LCD_EN = 0;return (ac_addr);}#endif/*--------------------------------------------------------------*/ //检测LCD忙状态#if Int_Transfer //允许中断服务函数调用void LCD_busy(void){unsigned char ac_dat;unsigned char busy_flag;do{ac_dat = LCD_current_addr();busy_flag = ac_dat & 0x80;}while(busy_flag); //=1表示忙, =0表示空闲}#else //不允许中断服务函数调用void LCD_busy(void){unsigned char ac_dat;bit busy_flag;do{ac_dat = LCD_current_addr();busy_flag = (bit)(ac_dat & 0x80);}while(busy_flag); //=1表示忙, =0表示空闲}#endif/*--------------------------------------------------------------*/ //读出AC当前地址的数据#if Port_Type_Select //选择八位数据模式unsigned char LCD_current_addr_dat(void){unsigned char addr_dat;// unsigned char i;LCD_busy(); //或者检查忙最可靠// for(i = 0; i < 3; i++) //要连续读出三次才会有效{LCD_EN = 0;LCD_RS = 1; //数据LCD_RW = 1; //读出LCD_IO = 0xff; //端口置为输入方式(P0)LCD_EN = 1;addr_dat = LCD_IO;LCD_EN = 0;}return (addr_dat);}#else //选择四位数据模式unsigned char LCD_current_addr_dat(void){unsigned char addr_dat;// unsigned char i;LCD_busy(); //或者检查忙最可靠// for(i = 0; i < 3; i++) //要连续读出三次才会有效{LCD_EN = 0;LCD_RS = 1; //数据LCD_RW = 1; //读出LCD_IO |= 0xf0; //端口置为输入方式(P0)LCD_EN = 1;addr_dat = LCD_IO & 0xf0; //高四位LCD_EN = 0;LCD_EN = 1;addr_dat |= LCD_IO >> 4; //低四位LCD_EN = 0;}return (addr_dat);}#endif/*--------------------------------------------------------------*/ //写入指令#if Port_Type_Select //选择八位数据模式void LCD_cmd(unsigned char cmd){LCD_busy(); //检测忙LCD_RS = 0; //指令LCD_RW = 0; //写入LCD_EN = 1;LCD_IO = cmd; //传指令LCD_EN = 0; //下降沿有效}#else //选择四位数据模式void LCD_cmd(unsigned char cmd){LCD_busy(); //检测忙LCD_IO &= 0x0f; //清高四位LCD_RS = 0; //指令LCD_RW = 0; //写入LCD_EN = 1;LCD_IO |= cmd & 0xf0; //写高四位LCD_EN = 0; //下降沿有效cmd <<= 4; //低四位移到高四位LCD_IO &= 0x0f; //清高四位LCD_EN = 1;LCD_IO |= cmd & 0xf0; //写高四位LCD_EN = 0; //下降沿有效}#endif/*--------------------------------------------------------------*/ //写入数据#if Port_Type_Select //选择八位数据模式void LCD_dat(unsigned char dat){LCD_busy(); //检测忙LCD_RS = 1; //数据LCD_RW = 0; //写入LCD_EN = 1;LCD_IO = dat; //传数据LCD_EN = 0; //下降沿有效}#else //选择四位数据模式void LCD_dat(unsigned char dat){LCD_busy(); //检测忙LCD_IO &= 0x0f; //清高四位LCD_RS = 1; //数据LCD_RW = 0; //写入LCD_EN = 1;LCD_IO |= dat & 0xf0; //写高四位LCD_EN = 0; //下降沿有效dat <<= 4; //低四位移到高四位LCD_IO &= 0x0f; //清高四位LCD_EN = 1;LCD_IO |= dat & 0xf0; //写高四位LCD_EN = 0; //下降沿有效}#endif/*--------------------------------------------------------------*/ //显示定位DDRAMvoid LCD_pos(unsigned char x, unsigned char y){if(y) LCD_cmd(x|0xc0);//y=1第二行显示,y=0第一行显示0<=x<16(40-DDRAM)else LCD_cmd(x|0x80);//数据指针=80+地址码(00H~27H,40H~67H)}/*--------------------------------------------------------------*/ //指定地址(x: 0-7)写入8bytes数据CGRAMvoid LCD_pos_CG(unsigned char x, unsigned char *CGRAM_dat){unsigned char i;x <<= 3; //转化为6位数据的高三位x |= 0x40;LCD_cmd(x); //写入地址for(i = 0; i < 8; i++)LCD_dat(CGRAM_dat[i]); //写入数据}/*--------------------------------------------------------------*/ //读出AC指定地址的数据unsigned char LCD_addr_dat(unsigned char x, unsigned char y){unsigned char addr_dat;LCD_pos(x, y); //定位addr_dat = LCD_current_addr_dat(); //读出数据return (addr_dat);}/*--------------------------------------------------------------*/ //定位输出字符void LCD_printc(unsigned char x, unsigned char y, unsigned char c) {LCD_pos(x, y);LCD_dat(c);}/*--------------------------------------------------------------*/ //定位输出字符串void LCD_prints(unsigned char x, unsigned char y, unsigned char *s) {LCD_pos(x, y);while(*s){LCD_dat(*s);s++;}}/*--------------------------------------------------------------*/ //定位输出16位二进制数字// 0<= num <65536void LCD_printn(unsigned char x, unsigned char y, unsigned int num) {char i;unsigned char ii;unsigned char dat[6];for(i = 0; i < 6; i++) dat[i] = 0; i = 0; //初始化数据while(num / 10) //拆位{dat[i] = num % 10; //最低位num /= 10; i++;}dat[i] = num; //最高位ii = i; //保存dat的位数for(; i >= 0; i--) dat[i] += 48; //转化成ASCIILCD_prints(x, y, " "); //清显示区域LCD_pos(x, y);for(i = ii; i >= 0; i--) LCD_dat(dat[i]); //输出数字字符}/*--------------------------------------------------------------*/ //LCD初始化void LCD_init(void){#if Port_Type_Select //选择八位数据模式LCD_DISPLAY8_DOUBLE_LINE //设置LCD为16X2显示,5X7点阵,八位数据接口#elseLCD_DISPLAY4_DOUBLE_LINE //设置LCD为16X2显示,5X7点阵,四位数据接口#endifLCD_AC_AUTO_INCREMENT //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)LCD_DISPLAY_ON //LCD开显示及光标设置(光标不闪烁,不显示"_") LCD_CLR //清屏}/*--------------------------------------------------------------*/ [原创] 液晶1602 显示汉字研究液晶, 汉字, 研究1602是一款最常用也是最便宜的液晶显示屏。

1602 四位模式

1602 四位模式

调试单片机程序时很多时候如果有显示器件的话会方便很多,本人就喜欢调试的时候用LCD1602显示某些重要的变量,但1602与单片机连接的端口多大11个,再加上其他电源端就多达16个端口,使用起来很不方便。

经查阅相关手册后发现1602有4总线模式,一下就省下了4个端口,然后RW端口的写功能就一定要用,而它的读功能往往只是用来读忙而已,而读忙往往可以用延迟来取代,也就是说RW端口我们只用写功能,所以RW可以一直接地,这样就又省下一个端口,然后再把各个接地端和接电源端合起来做成一个只有8个接口的液晶小底座,用起来非常的方便,甚至可以像USB那样即插即用以下是基于atmega系列的驱动程序/************AVR Studio+Gcc编译通过**************/#include<avr/io.h>#include<util/delay.h>/**************端口定义******************/#define LCD_PORT_DAT PORTA //不同的硬件设计只需改动一下8行即可使用#define LCD_PORT_RS PORTA#define LCD_PORT_EN PORTA#define LCD_DDR_DAT DDRA#define LCD_DDR_RS DDRA#define LCD_DDR_EN DDRA#define LCD_RS PA2#define LCD_EN PA3/******************************************************************************* ****/#define RS_SET (LCD_PORT_RS|=_BV(LCD_RS))#define RS_CLR (LCD_PORT_RS&=~_BV(LCD_RS))#define EN_SET (LCD_PORT_EN|=_BV(LCD_EN))#define EN_CLR (LCD_PORT_EN&=~_BV(LCD_EN))#define LCD_DAT 1#define LCD_CMD 0/******************************************************************************* **/void lcd_write(unsigned char style,unsigned char input) //写字节{_delay_us(48);LCD_DDR_DAT|=0xF0;if(style) RS_SET;else RS_CLR;EN_SET;LCD_PORT_DAT&=0x0F;LCD_PORT_DAT|=input&0xF0;EN_CLR;EN_SET;LCD_PORT_DAT&=0x0F;LCD_PORT_DAT|=(input<<4)&0xF0;EN_CLR;_delay_us(48);}/******************************************************************************* **/ //初始化void lcd_init(){LCD_DDR_RS|=_BV(LCD_RS);LCD_DDR_EN|=_BV(LCD_EN);LCD_DDR_DAT|=0xF0;EN_CLR;lcd_write(LCD_CMD,0x2C); //这些控制命令的意义可查阅1602的手册lcd_write(LCD_CMD,0x2C);lcd_write(LCD_CMD,0x0C);lcd_write(LCD_CMD,0x06);lcd_write(LCD_CMD,0x01);lcd_write(LCD_CMD,0x80);_delay_ms(16);_delay_ms(16);}/******************************************************************************* **/void lcd_gotoxy(unsigned char x,unsigned char y) //坐标定位{if(y==0) lcd_write(LCD_CMD,0x80|x);if(y==1) lcd_write(LCD_CMD,0x80|(x-0x40));}/******************************************************************************* **/void lcd_print(unsigned char *str) //显示字符串{while(*str!='\0'){lcd_write(LCD_DAT,*str);str++;}}/******************************************************************************* **/void lcd_write_string(unsigned char x,unsigned char y,unsigned char *str) //在指定坐标显示字符串{lcd_gotoxy(x,y);lcd_print(str);}/******************************************************************************* **/void lcd_write_3num(unsigned char x,unsigned char y,unsigned char temp) //在指定坐标显示一个0~255的数{lcd_gotoxy(x,y);if(temp>=100)lcd_write(LCD_DAT,0x30+temp/100);else lcd_write(LCD_DA T,0x20);lcd_write(LCD_DA T,0x30+temp/10%10);lcd_write(LCD_DA T,0x30+temp%10);}/******************************************************************************* **/void lcd_write_4num(unsigned char x,unsigned char y,unsigned int temp) //在指定坐标显示一个0~9999的数{lcd_gotoxy(x,y);if(temp>=1000)lcd_write(LCD_DAT,0x30+temp/1000%10);else lcd_write(LCD_DA T,0x20);lcd_write(LCD_DA T,0x30+temp/100%10);lcd_write(LCD_DA T,0x30+temp/10%10);lcd_write(LCD_DA T,0x30+temp%10);}使用前需调用一次初始化函数lcd_init()在(0,0)显示字符串ASDF :lcd_write_string(0,0,"ASDF"); 在(0,1)显示1234 :lcd_write_4num(0,1,1234);移动当前光标到(2,1) :lcd_gotoxy(2,1);。

LCD1602和LCD12864液晶四位显示

LCD1602和LCD12864液晶四位显示
0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x20,
0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xF0,0x40,
0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x14,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF2,0xFE,
uchar codestr3[] = {"LCD12864四位"};
uchar code dis4[] = {"交流QQ:812549630 "};
uchar code table1[]={//自定义字库
0x02,0x00,0x03,0x80,0x03,0x83,0xFF,0xFF,0xFF,0xFF,0xC3,0x83,0xFF,0xFF,0xFF,0xFF,
EN=1;
delay1(5);
EN=0;
P0=0x90|(dat & 0x0f); //送低四位数据到P0口,同时保持P0高四位。
EN=1;
delay1(5);
EN_0;
}
//lcd初始化程序
void lcdinit()
{delay1(30);
W_com(0x02);//光标归位
W_com(0x28);//四位传输
本文利用LCD1602和LCD12864均具有的四位显示方式,将8位数据分成高四位和低四位分时传输,将单片机的低四位与液晶屏的高四位连接,将单片机的高四位与RS、RW和E三个控制引脚连接,完成了只用单片机一个端口即可完成显示任务,给设计带来极大的方便。

lcd1602引脚

lcd1602引脚

LCD1602引脚引言LCD1602是一种常用的字符型液晶显示屏,广泛应用于各种嵌入式系统和电子设备中。

了解LCD1602的引脚功能和连接方式,对于使用LCD1602进行字符显示及与其他电路进行适配十分重要。

本文将介绍LCD1602的引脚定义及其功能。

引脚定义LCD1602通常具有16个引脚,其中8个引脚用于数据传输,3个引脚用于控制,1个引脚用于背光控制,另外4个引脚用于电源和地。

以下是LCD1602的引脚定义及其功能:1.VSS:接地,用于提供电源回路的地。

lcd1602_pinlcd1602_pin2.VDD:电源正极,用于提供LCD1602的工作电压,通常为5V。

3.V0:液晶偏置控制引脚,通过调节V0的电压可以控制液晶显示的对比度。

4.RS:寄存器选择引脚,用于区分命令和数据的传输。

当RS为高电平时,表示传输的是数据;当RS为低电平时,表示传输的是命令。

5.RW:读写控制引脚,用于选择读取还是写入LCD。

当RW为高电平时,表示读取;当RW为低电平时,表示写入。

6.E:使能引脚,用于控制数据的写入和读取操作。

当E从低电平变为高电平时,表示数据有效。

7.D0-D7:数据引脚,共有8个引脚。

用于数据传输,通过这些引脚将要显示的字符或命令传输给LCD1602。

8.A:背光控制引脚,通过控制A引脚的电平,可以控制LCD1602的背光亮度。

通常将A连接到电源正极,以使背光始终亮起。

引脚连接为了正确使用LCD1602,需要将其引脚连接到相应的控制器或微控制器。

下面是一种常见的LCD1602引脚连接方式:1.将VSS接地,将VDD连接到5V电源。

2.将V0通过一个可变电阻器连接到地,调节电阻器的值以调整液晶显示的对比度。

3.将RS引脚连接到控制器的一个使能引脚,用于选择数据或命令传输。

4.将RW引脚连接到控制器的一个GPIO引脚,用于选择读取或写入操作。

5.将E引脚连接到控制器的一个GPIO引脚,用于控制数据的写入和读取操作。

LCD1602液晶显示总结

LCD1602液晶显示总结

LCD1602液晶显示应用总结一、1602里面存储器有三种:CGROM、CGRAM、DDRAMCGROM保存了厂家生产时固化在LCM中的点阵型显示数据;CGRAM是留给用户自己定义点阵型显示数据的;DDRAM则是和显示屏的内容对应的。

1602内部的DDRAM有80字节,而显示屏上只有2行×16列,共32个字符,所以两者不完全一一对应。

默认情况下,显示屏上第一行的内容对应DDRAM中80H到8FH的内容,第二行的内容对应DDRAM 中C0H到CFH的内容。

DDRAM中90H到A7H、D0H到E7H 的内容是不显示在显示屏上的,但是在滚动屏幕的情况下,这些内容就可能被滚动显示出来了。

注:这里列举的DDRAM的地址准确来说应该是DDRAM地址+80H 之后的值,因为在向数据总线写数据的时候,命令字的最高位总是为1。

DDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。

共80个字节,其地址和屏幕的对应关系如下:DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。

同样LCD1602共有80个字节的显存,即DDRAM。

但LCD1602的显示屏幕只有16×2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不能显示出来。

这样,我们在程序中可以利用下面的“光标或显示移动指令”使字符慢慢移动到可见的显示范围内,看到字符的移动效果。

为了在液晶屏幕上显示字符,就把字符代码送入DDRAM。

例如,如果想在屏幕左上角显示字符‘A’,那么就把字符‘A’的字符代码41H写入DDRAM的00H 地址处即可。

至于怎么写入,后面会有说明。

那么为什么把字符代码写入DDRAM,就可以在相应位置显示这个代码的字符呢?我们知道,LCD1602是一种字符点阵显示器,为了显示一种字符的字形,必须要有这个字符的字模数据,什么叫字符的字模数据,看看下面的这个图就明白了:A的字模上图的左边就是字符‘A’的字模数据,右边就是将左边数据用“○”代表0,用“■”代表 1。

1602显示屏驱动详解

1602显示屏驱动详解

LCD1602的单片机驱动详解一.接口LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。

刚开始接触它的大多是单片机的初学者。

由于对它的不了解,不能随心所欲地对它进行驱动。

经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。

与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里花点时间是值得的。

一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。

我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。

如图1所示:图1再来一它的背面的,如图2所示:图2它的16条引脚定义如下:对这个表的说明:1. VSS接电源地。

2. VDD接+5V。

3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。

或同样阻值的RM065/RM063蓝白可调电阻。

见图3。

图34. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。

5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。

如果不需要进行读取操作,可以直接将其接VSS。

6. E,执行命令的使能引脚,接单片机的一个I/O。

7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意的8个I/O口。

如果接P0口,P0口应该接4.7K —10K的上拉电阻。

如果是4线并行驱动,只须接4个I/O口。

8. A背光正极,可接一个10—47欧的限流电阻到VDD。

9. K背光负极,接VSS。

四线驱动1602

四线驱动1602
Lcd_1602_write(0,0x80); //第一行
for(num=0;num<16;num++)
{
Lcd_1602_write(1,table1[num]); //写数据
delay(3); //适当延时,数据稳定
lcden=0; //送入数据
date<<=4; //低四位左移到高四位
{
lcden=1;
P1=(P1&0x0f)|(date&0xf0); //将date的高四位送入P1,同时保持P1的低四位不变
//如果使用P1的低四位的话,则该处应该改为:P1=(P1&0xf0)|((date>>4)&0x0f);
}
}
/*==========================================================
*函数名称:void Lcd_1602_init()
*功 能:对1602进行初始化
*入口参数:
*出口参数:
*说 明:用四线时,1602的初始化只需要高四位数据就可以完成,在初始化完成之后必须再传入四位数据,需注意。
uchar code table1[]=" 51Start: ";
uchar code table2[]=" the best one! ";
void delay(uint x) //延时 x 毫秒
Lcd_1602_write(0,0x01); //显示清0,数据指针清0
}
//主函数
void main()
{
uchar num;

1602液晶

1602液晶

1602液晶1. 简介1602液晶是广泛应用于电子产品中的一种显示屏,其尺寸为16列和2行,每行可以显示16个字符。

它采用了液晶显示技术,可以显示文字和简单的图形。

1602液晶广泛应用于计算器、电子表、温度计等设备中。

2. 主要特点•尺寸:16列和2行•可显示16个字符•采用液晶显示技术•低功耗3. 接口介绍1602液晶具有以下接口:•VSS:负极电源,接地•VDD:正极电源,接5V•V0:液晶偏置电压,通过调节电位器来调整显示对比度•RS:指令/数据选择引脚,RS=0时为指令,RS=1时为数据•RW:读/写选择引脚,RW=0时为写入,RW=1时为读取•E:使能信号引脚,下降沿触发•DB0-DB3:数据总线,用于传输指令或数据•DB4-DB7:数据总线,用于传输指令或数据4. 使用方法4.1 硬件连接将1602液晶与单片机或电子设备连接,具体连接方式如下:•VSS连接到地•VDD连接到5V电源•V0通过电位器连接到地•RS连接到单片机或电子设备的对应引脚•RW连接到地•E连接到单片机或电子设备的对应引脚•DB0-DB7连接到单片机或电子设备的对应引脚4.2 初始化在编写程序前,需要对1602液晶进行初始化设置。

具体步骤如下:•设置液晶工作在8位模式下•设置液晶显示为2行16列•打开液晶显示•关闭光标显示4.3 显示文字通过指令和数据来在1602液晶上显示文字。

具体步骤如下:•设置RS为1,表示传输数据•设置RW为0,表示写入•输入数据通过DB0-DB7进行传输•设置E引脚为高电平,然后下降沿触发数据传输4.4 清屏可以通过发送清屏指令来清除1602液晶上的显示内容。

具体步骤如下:•设置RS为0,表示传输指令•设置RW为0,表示写入•发送清屏指令0x01•设置E引脚为高电平,然后下降沿触发指令传输4.5 控制光标位置可以通过发送指令来控制光标的位置,使其在1602液晶上显示在指定位置。

具体步骤如下:•设置RS为0,表示传输指令•设置RW为0,表示写入•发送设置光标位置的指令0x80或0xC0,指定行和列的位置–0x80指定第一行–0xC0指定第二行•设置E引脚为高电平,然后下降沿触发指令传输5. 示例程序下面是一个使用Arduino和1602液晶显示。

[新版]lcd1602数据手册

[新版]lcd1602数据手册

LCD1602数据手册1602采用标准的16脚接口,其中:第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15~16脚:空脚1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”1602液晶模块内部的控制器共有11条控制指令,如表2所示,它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置指令2:光标复位,光标返回到地址00H指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效指令4:显示开关控制。

D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符指令7:字符发生器RAM地址设置指令8:DDRAM地址设置指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

1602液晶使用方法

1602液晶使用方法

1602液晶使用方法
先到电子市场买根和插针对应的插孔(2毛钱一根别买贵了)如下图中,上方为焊在板子上的针,下方为和针相对应的插孔.把它用钳子剪成十六个刚好能插到液晶的孔里.
(TX-1C实验板上对应液晶插孔我们已经安装好,可不必管)
剪完后如下图所示焊接好.
然后插到板子上,插好后如下图所示.
插的时候一定要注意方向,插完后液晶模块应该在实验板子的上方,而不是在板子外面。

如果没有显示,请调节液晶左边那个写着1602的电位器,将其顺时针方向拧动几十圈就可看见字。

12864液晶使用说明
将与12864液晶一起带的排线按如下图方式连接
液晶板子上20针有序号标示,与液晶上的标号要对应板子上左下为1,液晶上右边为1
(下图中排线与液晶还没有焊接.)。

四位1602

四位1602

《用单片机控制字符型液晶显示模块》一文的补充《电子报》2003年,第6期,类别:智能电子《电子报》2001年第45期第十二版《用单片机控制字符型液晶显示模块》一文,详细地介绍了DM-162液晶模块的使用方法。

从实际使用中遇到的问题来看,本人认为有以下两点需要补充说明:一、DM-162液晶模块提供了8位双向数据线(D0~D7),支持4位数据总线和8位数据总线两种接口方式。

在实际使用中,由于单片机I/O端口数的限制,往往需要用到4位数据总线方式。

其实,4位数据总线进行数据操作时,是先处理高4位数据,后处理低4位数据。

下面举例说明4位数据总线的使用方法。

DM-162液晶模块与AT89C51接口电路如附图。

在第二行第一个字符处(40H)显示字符“A”的程序如下:RSEQUP3.7RWEQUP3.6EEQUP3.5D7EQUP1.7ORG0000HMOVA,#01H;清屏CALLW_INSTRUMOVA,#28H;4位总线2行5×7点阵CALLW_INSTRUMOVA,#0FH;显示开,光标开,闪烁开CALLW_INSTRUMOVA,#06H ;光标自动右移,;显示文字不移动CALLW_INSTRUMOVA ,0C0H;置显示位地址(40H)CALLW_INSTRUMOVA ,#41H;字符A的代码CALLW_DATAJMP$;子程序SUB1 判断LCD是否忙BUSY:CLRECLRRSSETBRWWAIT:SETBD7SETBE ;处理高4位数据MOVC,D7;读入忙标志位BFCLRESETBE ;处理低4位数据CLREJCWAIT;LCD忙转移RET;SUB2:将指令(A)写入LCDW_INSTRU:CALLBUSYCLRRSCLRRWMOVP1 ,A;写高4位数据;暂忽略对P1.0~1.3口的影响SETBECLRESWAPA ;写低4位数据MOVP1 ,ASETBECLRERET;SUB3:将数据(A)写入LCDW_DATA:CALLBUSYSETBRSCLRRWMOVP1,A;写高4位数据SETBECLRESWAPA;写低4位数据MOVP1,ASETBECLRERETEND。

1602液晶的引脚定义

1602液晶的引脚定义

1602液晶的引脚定义2008年09月03日星期三下午 06:00/txz01/blog/index/1LCD1602已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,定义如下表所示:字符型LCD的引脚定义HD44780内置了DDRAM、CGROM和CGRAM。

DDRAM就是显示数据RAM,用来寄存待显示的字符代码。

共80个字节,其地址和屏幕的对应关系如下表:也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码就行了。

但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。

那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。

第二行也一样用前16个地址。

对应如下:DDRAM地址与显示位置的对应关系我们知道文本文件中每一个字符都是用一个字节的代码记录的。

一个汉字是用两个字节的代码记录。

在PC上我们只要打开文本文件就能在屏幕上看到对应的字符是因为在操作系统里和BIOS里都固化有字符字模。

什么是字模?就代表了是在点阵屏幕上点亮和熄灭的信息数据。

例如“A”字的字模:01110 ○■■■○10001 ■○○○■10001 ■○○○■10001 ■○○○■11111 ■■■■■10001 ■○○○■10001 ■○○○■上图左边的数据就是字模数据,右边就是将左边数据用“○”代表0,用“■”代表1。

看出是个“A”字了吗?在文本文件中“A”字的代码是41H,PC收到41H 的代码后就去字模文件中将代表A字的这一组数据送到显卡去点亮屏幕上相应的点,你就看到“A”这个字了。

1602引脚图

1602引脚图

1602引脚图
引言
本文档将介绍1602液晶显示屏的引脚图及其功能。

1602液晶显示屏是一种常用的字符型液晶显示模块,广泛应用于电子产品中。

引脚图
下面是1602液晶显示屏的引脚图:
-------------------
VCC -| 1 16 |- VSS
-| 2 15 |- R/W
-| 3 14 |- RS
-| 4 13 |- E
-| 5 12 |- D0
-| 6 11 |- D1
-| 7 10 |- D2
-| 8 9 |- D3
-------------------
引脚功能说明
下面是1602液晶显示屏每个引脚的功能说明:
•VCC:供电正极,接5V电源。

•VSS:供电负极,接地。

•R/W:读写控制,接高电平时读取数据,接低电平时写入数据。

•RS:寄存器选择,接高电平时为数据寄存器,接低电平时为命令寄存器。

•E:使能信号,通过控制使能信号的高低电平来触发程序。

•D0-D3:数据线,用于传输数据。

•D4-D7:另外四个数据线,也用于传输数据。

使用方法
使用1602液晶显示屏时,我们需要根据引脚图将其连接至单片机或其他电子设备。

下面是一个使用示例:
```c #include <LiquidCrystal.h>
// 定义1602液晶显示屏的引脚 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() { // 设置液晶显示屏的列数和行数
lcd.begin(16, 2);
// 显示文字 lcd.print(。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <reg52.h>
sbit LCM_RW=P2^5; //定义引脚
sbit LCM_RS=P2^4;
sbit LCM_E =P2^6;
#define DataPort P0
#define Busy 0x80 //用于检测LCM 状态字中的Busy 标识
void WriteDataLCM(unsigned char Data);
void WriteCommandLCM(unsigned char Command);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void Displaystr(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delayms(unsigned int n);
void delay(unsigned int h);
void Write_CGRAM(unsigned char *p);
unsigned char code blog_adr[] = {"china"};
unsigned char code email[] = {"Julian"};
unsigned char code zimo[]={
0x00,0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02, //年
0x00,0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13, //月
0x00,0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F, //日
};
void main(void)
{
LCMInit();
Write_CGRAM(zimo);
Displaystr(0, 0, blog_adr);
Displaystr(6, 0, email);
Displaystr(0,1,"2011");
DisplayOneChar(4,1,0x00);
Displaystr(5,1,"8");
DisplayOneChar(6,1,0x01);
Displaystr(7,1,"28");
DisplayOneChar(9,1,0x02);
while(1);
}
/*-------------------------------------------
判忙函数
-------------------------------------------*/
void Checkbusy()
{
unsigned char temp1,temp2;
do
{
LCM_RS= 0;
LCM_RW= 1;
LCM_E = 0;
LCM_E = 1;
temp1=DataPort&0xf0;
delay(100); //短暂延时,代替检测忙状态
LCM_E = 0;
LCM_E = 1;
temp2=(DataPort&0xf0)>>4;
delay(100);
LCM_E = 0;
temp1=temp1+temp2;
}
while((temp1&0x80)==Busy);
}
//写数据RS="H",RW=L,D0~D7=数据,E=高脉冲
void WriteDataLCM(unsigned char Data)
{
Checkbusy();
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0;
DataPort =(Data & 0xF0);
LCM_E = 1;
delay(10);
LCM_E = 0;
DataPort =(Data & 0x0F)<<4;
LCM_E = 1;
delay(10);
LCM_E = 0;
}
//写指令RS="L",RW=L,D0~D7=指令码,E=高脉冲
void WriteCommandLCM(unsigned char Command)
{
Checkbusy();
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
DataPort =( Command & 0xF0);
LCM_E = 1;
delay(10);
LCM_E = 0;
DataPort =( Command & 0x0F )<<4;
LCM_E = 1;
delay(10);
LCM_E = 0;
}
void LCMInit(void) //LCD 初始化
{
DataPort = 0;
Delayms(15);
WriteCommandLCM(0x02);
Delayms(5);
WriteCommandLCM(0x28); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x06); // 显示光标移动设置
WriteCommandLCM(0x0F);
WriteCommandLCM(0x01);
Delayms(5);
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) {
Y &= 0x01;
X &= 0x0F; //限制X 不能大于15,Y 不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; //算出指令码
WriteCommandLCM(X);
WriteDataLCM(DData);
}
//按指定位置显示一串字符
void Displaystr(unsigned char X, unsigned char Y, unsigned char code *DData) {
unsigned char ListLength;
ListLength = 0;
Y &= 0x01;
X &= 0x0F; //限制X 不能大于15,Y 不能大于1 while (DData[ListLength]!='\0') //若到达字串尾则退出
{
if (X <= 0xF) //X 坐标应小于0x0F
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++; X++;
if(X>=16)
{
X=0;Y++;
if(Y==2)
Y=0;
}
}
else
{
X=0;Y++;
if(Y==2)
Y=0;
}
}
}
void Delayms(unsigned int n)
{
unsigned int i,j;
for(j=n;j>0;j--)
for(i=112;i>0;i--);
}
/**************************************************
** 函数名称: delay
功能:生成3个自定义字符,可根据实际情况调整j的大小
****************************************************/
void delay(unsigned int h)
{
while(h--); //0.01MS
}
/*------------------------------------------------
生成自定义字符
------------------------------------------------*/
void Write_CGRAM(unsigned char *p)
{
unsigned char i,j,kk;
unsigned char tmp=0x40; //操作CGRAM的命令码
kk=0;
for(j=0;j<3;j++)
{
for(i=0;i<8;i++) // 8 个字节生成1 个字符点阵
{
WriteCommandLCM(tmp+i); //操作CGRAM的命令码+写入CGRAM地址.
WriteDataLCM(p[kk]); //写入数据
kk++;
}
tmp += 8;
}
}。

相关文档
最新文档