LCD1602和LCD12864程序-并行与串行

合集下载

LCD1602的电路图和程序

LCD1602的电路图和程序

LCD1602的电路图和程序————————————————————————————————作者:————————————————————————————————日期:MS基于1602字符型液晶显示器的显示系统姓名:杨越班级:电子11-1学号:110400104一、实习目的(1)了解飞思卡尔单片机的基本原理,掌握其基本的工作流程。

(2)了解LCD1602的基本原理及用法。

(3)能够熟练使用CodeWarrior软件编写C语言程序,使用BDM仿真器下载程序。

(4)能够熟练焊接电路板。

二、实验设备与器件CodeWarrior软件,BDM仿真器,万用电路板,飞思卡尔单片机,LCD1602液晶显示器,三、实验内容内容:利用飞思卡尔单片机制作基于1602字符液晶显示器的显示系统要求:用四个按键控制,按下第一个按键显示1,按下第二个按键显示2,以此类推。

(1)LCD1602液晶显示器的原理:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。

以下具体阐述这三个管脚:RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。

R/W为读写选择,高电平进行读操作,低电平进行写操作。

E端为使能端,后面和时序联系在一起。

除此外,D0~D7分别为8位双向数据线。

操作时序:RS R/W 操作说明0 0 写入指令码D0~D70 1 读取输出的D0~D7状态字1 0 写入数据D0~D71 1 从D0~D7读取数据注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;所以对控制器每次进行读写操作前,必须进行读写检测。

(即后面的读忙子程序)指令集:LCD_1602 初始化指令小结:0x38 设置16*2显示,5*7点阵,8位数据接口0x01 清屏0x0F 开显示,显示光标,光标闪烁0x08 只开显示0x0e 开显示,显示光标,光标不闪烁0x0c 开显示,不显示光标0x06 地址加1,当写入数据的时候光标右移0x02 地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM 中断内容不变0x18 光标和显示一起向左移动(2)飞思卡尔单片机的功能及特点:MC9S12XS128是 16 位单片机,由 16 位中央处理单元(CPU12X)、128KB 程序、Flash(P-lash)、8KB RAM、8KB 数据 Flash(D-lash)组成片内存储器。

lcd1602与lcd12864优缺点

lcd1602与lcd12864优缺点

lcd1602 与lcd12864 优缺点
液晶是一种在一定温度范围内呈现既不同于固态液态又不同于气态的特殊物质态,它既具有各向异性的晶体所特有的双折射性又具有液体的流动性液晶显示器件(英文的简写为LCD)就是利用液晶态物质的液晶分子排列状态在电场中改变而调制外界光的被动型显示器件。

LCD12864:
LCD12864 是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器
及128&TImes;64 全点阵液晶显示器组成。

可完成图形显示,也可以显示
8&TImes;4 个(16&TImes;16 点阵)汉字或者显示16&TImes;4 个(8 乘以
16 点阵)ASCII 码。

分为两种,带字库的和不带字库的。

不带字库的LCD
需要自己提供字库字模,此时可以根据个人喜好设置各种字体显示风格,设计上较为灵活。

带字库的LCD 提供字库字模,但是只能显示GB2312 的宋
体。

各有优缺点,根据不同应用场景灵活选择。

其液晶模块原理图如下所示。

LCD12864 点阵图形液晶模块原理框图
LCD1602。

lcd1602指令解读及基本程序

lcd1602指令解读及基本程序

HD44780内置了DDRAM、CGROM和CGRAM。

CGROM和CGRAM就是内置192个常用字符产生器,用户自定义的字符产生器RAM DDRAM就是显示数据RAM,用来寄存待显示的字符代码。

共80个字节,其地址和屏幕的对应关系如下表:显示位置: 1 2 3 4 5 6 7 8 (40)第一行: 00H 01H 02H 03H 04H 05H 06H 07H ..... 27H第二行: 40H 41H 42H 43H 44H 45H 46H 47H ..... 67H*/1602LCD的RAM地址映射液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。

要显示字符时要先输入显示字符地址,也就是告诉模块在,哪里显示字符,图是1602的内部显示地址。

也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码就行了。

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

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

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

对应如下:DDRAM地址与显示位置的对应关系图五:LCD1602内部显示地址例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。

/*1602液晶模块内部的控制器共有11条控制指令,如下表序号指令RS R/W D7 D6 D5 D4 D3 D2 D1 D01 清显示0 0 0 0 0 0 0 0 0 12 光标返回0 0 0 0 0 0 0 0 1 *3 置输入模式0 0 0 0 0 0 0 1 I/D S4 显示开/关控制0 0 0 0 0 0 1 D C B5 光标或字符移位0 0 0 0 0 1 S/C R/L * *D3=1移字符D3=0移光标D2=1右移D2=0左移6 功能设置0 0 0 0 1 DL N F * *DL=1总线8位DL=0总线4位N=0显单行N=1显双行F=0 5X7点阵F=1 5X10点阵7 置字符发生器地址0 0 0 1 -字符发生存贮器地址(6位)-8 置数据存贮器地址0 0 1 --显示数据存贮器地址(7位)---9 读忙标志或地址0 1 BF ----计数器地址(7位)---------10 写CGRAM或DDRAM 1 0 --------要写的数据内容(8位------11 读CGRAM或DDRAM 1 1 --------读出的数据内容(8位)-----*/// 51单片机对lcd1602一些基础程序/* 基本操作时序:写指令输入:RS=0,RW=0,E=下降沿脉冲,DB0~DB7=指令码输出:无写数据输入:RS=1,RW=0,E=下降沿脉冲,DB0~DB7=数据输出:无读状态输入:RS=0,RW=1,E=1 输出:DB0~DB7=状态字读数据输入:RS=1,RW=1,E=1 输出:DB0~DB7=数据/*//*lcd_1602指令:指令位D7 D6 D5 D4 D3 D2 D1 D0功能设置0 0 1 DL N F * *DL=1总线8位DL=0总线4位N=0显单行N=1显双行F=0 5X7点阵F=1 5X10点阵lcd_1602指令汇总0x28 设置16*2显示,5*7点阵,4位数据接口0x38 设置16*2显示,5*7点阵,8位数据接口0x01 清屏,光标复位到地址00H位置0x02 光标归原点,DDRAM中内容不变,地址计数器AC=0;(此时地址为0x80)0x0F 开显示,显示光标,光标闪烁0x0e 开显示,显示光标,光标不闪烁0x0c 开显示,不显示光标0x08 只开显示0x06 地址加一,当写入数据的时候光标右移设定显示屏或光标移动方向指令0x18 字符全部左移一格,但光标不动0x1c 字符全部右移一格,但光标不动0x10 光标左移1格,且AC值减10x14 光标右移1格,且AC值加1*/#include <intrins.h>#define dataport P1sbit RS=P2^ 6;sbit RW=P2^5;sbit EN=P2^4;void waitfor() //检测忙信号函数{dataport=0xff;RS=0;RW=1; //选择指令寄存器读操作RS=0指令RS=1数据; RW=0写RW=1读EN=1; //使能操作while(dataport&0x80); //如果最高位是1 表示1602正忙原地踏步忙完后芯片会将高位拉低EN=0;}void writedata(unsigned char dataw) //写数据到LCD1602{waitfor(); //测忙RS=1;RW=0; //选择数据寄存器写操作RS=0指令RS=1数据; RW=0写RW=1读dataport=dataw; //将数据送到数据口EN=1;EN=0; //使能下降沿脉冲}void writecmd(unsigned char cmd) //写命令到LCD1602{waitfor(); //测忙RS=0;RW=0; //选择指令寄存器写操作dataport=cmd; //将数据送到数据口EN=1;EN=0; //使能下降沿脉冲}void init(void) // 初始化函数{writecmd(0x38); //功能设定8位数据传输双行显示设置工作方式:0x28=4位总线字符两行显示,0x38=8位总线字符两行显示writecmd(0x0c); //显示器开关writecmd(0x01); //清屏writecmd(0x06); //字符进入模式每进入一个字符光标向右移动一格原有字符不动}void location(unsigned char x,unsigned char y) //坐标函数{unsigned char temp;temp=x&0x0f; //只要x数据的后四位if(y){temp=temp|0x40;} //第一行为0 第二行为1 如果y=1则地址加0x40temp|=0x80; //DDRAM地址的命令DB7为一writecmd(temp);}void DisplayOneChar(unsigned char x,unsigned char y,unsigned char dataw) //显示一个字符函数{location(x,y);writedata(dataw);}void displaylistchar(unsigned char x,unsigned char y,unsigned char *p) //显示字符串{while(*p) //当一个字符型数组读完时*P指的为零{displayonechar(x,y,*(p++));x++;}}void WriteCgram(unsigned char address,unsigned char *p) //写CGRAM的数据{unsigned char i=8;writecmd(address); //CGRAM里的地址初始值0x40 每次加0x80while(i--){writedata(*p);p++;}}void DisplayOneChar(unsigned char x,unsigned char y,unsigned char address,unsigned char *p) //显示一个自定义字符{unsigned char i=8;writecmd(address); //CGRAM里的地址初始值0x40 每次加0x08while(i--){writedata(*p);p++;}location(x,y); //设定要显示的位置writedata((address&=0x3f)/0x08); //要从CGRAM中读出数据在1602上显示搞了半天发现CGRAM里的地址} //和DDRAM里的地址有上面的转换关系void displynumber(unsigned char x,unsigned char y,unsigned long num) //显示一个整数{unsigned int number[8];int k,gh;for(k=0;;k++){*(number+k)=(unsigned int)(num%10);//强制类型转换num=num/10;if(num==0)break;}for(gh=k;gh>=0;gh--){displyonechar(x,y,(*(number+gh)+48));x++;}}//字型码uchar code nian[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02};// "年"uchar code yue[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11};// "月"uchar code ri[]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x11,0x1f};// "日"//显示汉字displyonecharacter(0,0,0x40,nian);displyonecharacter(1,0,0x80,yue);displyonecharacter(1,0,0xc0,ri);。

液晶12864

液晶12864

驱动头文件:LCD12864.rar我们看到,打开这个头文件,我们可以看到有需要修改的引脚定义。

假设我们这里将STD和SCLK分别接到了P1.6和P1.7上面,我们就按照上面的连接方法就可以了。

如果你使用的是告诉CPU,你可以修改下面的delay()函数,使CPU输出的控制信号速率降低一些。

好了,修改好了,让我们开始我们的编程吧:#include <REG51.H>#include "LCD12864.H"void main(){LC DInit();LC DInit();LC DChar(0x80,'Z');LC DNum(0x90,722);LC DString(0x88,"");LC DString(0x98,"因为简单所以领先");for(;;){}}液晶屏幕1602是电子上常用的液晶显示器。

这种显示器的优点是带有英文字符字库;价格低廉;接口方便。

这种液晶显示器如此广泛的使用,我们很有必要来学习使用。

你也看到了上面的图片,LCD1602的引脚常规情况下有15个插针引脚。

从左往右分别是GND(液晶)VCC(液晶)VO(对比度调整端)RS RW EN D0 D1 D2 D3 D4 D5 D6 D7 VCC(背液晶1602的使用非常的方便,数据线8条,控制线3条,其实总共需要11根IO口线(8线制使用使这样的,4线制可以节省IO口,这里先不讨论)。

液晶显示模块的VCC和GND(第一和第二个引脚)是需要接的,但是背光的VCC和GND可以不连接。

液晶1602的使用需要注意的一点就是VO这个端口。

这个VO端口接高电平时候,液晶的对比度最小;接低电平时,液晶的对比度最高(会出现“鬼影”)。

最好采用一个电位器,可以调节这个端口的电压。

正如上图这样,一个电位器,方便调节LCD的对比度。

还有一点,如果你想增加整个系统的稳定性,你应该在这11条IO口线上加一个上拉电阻。

LCD12864-串行传输程序

LCD12864-串行传输程序
(卷动位置或RAM地址选择)*/
//********************************************************************************************************
SCLK = 0; //下降沿读走数据
NOP();
}
}
/*读出一个字节 该字节高四位是第一个字节temp1高四位,低四位是temp2的高四位*/
static uchar read_byte()
{
uchar i,temp1,temp2;
}while(sbuff&0x80);
}
/*向LCD12864写入一个指令或者数据*/
void write_12864_byte(bit C_D,uchar date)
{
check_busy(); //读忙
CS = 1; //使能液晶
NOP();
if(SID) //如果数据是1 则最低位置一
temp1++;
NOP();
SCLK= 0;
NOP();
}
for(i=0;i<8;i++) //第二个字节中是读取数据的低四位
write_12864_byte(0,0x01);//0000 0001 清零 将DDRAM填满“20H”(空格)代码,并且设定DDRAM的地址计数器(AC)为00H;
// 更新设置进入设定点将I/D设为1,游标右移AC加1。
{
uchar i;
CS=0;
SID=0;
SCLK=0;
RST=0;
for(i=250;i>0;i--); //液晶复位延时一下

LCD12864(并口)显示程序

LCD12864(并口)显示程序

#ifndef jh_f330#define jh_f330#include<c8051f330.h>#endiftypedef unsigned char uint8;typedef unsigned int uint16;/*************端口配置**************///******************************************************sbit CS =P0^4;sbit RSET=P0^3;sbit A0 =P0^2;sbit WR =P0^1;sbit RD =P0^0;#define DATAPORT P1 //数据口uint8 code word1[]={0x04,0x44,0x84,0x04,0xE4,0x1F,0x84,0x44,0xA4,0x3F,0xA4,0xA4,0x64,0x06,0x04,0x00, 0x20,0x10,0x09,0x04,0xFF,0x04,0x04,0x14,0x26,0x05,0x84,0xFF,0x04,0x06,0x04,0x00 };/**********预定义数据*********/#define LCD_X 128-1 //屏幕的X轴的物理宽度#define LCD_Y 64-1 //屏幕的Y轴的物理宽度/***********LCD指令集***************///LCD开关命令#define LCD_ON() Wr_Com(0xaf)#define LCD_OFF() Wr_Com(0xae)//设置显示起始行#define LCD_START_LINE 0x40 //起始行地址为,0x40+(0-63)//页地址设置#define LCD_Page 0xb0 //页地址为:0xb0+(0-8)//列地址设置#define LCD_Ad_H 0x10 //列高四位地址:0x10+()#define LCD_Ad_L 0x00 //列低四位地址:0x00+()//行列地址方向设置#define ADC_Norm() Wr_Com(0xa0);#define ADC_Reve() Wr_Com(0xa1);#define Com_Norm() Wr_Com(0xc0);#define Com_Reve() Wr_Com(0xc8);void Init_f330(){/*****内部振荡器配置******/OSCICL=OSCICL+4; //设置系统时钟为24MHZ,ΔT=(0.005*ΔOSCICL)/fbase // OSCICL=OSCICL+22; //设置系统时钟为22.1184MHZ// OSCICL=OSCICL+45; //设置系统时钟为20MHZ //15MHZ--24.5MHZ/********设置分频*********/// OSCICN|=0x00; //设置时钟为八分频,OSCIN复位值为1100000//00:8分频,01:4分频,10:2分频,11:不分频// OSCICN|=0x01; //设置系统时钟4分频// OSCICN|=0x02; //设置系统时钟2分频OSCICN|=0x03; //设置系统时钟不分频// RSTSRC=0x04;// OSCLCN = 0x82; // 设置内部L-F振荡器为40kHZ// CLKSEL = 0x02; // 内部低频振荡器while(OSCLCN&0x40 == 0); // 等待振荡器频率稳定/*****设置看门狗*****/PCA0MD &=~0x40; // 禁止看门狗定时器EA=1;/*****端口初始化******/P0MDIN = 0xff; //复位值为11111111P1MDIN = 0xff; //1为数字输入,0为模拟输入P0MDOUT = 0xff; //复位值为11111111P1MDOUT = 0xff; //1为推挽输出,0为漏极输出XBR0 = 0x00; // 交叉开关使能XBR1 = 0x40; //交叉开关允许,T0接到引脚//XBR1 = 0x48; // ECI连到端口引脚//XBR1 |= 0x08; // PCA0 外部计数输入使能}/****************************************函数名:Wr_com**功能:LCD12864写命令程序**输入:uint8 com***************************************/void Wr_Com(uint8 com){A0=0; //命令数据选通,H:数据,L:命令CS=0; //芯片选通,低电平有效RD=1; //L:读信号WR=0; //L:写信号//nop();Data=com;WR=1;CS=1;}/****************************************函数名:Wr_Dat**功能:LCD12864写数据程序**输入:uint8 dat***************************************/void Wr_Dat(uint8 dat){A0=1; //命令数据选通,H:数据,L:命令CS=0; //芯片选通,低电平有效RD=1; //L:读信号WR=0; //L:写信号//nop();Data=dat;WR=1;CS=1;}/***************************************函数名称:LCD_Fill()**功能:LCD全屏显示数据程序**输入:8位数据**输出:无************************************/void LCD_Fill(uint8 dat){uint8 page;uint8 colume;for(page=0;page<8;page++){Wr_Com(LCD_Page+page);Wr_Com(LCD_Ad_H);Wr_Com(LCD_Ad_L);for(colume=0;colume<LCD_X;colume++)Wr_Dat(dat);}}/***************************************函数名称:LCD_Clear()**功能:LCD清屏程序(全屏填充0x00)**输入:8位数据**输出:无************************************/void LCD_Clear(){LCD_Fill(0x00);}/******************************************************* ** 函数名称: LCD12864_Init** 功能: LCD1286初始化程序** 输入: 无TimeDelay ** 输出: 无********************************************************/ void TimeDelay(int Time){int i;while(Time > 0){for(i = 0;i < 8000;i++){}Time --;}}void LCD_Init(void){LCD_RST=0;TimeDelay(200);LCD_RST=1;TimeDelay(200);ADC_Norm();Com_Reve();Wr_Com(0xa2);Wr_Com(0x2c); //vc onTimeDelay(200);Wr_Com(0x2e); //vr onTimeDelay(200);Wr_Com(0x2f); //internal booster,follower,divided onWr_Com(0x24); //set rb/ra=5.29Wr_Com(0x81); //set reference voltage selectWr_Com(0x1d);LCD_ON();Wr_Com(LCD_START_LINE);}/***********************************************************************函数名称:LCD_Word()**功能:输入单个汉字(16x16符号)**输入:页地址,列地址、字符数组**输出:无***********************************************************************/ void LCD_Word(unsigned char row,unsigned char colume,unsigned char *pword){unsigned char page= row;unsigned char col_high=colume>>4;unsigned char col_low =colume&0x0f;unsigned char i;Wr_Com(LCD_Page+page);Wr_Com(LCD_Ad_H+col_high);Wr_Com(LCD_Ad_L+col_low);for(i=0;i<16;i++){Wr_Dat(*(pword+i));}Wr_Com(LCD_Page+page+1);Wr_Com(LCD_Ad_H+col_high);Wr_Com(LCD_Ad_L+col_low);for(i=0;i<16;i++){Wr_Dat(*(pword+16+i));}main(){Init_f330();LCD_Init();LCD_Clear();LCD_Word(1,1,word1);while(1);}。

LCD1602原理及显示程序

LCD1602原理及显示程序

LCD1602原理及显示程序LCD1602是一种常用的液晶显示器模块,具有16列2行的显示区域,可以用于显示各种文字和简单的图形。

它广泛应用于各种电子产品中,如计算器、电子钟表、仪器仪表等。

本文将介绍LCD1602的工作原理和显示程序设计。

LCD1602模块由液晶显示面板、驱动芯片和背光源组成。

其中驱动芯片负责向液晶面板发送控制信号和数据信号,控制液晶分子的取向和光的穿透程度,从而实现图像的显示。

背光源则提供背光,使得图像可以在暗环境下清晰可见。

液晶显示面板是LCD1602模块最关键的部分。

它由两片平行的玻璃基板构成,中间夹层有液晶层和极板。

液晶层是一种特殊的有机化合物,具有液态和固态之间的特性。

液晶分子有两种主要的排列方式,即平行排列和垂直排列,通过调节驱动芯片发送的电压信号,可以改变液晶分子的排列方式,进而控制光的透射和反射。

极板则起到滤光器的作用,可以控制光的偏振方向。

为了控制LCD1602模块进行显示,我们需要通过IO口与其连接,并向其发送控制信号和数据信号。

以下是一个基本的LCD1602显示程序的设计过程:1.初始化LCD1602模块:a.设置LCD1602的工作模式,例如行数、字体大小等。

b.设置显示模式,例如显示打开、显示关闭、光标光灭等。

2.发送指令到LCD1602模块:a.选择指令寄存器,RS引脚置低电平。

b.向数据总线发送指令数据。

c.发送使能信号,EN引脚从高到低电平进行一个脉冲,使得LCD1602芯片接收到指令。

3.发送数据到LCD1602模块:a.选择数据寄存器,RS引脚置高电平。

b.向数据总线发送需要显示的数据。

c.发送使能信号,EN引脚从高到低电平进行一个脉冲,使得LCD1602芯片接收到数据。

4.清除LCD1602模块的显示内容:a.发送清除显示指令到LCD1602模块。

5.控制LCD1602模块的光标位置:a.发送光标位置指令到LCD1602模块。

6.控制LCD1602模块的背光亮度:a.通过PWM控制背光源的亮度。

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三个控制引脚连接,完成了只用单片机一个端口即可完成显示任务,给设计带来极大的方便。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LCD1602和LCD12864的函数库,包括并行与串行LCD1602基础函数#ifndef __LCD1602_JCK_C__#define __LCD1602_JCK_C__/************************************************** **** 六哥LCD1602基础函数库 **** ****************************************************///使用请注意定义引脚#include"yscx.c"/***************************************************************** LCD1602判忙函数******************************************************************/ void LCD1602_PM(void){unsigned char temp1;//状态信息(判断是否忙)LCD1602_SJ=0xFF;//记得在包含该头文件前,定义引脚LCD1602_RS=0; //记得在包含该头文件前,定义引脚LCD1602_RW=1; //记得在包含该头文件前,定义引脚LCD1602_E=1; //记得在包含该头文件前,定义引脚do{temp1 = LCD1602_SJ;//记得在包含该头文件前,定义引脚LCD1602_SJ=0xFF;}while(temp1&0x80);LCD1602_E=0;//记得在包含该头文件前,定义引脚YS_us(1); //}/*------------------------------------------------LCD1602写入命令函数------------------------------------------------*/void LCD1602_XZL(unsigned char ml){LCD1602_PM(); //忙则等待LCD1602_RS= 0; //记得在包含该头文件前,定义引脚LCD1602_RW= 0; //记得在包含该头文件前,定义引脚LCD1602_E = 1;//记得在包含该头文件前,定义引脚LCD1602_SJ=ml; //记得在包含该头文件前,定义引脚YS_us(1);//稍作延时给LCD反应的时间LCD1602_E = 0;//记得在包含该头文件前,定义引脚if(ml==0x01|ml==0x02) YS_ms(2);//清屏和地址归位大概需2ms时间处理 YS_us(35);//其他指令大概需35us/*------------------------------------------------LCD1602写入数据函数------------------------------------------------*/void LCD1602_XSJ(unsigned char sj){LCD1602_PM(); //忙则等待LCD1602_RS=1; //记得在包含该头文件前,定义引脚 LCD1602_RW=0; //记得在包含该头文件前,定义引脚 LCD1602_E= 1;//记得在包含该头文件前,定义引脚 LCD1602_SJ=sj; //记得在包含该头文件前,定义引脚 YS_us(1);//稍作延时给LCD反应的时间LCD1602_E= 0;//记得在包含该头文件前,定义引脚 }/*------------------------------------------------LCD1602初始化函数------------------------------------------------*/void LCD1602_CSH(void){LCD1602_XZL(0x38); /*显示模式设置*/LCD1602_XZL(0x08); /*显示光标移动设置*/LCD1602_XZL(0x01); /*显示开及光标设置*/LCD1602_XZL(0X06);LCD1602_XZL(0X0c);}#endifLCD1602显示函数#ifndef __LCD1602_XSK_C__#define __LCD1602_XSK_C__/******************************************************* **************** 六哥LCD1602显示函数库 **************** *********************************************************/#include"yscx.C"#include"LCD1602_JCK_cx.C"//为保证显示数制时的运行效率,制作了0—9,A—F的ascll码表unsigned char codeascll1602[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43, 0x44,0x45,0x46};/*********************************************************************LCD1602数制显示(十或十六)*******************************************************************sj:需要显示的数据ml:显示地址设定xsfs:显示方式,进制和小数点的判断依据,*/void LCD1602_SZXS(signed long sj,unsigned char xsfs,ml)///wei为1输出十六进制,否则输出十进制{unsigned long xc; //显示缓存unsigned char a;bit xsd,fs,bf=0;xsd=0;fs=0;LCD1602_XZL(0x04);//设置光标向左移LCD1602_XZL(ml);if(xsfs>10){a=16; //输出十六进制LCD1602_XSJ(0x48);//显示Hxsfs=0;} //else{a=10; //否则输出十进制if(xsfs!=0) xsd=1;//显示小数点使能if(sj<0){sj=~sj+1;fs=1;} //显示负号使能}xc=sj;if(xc!=0) //显示数据不为0;则显示{while(xsd) //判是否需要显示小数{if(xc!=0) //是否还需要计算{ml=xc%a;if(bf|ml!=0) //小数部分为0不需要显示{LCD1602_XSJ(ascll1602[ml]); //取数的ascll码并显示bf=1; //小数部分不为0标志,小数部分数字有效}xc/=a; //取剩下的数}else if(bf) LCD1602_XSJ(0x30);//判是否需要补0else; //小数部分无效,不需要补0xsfs--;if(xsfs==0) //小数点位数减一{xsd=0; //小数计算部分结束标志if(bf) LCD1602_XSJ(0x2e); //小数部分存在有效数字则显示小数点 }}}////////////整数显示部分////////////////////////////////////////////do{LCD1602_XSJ(ascll1602[xc%a]); //取数的ascll码并显示xc/=a;}while(xc!=0);if(fs) LCD1602_XSJ(0x2d);//判是否需要显示负号LCD1602_XZL(0x06);//还原光标移动方向}/********************************LCD1602LCD1602字符显示程序*********************************/void LCD1602_ZFXS(unsigned char *SJ,t,ml)/*h:行,SJ:字符串指针,t:间隔时间*/ {LCD1602_XZL(ml); //写指令while(*SJ)//是否显示完{LCD1602_XSJ(*SJ);//写数据SJ++; //取下一个字符YS_ms(t); //延时}#endifLCD12864基础函数—并行#ifndef __LCD12864_JCK_C__#define __LCD12864_JCK_C__/************************************************ ** **** 六哥LCD12864基础函数库 **** ****************************************************/ //使用请注意定义引脚#include"yscx.c"/********************测忙碌**********************/ //测忙碌子程序//RS=0,RW=1,E=H,D0-D7=状态字/************************************************/ void LCD12864_PM(void)unsigned char temp1;//状态信息(判断是否忙)LCD12864_RS=0; // 记得在包含该头文件前,定义引脚LCD12864_RW=1; // 记得在包含该头文件前,定义引脚LCD12864_E=1; //记得在包含该头文件前,定义引脚do{temp1 = LCD12864_SJ;//记得在包含该头文件前,定义引脚 LCD12864_SJ=0xFF;}while(temp1&0x80);LCD12864_E=0; //记得在包含该头文件前,定义引脚YS_us(1); //}/********************写命令**********************/ //写命令子程序///************************************************/ void LCD12864_XZL(unsigned char ml)/*写命令*/{LCD12864_PM();LCD12864_RS=0; //记得在包含该头文件前,定义引脚LCD12864_RW=0; //记得在包含该头文件前,定义引脚LCD12864_E=1; //记得在包含该头文件前,定义引脚LCD12864_SJ=ml;//记得在包含该头文件前,定义引脚YS_us(0);//稍作延时给LCD反应的时间LCD12864_E=0; //记得在包含该头文件前,定义引脚if(ml==0x01|ml==0x02) YS_ms(3);//清屏和地址归位大概需3ms时间处理YS_us(50);//其他指令大概需50us}/********************写数据**********************///写数据子程序///************************************************/void LCD12864_XSJ(unsigned char sj){LCD12864_PM();LCD12864_RS=1; //记得在包含该头文件前,定义引脚LCD12864_RW=0; //记得在包含该头文件前,定义引脚LCD12864_E=1; //记得在包含该头文件前,定义引脚LCD12864_SJ=sj;//记得在包含该头文件前,定义引脚YS_us(0);//稍作延时给LCD反应的时间LCD12864_E=0; //记得在包含该头文件前,定义引脚}/********************初始化**********************///复位、通讯方式选择/************************************************/void LCD12864_CSH(void){P26=1; //通讯方式为并口PSB=1,在设计电路时就把PSB端焊好,节省I/O //LCD12864_XZL(0x34); //34H--扩充指令操作LCD12864_XZL(0x30); //功能设置,一次送8位数据,基本指令集LCD12864_XZL(0x0C); //0000,1100 整体显示,游标off,游标位置offLCD12864_XZL(0x01); //0000,0001 清DDRAMLCD12864_XZL(0x02); //0000,0010 DDRAM地址归位LCD12864_XZL(0x80); //1000,0000 设定DDRAM 7位地址000,0000到地址计数器ACLCD12864_XZL(0x06);}#endifLCD12864基础函数—串行#ifndef __LCD12864_JCK_CX_C__#define __LCD12864_JCK_CX_C__/************************************************** **** 六哥LCD12864基础函数库 **** 串行 ****************************************************///使用请注意定义引脚#include"yscx.c"/*******************串行通信*********************分别发送三个字节,11111AB0,DDDD0000,SSSS000,A:即表示并行的RW,1为读,0为写B:即表示并行的RS,1为数据,0为指令D:即表示并行的高四位数据S:即表示并行的低四位数据注:串行要把PSB端为低电平*************************************************/void LCD12864_CXTX(unsigned char fs,sj){unsigned char i;LCD12864_E=0;//时钟SCLKLCD12864_RS=1;///CS片选do ////LCD判忙============={for(i=0;i<8;i++){YS_us(1);//MCU与LCD速率匹配if(i<6) LCD12864_RW=1;//读LCD数据,前6位为1;后两位为0 else LCD12864_RW=0;//命令格式11111100B,0xfcYS_us(1);//MCU与LCD速率匹配LCD12864_E=1;//时钟SCLKYS_us(1);//MCU与LCD速率匹配LCD12864_E=0;//时钟SCLK}YS_us(5);//给LCD反应的时间LCD12864_E=1;//时钟SCLKYS_us(1); //给LCD反应的时间}while(LCD12864_RW);//判忙只需要取最高位,而不管后面7位LCD12864_E=0;//时钟SCLKLCD12864_RS=0;///CS片选YS_us(1);//给LCD反应的时间LCD12864_RS=1;///CS片选for(i=0;i<24;i++)//、、、、送3字节{LCD12864_RW=fs&0x80;//数据SIDfs<<=1;YS_us(1); //MCU与LCD速率匹配LCD12864_E=1; //时钟SCLKYS_us(1); //MCU与LCD速率匹配if(i==7) fs=sj&0xf0; //取数据高四位if(i==15) fs=sj<<4; //取数据低四位LCD12864_E=0; //时钟SCLKYS_us(1); //MCU与LCD速率匹配}LCD12864_RS=0;///CS片选LCD12864_E=1;//恢复高电平不影响其他用途LCD12864_RW=1;//恢复高电平不影响其他用途}/********************写命令**********************/void LCD12864_XZL(unsigned char ml)/*写命令*/{LCD12864_CXTX(0xf8,ml);//命令格式11111000B,0xf8if(ml==0x01|ml==0x02) YS_ms(4);//清屏和地址归位大概需4ms时间处理YS_us(50);//其他指令大概需50us}/********************写数据**********************/void LCD12864_XSJ(unsigned char sj){LCD12864_CXTX(0xfa,sj);//命令格式11111010B,0xfa}/********************初始化**********************///复位、通讯方式选择/************************************************/void LCD12864_CSH(void){P26=0; //通讯方式为串行通信PSB=0,在设计电路时就把PSB端焊好,节省I/O//LCD12864_XZL(0x34);//34H--扩充指令操作LCD12864_XZL(0x30); //功能设置,一次送8位数据,基本指令集LCD12864_XZL(0x0C); //0000,1100 整体显示,游标off,游标位置offLCD12864_XZL(0x01); //0000,0001 清DDRAMLCD12864_XZL(0x80); //1000,0000 设定DDRAM 7位地址000,0000到地址计数器ACLCD12864_XZL(0x06);}#endifLCD12864显示函数#ifndef __LCD12864_XSK_C__#define __LCD12864_XSK_C__/******************************************************* **************** 六哥LCD12864显示函数库 **************** *********************************************************///使用请注意定义引脚#include"LCD12864_JCK_cx.C"//包含基础库//为保证显示数制时的运行效率,制作了0—9,A—F的ascll码表unsigned char codeascll12864[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x4 3,0x44,0x45,0x46};/***************************************************************LCD12864设置显示地址函数***************************************************************************/unsigned char LCD12864_SZDZ(unsigned char x,y)//{switch(y){case 0:x|=0x80;break;case 1:x|=0x90;break;case 2:x|=0x88;break;case 3:x|=0x98;break;default:;}return(x);}/***************************************************************LCD12864数制显示函数******************************************************************************sj:需要显示的数据,取值范围:十进制:-2147483648-2147483647,十六进制:0H-7FFFFFFFHxsfs:显示方式,进制和小数点的判断依据,x:显示列,取值范围0-7y:显示行,取值范围0-3*/void LCD12864_SZXS(signed long sj,unsigned char xsfs,x,y) {unsigned long xc; //显示缓存unsigned char d[13];bit xsd,fs,bf=0;xsd=0;fs=0;LCD12864_XZL(0x04);//设置光标左移LCD12864_XZL(LCD12864_SZDZ(x,y));//写入显示地址y=0;if(xsfs>10){x=16; //输出十六进制d[y]=0x48; //十六进制显示Hy++;} //else{if(sj<0) //十进制正负数判断{sj=~sj+1;fs=1;} //负号显示使能if(xsfs!=0) xsd=1;//小数点显示使能x=10;} //xc=sj;if(xc!=0) //显示数据不为0;则显示{while(xsd) //判是否需要显示小数{if(xc!=0) //是否还需要计算{sj=xc%x;if(bf|sj!=0) //小数部分为0不需要显示{d[y]=ascll12864[xc%x];y++; //取数的ascll码并显示bf=1; //小数部分不为0标志,小数部分数字有效 }xc/=x; //取剩下的数}else if(bf){d[y]=0x30; //判是否需要补0y++;}else; //小数部分无效,不需要补0xsfs--;if(xsfs==0) //小数点位数减一{xsd=0; //小数计算部分结束标志if(bf){d[y]=0x2e; //小数部分存在有效数字则显示小数点y++;}}}}do{d[y]=ascll12864[xc%x]; //取数的ascll码y++;xc/=x;}while(xc!=0);if(fs){d[y]=0x2d; //取负号ascll码y++;}if(y&&0x01) //如果显示的位数为奇数{d[y]=0x20; //显示一个空格y++;}x=y;y=1;///////////////显示数据//////////////do{LCD12864_XSJ(d[y]);//显示一个地址的前一个字符 y--;LCD12864_XSJ(d[y]);//显示一个地址的后一个字符 y+=3; //跳到下一个要显示的两个字符 }while(y<x); //判断是否显示完毕LCD12864_XZL(0x06);//设置光标右移}/***************************************************** **********LCD12864字符显示函数************************ ****************************************************** *zfc:需要显示的字符串指针,字符数不得超过64个x:显示列,取值范围0-7y:显示行,取值范围0-3*/void LCD12864_ZFXS(unsigned char *zfc,x,y){unsigned char k1,k2,k3;k3=x*2;k1=16-k3;k2=32-k3;k3=48-k3;switch(y) //设置显示地址x和换行标志y{case 0:x|=0x80;y=0;break;case 1:x|=0x90;y=16;break;case 2:x|=0x88;y=32;break;case 3:x|=0x98;y=48;break;default:;}LCD12864_XZL(x);//写显示地址while(*zfc){if(y==k1) LCD12864_XZL(0X90);//换行判断else if(y==k2) LCD12864_XZL(0X88);//换行判断 else if(y==k3) LCD12864_XZL(0X98);//换行判断 else;LCD12864_XSJ(*zfc);//写显示数据y++;/////////////判中文字符/////////if(*zfc>0x7f) zfc++;else{zfc++;if(*zfc>0x7f && y&0x01){LCD12864_XSJ(0x20);y++;}}}}#endif延时函数#ifndef __yscx_C__#define __yscx_C__#include<intrins.h>/*晶振频率33Mhz的stc15系列1T单片机适用*//************************************************** x*us延时函数精度极高,几乎可以忽略延时误差***************************************************/ void YS_us(unsigned char t){for( ;t>0;t--){_nop_();//16*nop_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//16*nop_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//16*nop}_nop_();//12*nop_nop_();_nop_();_nop_();_nop_();_nop_();//12*nop_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();//12*nop}/*--------------------------------------------------- x*1ms延时函数----------------------------------------------------*/ void YS_ms(unsigned char t){for( ;t>0;t--){YS_us(250);YS_us(250);YS_us(250);YS_us(249);}}#endif(注:文档可能无法思考全面,请浏览后下载,供参考。

相关文档
最新文档