基于51单片机实时控制的LCD液晶显示屏循环显示系统
基于MCS-51单片机的液晶显示设计

基于MCS-51单片机的液晶显示设计随着科技的不断发展,电子产品的智能化和小型化需求越来越迫切,因此单片机成为了不可或缺的主要元器件之一。
在众多单片机中,MCS-51单片机由于性能稳定默默无闻地成为了不少工程师的首选。
液晶显示器则是我们日常生活中不可或缺的显示元件之一。
MCS-51单片机设计时可以采用液晶显示来呈现一些基本的信息,如时间、日期、温度、湿度等。
首先需要选择一个适合的液晶模块,本设计选择了1602带背光的液晶模块,其具有亮度高、阅读方便、光学效果好的特点。
当选购好液晶模块之后,需要连接到MCS-51单片机上。
最基本的设计连接如下:- 1602的VSS接地。
- 1602的VDD接+5V电源。
- 1602的VO接一个0-5V变移电位器的中间点,并将其中一端连VSS,另一端接VDD即可。
- 1602的RS与单片机的P1.0相连。
- 1602的RW接地,表示写。
- 1602的E与单片机的P1.1相连。
- 1602的D0-D3不接。
然后就可以开始编写程序。
本设计采用Keil C编译器编写,程序如下:```#include<reg52.h>#define LCD_data P0 // 数据口定义sbit rs = P1^0; //RS接口sbit rw = P1^1; //RW接口sbit en = P1^2; //EN接口void init(); // 初始化函数void write_command(unsigned char command); // 向液晶显示屏写指令函数void write_char(unsigned char dat); // 向液晶显示屏写数据函数void delay_5us(); // 等待函数void delay_do(unsigned char i); // 延时函数/** 初始化函数 **/void init(){write_command(0x38); // 在两行八列的模式下显示。
基于51单片机控制的液晶显示屏C程序设计

点 阵式 L C D其 显 示 原理是 控制 L C D点 阵 中点的亮 暗 , 亮 和 暗 的点阵 按一定 规律 可 以组 成汉 字 , 组 成一 幅图形 和 曲线 等 。
1 . 2 T G1 2 8 6 4内部 结构 及相 关指 令
1 . 2 . 1 T G1 2 8 6 4内部 结构
1 T G1 2 8 6 4液 晶原 理
1 . 1 1 . G1 2 8 6 4显 示原 理
2 应 用 程序设 计
#i n c l u de < r e g 5 1 . h > #d e i f n e uc ha r u ns i g n e d c ha r #d e in f e ui n t u n s i g n e d i n t #d e f i n e di s p
s b i t r e s = P2 " 7;
u c h a r c o d e 妇b [ ] = { 青 海工 业职 业 学 校 * / 0 x 0 1 , 0 x O 0 , 0 x 0 1 , 0 x
0 0 , 0 x 3 0 x F 8 , 0 x 0 1 …l ;
_
功能 : 页地址 存储 在 x地 址计 数 器 中 , A 2 ~ A 0 可表示 8 页 , 读 写 数据 对页 地 址 没 有影 响 , 除本 指 令 可改 变 页地 址 外 , 复位
信号 R S T可把 页地 址 计 数器 内容 清 零 。D B 7 ~ D B 0 = O x b 8 , 显 示从 0页开 始 。
功能 : 列 地 址 存 储 在 Y地 址 计 数 器 中 , 读 写 数 据 对 列 地 址 有影响 , 在对 D D R A M 进行 读 写 操 作 后 ,Y地 址 自动 加 一 。
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单片机的汉字式LCD滚动显示

基于51单片机的汉字式LCD滚动显示作者:胡立波来源:《消费电子》2012年第12期摘要:本文设计了一种以AT89C51单片机为核心的低成本、高精度、微型化LCD汉字滚动显示系统,并使用一些常用芯片如:AMPIRE128×64、SMG12864A等。
系统由单片机、外围电路、单片机最小系统以及显示电路构成。
本系统具有易安装检测、软件功能完善,工作可靠、准确度高等优点。
本文论述了由单片机控制的LCD汉字滚动显示系统的基本原理,并阐述了运用Proteus软件实现系统的设计与仿真以及该系统所应用的领域。
关键词:AT89C51单片机;LCD;Proteus中图分类号:TN702 文献标识码:A 文章编号:1674-7712 (2012) 12-0046-02一、引言亮丽实用的广告牌可以给我们的生活添加光彩、可以给店铺招揽生意。
传统的广告牌都是固定的汉字,并且时间长了会掉色,使汉字模糊难认,这给我们的生活带来很多的不便。
尤其是到了晚上传统的广告牌就失去了作用。
因此我们需要一种造价低廉、使用方便、可以发光、可以方便改变汉字且比较耐用的电子显示广告牌。
二、设计过程及工艺要求(一)基本功能1.可以发光;2.可以滚动;3.可以用电脑改变汉字。
(二)主要技术参数1.单片机选择AT89C51;2.LCD显示器选择SMG12864A或AMPIRE128×64;3.晶振选择12MHz;4.两个输出电容选择30pF;5.两个外围电阻选用10K和100Ω。
本设计的主要任务是显示标语,因此在硬件安装方面需要有适当的面积来安装电子显示屏,并且还要通过数据线把电子显示屏和电脑连起来。
三、系统的总体设计(一)系统设计本设计是基于51单片机的LCD汉字滚动显示,该设计是以AT89C51基本系统为核心的一套应用系统,其中包括单片机、复位电路、外围电路、显示电路、系统软件等部分的设计【1】。
(二)芯片AT89C51介绍AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器, 该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
基于MCS51单片机的LED显示屏控制器设计与实现

基于MCS51单片机的LED显示屏控制器设计与实现一、概述随着科技的飞速发展,LED显示屏已广泛应用于各种公共场合,如商场、车站、广场等,成为信息传播和展示的重要工具。
要使LED 显示屏正常工作并呈现出丰富多彩的视觉效果,就需要一个高效、稳定的控制器。
基于MCS51单片机的LED显示屏控制器,以其性价比高、编程灵活、稳定性强等特点,在LED显示屏控制领域得到了广泛的应用。
MCS51单片机,作为一种经典的8位单片机,自问世以来就在工业自动化、智能仪表、消费类电子等领域发挥着重要作用。
其强大的IO处理能力、灵活的编程方式以及稳定的性能,使得它成为LED显示屏控制器的理想选择。
本文将详细介绍基于MCS51单片机的LED显示屏控制器的设计与实现过程。
我们将对LED显示屏的基本原理和工作方式进行阐述,接着分析MCS51单片机的特点和在LED显示屏控制中的应用优势。
我们将从硬件设计和软件编程两个方面,详细介绍如何构建一个稳定、高效的LED显示屏控制器。
我们将通过实例展示,验证所设计的LED显示屏控制器的实际效果和应用价值。
通过本文的阅读,读者将能够深入了解基于MCS51单片机的LED 显示屏控制器的设计与实现过程,为实际工程项目中的LED显示屏控制器的设计与开发提供有益的参考和借鉴。
1. LED显示屏的发展背景和应用领域随着科技的飞速发展,信息显示技术也取得了巨大的进步。
LED 显示屏作为一种先进的显示技术,以其高亮度、高清晰度、色彩鲜艳、寿命长、功耗低等优点,逐渐在各个领域取代了传统的显示设备。
LED 显示屏的发展背景和应用领域广泛,为现代社会的信息传播和视觉呈现提供了强有力的支持。
在LED显示屏的发展背景方面,其技术进步是扩大市场需求及应用的最大推动力。
随着半导体材料和芯片制造技术的不断突破,LED 的性能得到了极大的提升,从而推动了LED显示屏的快速发展。
同时,随着大规模集成电路和计算机技术的不断进步,LED显示屏的控制技术也得到了显著提升,使得LED显示屏在显示效果、稳定性和可靠性等方面都有了很大的提高。
(完整版)基于51单片机大屏幕显示

电子系统设计报告--大屏幕显示器系队别:三系一队刘歌声3222008041朱燕豪 3222008021陈韬3222008022一、实验目的通过设计一个基于单片机的大屏幕显示器系统学习掌握51系列单片机的原理,编程方法及51系列单片机的具体应用,提高自身的编程能力。
巩固三电综合能力,提高应用能力。
二、设计任务与要求1、任务设计制作一个大屏幕显示器。
2、要求1)基本要求(1)显示器点阵数目至少8*8,能够显示汉字。
(2)能够用多种扫描方式进行显示。
(3)显示器的亮度可以调节。
2)发挥部分(1)把基本要求的设计扩展成一个能够显示多个汉字的字符屏。
(2)利用微机的RS-232接口传送数据,随时改变显示的内容。
三、总体论证本设计采用Atmel公司的高性能的位单片机89C51作为核心芯片的电路来实现,主要由AT89C51芯片、时钟电路、复位电路、列扫描驱动电路(74LS245)、8×8 LED点阵5部分组成,我们在实际应用中只是将LED点阵的8条行线直接接在P0口和P3口,至于列选扫描信号则是由译码器74LS245来选择控制,这样一来列选控制只使用了单片机的4个IO口,节约了很多IO资源,为单片机系统扩充使用功能提供了条件。
汉字扫描显示的基本过程是这样的:通电后使单片机的RST复位脚电平先高后低,从而达到复位。
之后,在单片机内部时钟电路的作用下,单片机89C51按照设定的程序在P0和P3接口输出与内部汉字对应的代码电平送至LED点阵的行选线(高电平驱动),接口输出列选扫描信号(低电平驱动),从而选中相应的象素LED发光,并利用人眼的视觉暂留特性合成整个汉字的显示。
同时通过调整导通的时间与电流,可实现高亮度稳定的显示。
四、系统设计1.硬件仿真设计当我们拿到题目的时候不知道从何下手,特别是不知道用到什么器件以及如何对他们进行仿真。
后来教员给了我们初步的器件模块,我们的主要目的就是还原电路图并写出它的汇编代码程序。
基于51单片机控制LCD1602液晶屏显示

基于51单⽚机控制LCD1602液晶屏显⽰LCD1602⼀共有16个接⼝,其中RS,RW,EN,D0,D1,D2,D3,D4,D5,D6,D7⽤于读写数据也就是说是并⾏通信。
判断液晶忙:判断STA7是否为1,所以将P0⼝总线的数据和0x80(1000 0000)进⾏与运算。
每次对1602写指令都需要判断是否忙。
void Read_busy(){uchar busy;P0 = 0xff;RS = 0;RW = 1;do{EN = 1;busy = P0;EN = 0;}while(busy & 0x80);}写字节和写数据都是按照1602的数据⼿册来写的。
写LCD1602命令⼀个字节:void Write_Cmd(uchar cmd){Read_busy();RS = 0;RW = 0;P0 = cmd;EN = 1;EN = 0;}写⼀个字节数据:void Write_Dat(uchar dat){Read_busy();RS = 1;RW = 0;P0 = dat;EN = 1;EN = 0;}由上⾯的函数,就可以初始化LCD1602。
1602初始化函数:void Init_LCD1602(){LCD1602_Write_Cmd(0x38); //设置16*2显⽰,5*7点阵,8位数据接⼝LCD1602_Write_Cmd(0x0c); //开显⽰,不显⽰光标(0xf开显⽰,显⽰光标,光标闪烁)LCD1602_Write_Cmd(0x01); //清除显⽰LCD1602_Write_Cmd(0x06); //读写⼀字节后地址指针加1 Write_Cmd(0x80 | 0x00); //设置显⽰地址(显⽰在第⼀⾏第⼀个)设置显⽰地址以及设置读写地址指针⽅向⼀定要在清除显⽰之后要不然仍会显⽰在第⼀个格)LCD1602RAM在显⽰数字的时候要⽤ Write_Dat(3 + '0');显⽰字母使⽤ASCLL码(例如:显⽰H:Write_Dat(0x48);)在指定位置显⽰⼀个字符:要显⽰的横坐标取值0-40要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)dat:需要显⽰的数据以ASCLL形式显⽰void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);LCD1602_Write_Dat(dat);}显⽰字符串的时候就需要⽤到指针:在指定位置显⽰字符串:要显⽰的横坐标取值0-40要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)*str:需要显⽰的字符串void LCD1602_Dis_Str(uchar x, uchar y, uchar *str){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);while(*str != '\0'){LCD1602_Write_Dat(*str++);}}调⽤⽅式:uchar TestStr[] = {"Welcome!"};LCD1602_Dis_Str(0, 0, &TestStr[0]);显⽰简单的数字:#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit RS = P3^5;sbit RW = P3^6;sbit EN = P3^4;void Read_busy() //判断液晶忙{uchar busy;P0 = 0xff;RS = 0;RW = 1;do{EN = 1;busy = P0;EN = 0;}while(busy & 0x80);}void Write_Cmd(uchar cmd) //写LCD1602命令⼀个字节{Read_busy();RS = 0;RW = 0;P0 = cmd;EN = 1;EN = 0;}void Write_Dat(uchar dat) //写⼀个字节数据{Read_busy();RS = 1;RW = 0;P0 = dat;EN = 1;EN = 0;}void main(){Write_Cmd(0x38);//设置16*2显⽰Write_Cmd(0x0f);//开显⽰显⽰光标,光标闪烁Write_Cmd(0x01);//清屏Write_Cmd(0x06);//地址指针移位命令Write_Cmd(0x80 | 0x00);//显⽰地址Write_Dat(1 + '0');Write_Dat(2 + '0');Write_Dat(3 + '0');Write_Dat(4 + '0');Write_Dat(5 + '0');while(1);}显⽰字符串:#include <reg52.h>typedef unsigned char uchar;typedef unsigned int uint;#define LCD1602_DB P0 //LCD1602数据总线sbit LCD1602_RS = P3^5; //RS端sbit LCD1602_RW = P3^6; //RW端sbit LCD1602_EN = P3^4; //EN端sbit DU = P2^6;//sbit WE = P2^7;//数码管位选段选⽤于关闭数码管显⽰/*=================================================*函数名称:Read_Busy*函数功能:判断1602液晶忙,并等待=================================================*/void Read_Busy(){uchar busy;LCD1602_DB = 0xff;//复位数据总线LCD1602_RS = 0; //拉低RSLCD1602_RW = 1; //拉⾼RW读do{LCD1602_EN = 1;//使能ENbusy = LCD1602_DB;//读回数据LCD1602_EN = 0; //拉低使能以便于下⼀次产⽣上升沿}while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表⽰忙,程序等待}/*=================================================*函数名称:LCD1602_Write_Cmd*函数功能:写LCD1602命令*调⽤:Read_Busy();*输⼊:cmd:要写的命令=================================================*/void LCD1602_Write_Cmd(uchar cmd){Read_Busy(); //判断忙,忙则等待LCD1602_RS = 0;LCD1602_RW = 0; //拉低RS、RW操作时序情况1602课件下中⽂使⽤说明基本操作时序章节 LCD1602_DB = cmd;//写⼊命令LCD1602_EN = 1; //拉⾼使能端数据被传输到LCD1602内LCD1602_EN = 0; //拉低使能以便于下⼀次产⽣上升沿}/*=================================================*函数名称:LCD1602_Write_Dat*函数功能:写LCD1602数据*调⽤:Read_Busy();*输⼊:dat:需要写⼊的数据=================================================*/void LCD1602_Write_Dat(uchar dat){Read_Busy();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_EN = 1;LCD1602_EN = 0;}/*=================================================*函数名称:LCD1602_Dis_OneChar*函数功能:在指定位置显⽰⼀个字符*调⽤:LCD1602_Write_Cmd(); LCD1602_Write_Dat();*输⼊:x:要显⽰的横坐标取值0-40,y:要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)dat:需要显⽰的数据以ASCLL形式显⽰=================================================*/void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);LCD1602_Write_Dat(dat);}/*=================================================*函数名称:LCD1602_Dis_Str*函数功能:在指定位置显⽰字符串*调⽤:LCD1602_Write_Cmd(); LCD1602_Write_Dat();*输⼊:x:要显⽰的横坐标取值0-40,y:要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)*str:需要显⽰的字符串=================================================*/void LCD1602_Dis_Str(uchar x, uchar y, uchar *str){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);while(*str != '\0'){LCD1602_Write_Dat(*str++);}}/*=================================================*函数名称:Init_LCD1602*函数功能:1602初始化*调⽤: LCD1602_Write_Cmd();=================================================*/void Init_LCD1602(){LCD1602_Write_Cmd(0x38); // 设置16*2显⽰,5*7点阵,8位数据接⼝ LCD1602_Write_Cmd(0x0c); //开显⽰LCD1602_Write_Cmd(0x06); //读写⼀字节后地址指针加1LCD1602_Write_Cmd(0x01); //清除显⽰}void main(){uchar TestStr[] = {"Welcome!"};DU = 0;WE = 0;//关闭数码管显⽰Init_LCD1602();//1602初始化LCD1602_Dis_Str(0, 0, &TestStr[0]); //显⽰字符串LCD1602_Dis_OneChar(10, 1, 0xff); //显⽰⼀个⿊⽅格while(1);}。
基于51单片机实时控制的LCD液晶显示屏循环显示系统

本文研制一种基于51单片机实时控制的LCD液晶显示屏循环显示系统。硬件系统由单片机最小系统和液晶显示系统组成。此次课程设计采用AT89C51型单片机和12864点阵型LCD液晶显示器来实现。LCD上要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。要想实现循环移动,只需不断改变图片的字模数据在液晶面板上的显示位置(RAM地址)即可。程序采用C语言编写,使用Keil编译器进行编译。
#define FIRSTROW 0xc0 //显示起始行设置,参考指令表,在0到63行选择
#define SETY 0xb8 //Y方向,8页64行,参考指令表,[2..0]在0到8页选择
#define SETX 0x40 //X方向,半屏64列,参考指令表,在0到63列选择
/*与硬件相关的编址设计*/
}
while((temp|0x7f)==0xff);//检测D7是否为1,1表示LCD忙,如果忙,继续检测,直到空闲止
}
3.1.5 命令/数据写入函数
函数lcd_cmd_wr将命令写入LCM模块;
void lcd_cmd_wr(unsigned char cmdcode, unsigned char right)
例如点亮128*64的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数据00010000写入Xpage=2,Yaddress=29的存储单元中即点亮(20,30)上的液晶点。
{
unsigned char i,j;
for(i=0;i<8;i++)
{
//页地址设定
基于51单片机控制的液晶显示屏C程序设计

基于51单片机控制的液晶显示屏C程序设计作者:付文莉来源:《硅谷》2013年第05期摘要点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线和汉字。
本文介绍了采用C语言实现对液晶显示器TG12864的控制。
关键词单片机;C语言;TG12864;液晶显示中图分类号:TP271 文献标识码:A 文章编号:1671—7597(2013)031-017-021 TG12864液晶原理1.1 TG12864显示原理点阵式LCD其显示原理是控制LCD点阵中点的亮暗,亮和暗的点阵按一定规律可以组成汉字,组成一幅图形和曲线等。
1.2 TG12864内部结构及相关指令1.2.1 TG12864内部结构TG12864是一种图形点阵液晶显示器,它主要由行驱动器、列驱动器及128×64全点阵液晶显示器组成,有20个外部引脚。
可以由单片机控制显示8×4个16×16点阵汉字。
1.2.2 TG12864相关指令该类液晶显示模块的指令系统比较简单,总共有七种。
1)显示开关指令。
功能:设置屏幕显示开/关,DB0=1,开显示;DB0=0,关显示。
DB7~DB0=0x3f,开显示;DB7~DB0=0x3e,关显示。
2)显示起始行设置。
功能:显示起始行是由Z地址计数器控制的,该命令自动将A0~A5位地址送入Z地址计数器,起始地址可以是0~63范围内任意一行。
Z地址计数器具有循环计数功能,用于显示行扫面同步,当扫描完一行后自动加一。
DB7~DB0=0xc0,显示从0行开始。
3)页设置。
功能:页地址存储在X地址计数器中,A2~A0可表示8页,读写数据对页地址没有影响,除本指令可改变页地址外,复位信号RST可把页地址计数器内容清零。
DB7~DB0=0xb8,显示从0页开始。
4)列地址设置。
功能:列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DDRAM进行读写操作后,Y地址自动加一。
DB7~DB0=0x40,显示从0列开始。
51单片机控制LCD12864液晶屏显示图形菜单

51单片机控制LCD12864液晶屏显示图形菜单想了很久,每次做菜单都受限于12864字符模式的各种限制,比如字体大小,不能显示图标等等,没有任何效果,这次就来个彻底的解脱,写一个单函数就能完成所有功能的函数,只需要2个图片就能完成任意菜单内容的菜单,可以有2的8次方=256个选择结果,应该能满足所有的要求了吧?菜单的内容就是图片的内容,因此可以显示任意大小的图形文字混合的菜单条目,比如使用字符模式,一屏只能显示4行菜单(64/16=4),且只能显示汉字和字符等,显示位置等等的都受限,而这个方法可以显示比如12*12(64/12=5行)的字符,8*8(64/8=8行)的字符,甚至不是字符,可以是图标+文字+任意其他的图像,只要是图片能显示的,都可以。
哈哈,比较复杂,现在只写了一少半,预期能够提供多种显示效果,希望我能完成。
void Lcd_Draw_BmpMenu(UINT8 *pMenu,UINT8*pTitleBmp,UINT8 *pMenuBmp){/*使用2张图片作为纯图形菜单来选择和操作,返回被选择的项,pMenu是一个指向菜单的各种参数的结构体的指针,pTitleBmp指向作为菜单标题的一张图片,pMenuBmp指向作为菜单内容的图片(液晶的控制芯片是ST7920)yx-->;>;|\|/*/xdata struct { //除非另有说明x坐标均为大列的坐标,一个大列是16个像素,一行共有8大列数据//========= 以下是入参基本参数,一旦确定,最好不要随意更改 ======UINT8 Title_x;//标题图片在屏幕上的显示起始位置X UINT8 Title_y;//标题图片在屏幕上的显示起始位置Y UINT8 Title_Len_x;//标题图片的宽UINT8 Title_Len_y;//标题图片的高UINT8 Menu_x;//菜单在屏幕上的显示起始位置XUINT8 Menu_y;//菜单在屏幕上的显示起始位置YUINT8 Menu_End_y;//菜单在屏幕上的显示结束位置Y UINT8 Menu_Bmp_x;//菜单图片的宽UINT8 Menu_Bmp_y;//菜单图片的高UINT8 Menu_Item_Height;//每一菜单项的高度(像素为单位)UINT8 Line_x;//最后下划线的起始坐标xUINT8 Line_y;//最后下划线的起始坐标YUINT8 Line_Len;//最后下划线的长度,如果为0,则表示不画出这条线(像素为单位)//====== 以下是菜单的风格设置 ========UINT8 Scroll_Speed;//菜单滚动的速度,0~9个级别,越低越快,越高越慢(液晶屏显示速度有快有慢,调整这个参数用于适用不同的液晶屏UINT8 Continue_Scroll;//指定菜单是否可以形成一个连续滚动选择的效果;0不连续,背景和反白位置都会根据实际情况滚动 1菜单连续滚动,反白位置不动UINT8 RePaint;//=0不重画菜单,=1重画整个菜单的图像,一般都是首次调用本函数的时候置1,用于画出整个菜单,以后调用置0就可以了UINT8 MenuEffect;//菜单运动的效果;0没有任何效果,只是最普通的菜单形态,1平滑滚动,2平滑滚动,具有惯性效果,3具有减速效果,没有惯性效果,4具有减速和惯性效果//====== 以下用于控制菜单的选择参数 =======UINT8 Last_Select_Item;//上次执行本函数后,所选择的菜单项UINT8 Select_Item;//本次执行本函数,要选择的菜单项}M;//============== 以下是变量定义 =============== UINT8 xdata Menu_Item_Count;//总共有几个菜单项UINT8 xdata Menu_Screen_Count;//当前一屏最多可以显示几个菜单项UINT8 xdataMenu_Box_x,Menu_Box_y,Menu_Box_End_x,Menu_Box_End _y;//需要刷新的区域的坐标UINT8 *pMenu_Box_Bmp;//需要显示的菜单项的指针StructCopy(&M.Title_x,pMenu,19);//把参数复制到本函数内,便于操作Menu_Item_Count=M.Menu_Bmp_y/M.Menu_Item_Height;/ /总共有几个菜单项Menu_Screen_Count=(M.Menu_End_y-M.Menu_y)/M.Menu_ Item_Height;//一屏最多可以显示多少项菜单//---------------------------------------------------------------------------if(M.RePaint==1)//如果需要重画整个菜单图像{Lcd_Draw_BMP(M.Title_x,M.Title_y,M.Title_x+M.Title_Len_x,M.Title_y+M.Title_Len_y,pTitleBmp);//画出标题的图片if(M.Line_Len!=0)Lcd_DrawRowLine(M.Line_x,M.Line_y,M.Line_Len,1);/ /画出最下面的线}//---------------------------------------------------------------------------//-----------需要刷新的图像的区域Menu_Box_x=M.Menu_x;Menu_Box_y=M.Menu_y;Menu_Box_End_x=M.Menu_x+M.Menu_Bmp_x;Menu_Box_End_y=M.Menu_End_y;。
基于5单片机的液晶显示屏控制系统设计

基于51单片机的液晶显示屏控制系统设计欧阳歌谷(2021.02.01)1 概述1.1系统布景液晶显示器件在中国已有二十余年的成长历史。
二十余年来,液晶显示器件从实验室走向年夜规模生产集团,形成了自力的财产部分。
现在,液晶显示几乎已经应用于生产,生活的各个领域,人们几乎时时处处都要与这一神奇而又普通的面孔打交道。
液晶显示是集单片机技术、微电子技术、信息处理于一体的新型显示方法。
由于液晶显示器具有高压低功耗,显示信息量年夜易于黑色化,无电磁辐射,长寿命,无污染等特点。
LCD是目前显示财产中成长速度最快,市场应用最广的显示器件,成为众多显示媒体中的佼佼者,在越来越多的领域中阐扬作用,是目前显示器件中一个理想的选择。
LCD在监控系统中的应用:目前年夜大都监控系统自带的显示系统为LED数码管显示,这样显示效果比较单一,只能显示监控系统的丈量值。
而LCD液晶显示器不但可以显示数值、汉字等,并且可以显示文本和图形。
利用LCD和键盘实现人机交互,使监控系统自力工作成为可能。
通过监控系统对现场的单回路控制器进行参数设置,对各个单回路控制器的工作进行监控。
LCD在时钟中的应用:在日常生活中我们会经常看到时间的显示,这些显示年夜都是采取液晶显示器来显示的,而对其中的汉字无法用显示来解决。
我们利用LCD液晶模块制成的小屏幕实现了时间的显示,显示格式为“时时:分分:秒秒”。
另外,可以增加闹钟功能,时间到了则产生音乐声;还可以增加万年历显示“年月日”等多项功能。
LCD在年夜屏幕显示中的应用:年夜屏幕显示的应用规模极广,随着社会成长,公众生活的加强,人们对能够面向广年夜公众传递信息的显示装置越来越感到必须。
使用液晶投影显示年夜屏幕,不但有投影仪,指挥用年夜屏幕,还有液晶投影黑色电视。
它可以用一个体积很小的系统装置,实现100英寸以上的很是漂亮的年夜屏幕电视显示。
它与传统的显示媒体相比,具有辩白率极高,透过性好,显示内容丰富,黑色易于控制等优点。
基于51单片机的TFT液晶显示设计

基于51单片机的TFT液晶显示设计0 引言51单片机作为一种常见的通用单片机,虽然其内部资源,处理速度等都无法与新型高速单片机相提并论,但其低廉的价格,极低的入门难度以及适用于简单场合应用等特点,依然是开发者的常用选择之一。
用51单片机驱动液晶模块通常都使用1602和12864等极为简单的液晶模块,这里介绍用51单片机驱动QVGA分辨率的TFT液晶模块,以实现彩色和更为复杂的内容显示的方法。
同时,本文还将使用DS1302芯片和DS18B20芯片来实现在液晶屏上显示实时时钟和温度。
1 硬件设计本系统硬件电路的设计主要包括单片机最小系统电路, TFT液晶显示电路,时钟电路,设置电路以及温度采集电路。
其系统工作原理框图。
图1 硬件系统原理框图1.1 单片机最小系统一个单片机的最小系统包括外部晶振、电源、复位电路等,这是保证单片机正常工作的必要条件。
通过单片机可控制整个系统,包括读取DS18B20芯片的温度数据,读取/写入DS1302芯片的日历时钟数据,检测是否有按键按下并进行相应的操作,最后还要向显示驱动芯片写入数据,以使得TFT液晶屏上能够显示所需的内容。
1.2 液晶显示电路驱动TFT液晶面板的芯片有多种选择,本文使用的是台湾奕力科技的ILI9325芯片。
该芯片能够支持320×240 (QVGA) 分辨率,同时内置173KB的RAM,故其最高能显示26万色。
ILI9325支持的接口方式有8/9/16/18位i80系统总线、SPI总线、RGB接口和VSYNC 接口。
它的总线式接口电路方式是把液晶显示器看作外部的数据存储器,它访问液晶显示器就像访问数据存储器的一个单元一样,采用这种方式能充分发挥单片机的总线读写功能优势,而且便于升级和扩展。
由于本文采用的STC89C54RD+单片机并没有SPI总线,因此,为了节约IO的使用,本文最终采用8位系统总线的方式来连接ILI9325芯片。
其显示部分电路。
单片机与液晶显示屏的连接与控制

单片机与液晶显示屏的连接与控制随着科技的不断发展,单片机和液晶显示屏的应用日益广泛。
单片机作为一种集成电路芯片,在各种电子设备中起着至关重要的作用。
而液晶显示屏则是现代电子设备中常见的一种显示器件。
本文将探讨单片机与液晶显示屏的连接和控制方法。
一、硬件连接单片机与液晶显示屏的连接可以通过接口电路来实现。
液晶显示屏通常具有一定数量的引脚,其中包括数据引脚、控制引脚、电源引脚等。
而单片机也具有相应的引脚用于与液晶显示屏进行连接。
具体的连接方法可以根据不同的单片机和液晶显示屏型号而略有不同。
例如,当我们使用的单片机为51系列,而液晶显示屏为16x2字符型液晶显示屏时,可以通过以下步骤进行连接:1. 将液晶显示屏的VSS引脚与单片机的地引脚连接;2. 将液晶显示屏的VDD引脚与单片机的正引脚连接;3. 将液晶显示屏的VO引脚通过一个可调电阻连接到地引脚,以调整液晶显示屏的对比度;4. 将液晶显示屏的RS引脚与单片机的一个IO引脚连接,用于选择数据或命令传输;5. 将液晶显示屏的RW引脚与单片机的另一个IO引脚连接,用于选择读写操作;6. 将液晶显示屏的E引脚与单片机的另一个IO引脚连接,用于产生时钟信号;7. 将液晶显示屏的D0-D7引脚依次与单片机的IO引脚连接,用于传输数据。
通过以上连接,单片机与液晶显示屏之间便建立了物理连接,为接下来的控制提供了基础。
二、控制方法在硬件连接完成后,我们可以通过编写单片机的程序代码来控制液晶显示屏的显示内容。
以51系列单片机为例,下面是一个简单的控制液晶显示屏显示“Hello, World!”的程序:```C#include <reg51.h> // 包含51系列单片机的寄存器定义sbit RS = P0^0; // 定义RS引脚为P0口的第0位sbit RW = P0^1; // 定义RW引脚为P0口的第1位sbit E = P0^2; // 定义E引脚为P0口的第2位// 液晶显示屏命令函数void LCD_Cmd(unsigned char cmd) {RS = 0; // RS引脚置低,选择命令传输RW = 0; // RW引脚置低,选择写操作E = 1; // E引脚置高P2 = cmd; // 将命令写入P2口E = 0; // E引脚置低,产生上升沿以触发命令传输}// 液晶显示屏数据函数void LCD_Data(unsigned char dat) {RS = 1; // RS引脚置高,选择数据传输RW = 0; // RW引脚置低,选择写操作E = 1; // E引脚置高P2 = dat; // 将数据写入P2口E = 0; // E引脚置低,产生上升沿以触发数据传输}// 延时函数void Delay() {unsigned int i, j;for(i=0; i<100; i++)for(j=0; j<1000; j++);}// 主程序void main() {LCD_Cmd(0x38); // 初始化液晶显示屏,设置为8位数据总线、2行显示、5x7点阵字体Delay();LCD_Cmd(0x0C); // 打开液晶显示屏,设置光标不显示、光标不闪烁、整体显示Delay();LCD_Cmd(0x01); // 清除液晶显示屏的显示内容Delay();LCD_Cmd(0x80); // 设置光标位置为第一行第一列// 显示“Hello, World!”LCD_Data('H');LCD_Data('e');LCD_Data('l');LCD_Data('l');LCD_Data('o');LCD_Data(',');LCD_Data(' ');LCD_Data('W');LCD_Data('o');LCD_Data('r');LCD_Data('l');LCD_Data('d');LCD_Data('!');while(1); // 程序循环执行}```通过以上程序,我们可以看到,通过单片机的IO引脚分别控制液晶显示屏的RS引脚、RW引脚和E引脚,可以向液晶显示屏发送命令或数据。
基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))

液晶LCD1602显示字符和数字程序源代码/***********************液晶LCD1602测试程序源代码*************************单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:液晶LCD1602显示功能测试。
操作说明:液晶LCD1602显示字符和倒计时。
**************************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define Busy 0x80 //LCD忙sbit LCD_D0 = P0^0; //LCD_D0对应P0.0sbit LCD_D1 = P0^1; //LCD_D1对应P0.1sbit LCD_D2 = P0^2; //LCD_D2对应P0.2sbit LCD_D3 = P0^3; //LCD_D3对应P0.3sbit LCD_D4 = P0^4; //LCD_D4对应P0.4sbit LCD_D5 = P0^5; //LCD_D5对应P0.5sbit LCD_D6 = P0^6; //LCD_D6对应P0.6sbit LCD_D7 = P0^7; //LCD_D7对应P0.7sbit LCD_RS = P1^0; //LCD_RS对应P1.0sbit LCD_RW = P1^1; //LCD_RW对应P1.1sbit LCD_EN = P3^4; //LCD_EN对应P3.4void delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //5Ms延时函数void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(void); //LCD初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//LCD显示一个字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//LCD显示一个字符串unsigned char code welcome[] = {"Hello My Friends"};//液晶LCD1602显示Hello My Friendsunsigned char code countdown[] = {"CountDown: S"};//液晶LCD1602显示CountDown: Svoid delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i=3;while(i--)delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--){delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P0M1 = P3M1&0x00;P0M0 = P3M0&0x00;P1M1 = P3M1&0xfc;P1M0 = P3M0&0xfc;P3M1 = P4M1&0xef;P3M0 = P4M0&0xef;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 1; //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 1; //LCD管脚E设置成高电平while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 0; //LCD管脚RW设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时P0 = WCLCD; //将数据送入P0口,即写入指令或地址_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 1; //LCD管脚RS设置成高电平LCD_RW = 0; //LCD管脚RW设置成低电平P0 = WDLCD;//将数据送入P0口,即将数据写入液晶模块_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void LCDInit(void) //LCD初始化{WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(DData); //发送数据}void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}void main(void){GPIO_1602_Configuration(); //LCD1602液晶IO口初始化delay_ms(10); //延时LCDInit(); //LCD1602初始化delay_ms(10); //延时DisplayListChar(0,0,welcome); //LCD1602显示Hello My Friends delay_ms(10); //延时DisplayListChar(0,1,countdown); //LCD1602显示CountDown: S delay_ms(10); //延时DisplayOneChar(14,1,0x39); //LCD1602显示9delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x38); //LCD1602显示8delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x37); //LCD1602显示7delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x36); //LCD1602显示6delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x35); //LCD1602显示5delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x34); //LCD1602显示4delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x33); //LCD1602显示3delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x32); //LCD1602显示2delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x31); //LCD1602显示1delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x30); //LCD1602显示0delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时while(1){;}}程序源代码是编译通过并在电路板上测试过参考液晶LCD1602接口电路图该程序的实际运行效果。
利用51单片机、LCD显示器设计一个单片机显示系统,要求在液晶上显示“HELLO,PROTUS”

[4] 张洪润,张亚凡.传感器技术与应用教程[M].北京:清华大学出版社,2005.
[5] 张毅刚,刘杰.AT89S52单片机原理及应用[M].哈尔滨:哈尔滨工业大学出版社,2004.
[6] 黄河,郭纪林.单片机原理及应用[M].大连:大连理工大学出版社, 2006.
图2AT89C51引脚图
引脚功能说明:
VCC:电源电压。
GND:接地。
P0 口:一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。在Flash编程中,P0口接收指令字节;在校验时,输出指令字节,校验时,要求外接上拉电阻。
表1P3口的引脚的第二功能
端口引脚
第二功能
P3.0
RXT(串行输入口)P3.1ຫໍສະໝຸດ TXD(串行输出口)P3.2
INT0(外中断0)
P3.3
INT1(外中断1)
P3.4
T0(定时/计数器0)
P3.5
T1(定时/计数器1)
P3.6
WR(外部数据存储器写选通)
P3.7
RD(外部数据存储器读选通)
RST:复位输入。在振荡器工作时,该引脚出现两个机器周期以上的高电平将使单片机复位。
图5振荡电路模块
2.5系统电路设计
系统电路图如下图所示,其中单片机的P1口用来对LCD进行数据的发送,P3.6口用来控制LCD的读写操作,P3.7口用来控制LCD的使能信号。
图6系统电路图
第3章 流程图绘制以及说明
LCD显示程序设计如图7所示,将48H-55H单元设置成LCD显示缓冲区,分别存放LCD要显示的数据“HELLO PROTEUS!”,将LCD的代码存于TABL E列表中。当调用显示程序时,根据预先记录的个数决定LCD显示的位数。这样就得到了显示程序的入口。
基于51单片机的液晶显示器控制电路设计

3液晶显示模块简介
液晶显示模块单元电路主要包括显示控制器、行驱动器、列驱动器、电源偏置电路、显示存储器、液晶显示屏、液晶显示模块接口。
1.2系统概述
本实验系统分为单片机最小系统板和液晶显示屏两部分。单片机最小系统负责接收个人计算机所编辑的文本及内容,通过RS232串行接口通信完成单片机与PC机之间的数据传送,而个人计算机(即PC机),主要完成显示内容的编辑、字符码的查找、字符数据的发送等工作。基于Windows操作系统下的文本编辑软件有很多种,例如:记事本、Micorsoft Word、写字板等,我们可以采用任何一种编辑软件将要显示的内容(包括汉字、中英文字母、标点符号等)编辑成一个文本文件,然后通过已经编写好的应用程序在特定的字库中依次搜索到文本文件中的内容,并且取出该字符的字模数据,此项工作称为字模数据的提取;字模数据文件的生成也就是将取出的字模按顺序存放到一个十六进制文件中;字符数据建立好之后将其存放在PC机的硬盘上,等到需要的时候通过串行通信软件将字符数据文件发送给液晶显示系统模块。
随着计算机技术及电子通信技术的发展,LCD显示屏作为一种新的传媒工具,现已经应用到商业、军事、车站、宾馆、体育、新闻、金融、证券、广告以及交通运输等许多行业,大到几十平方米的大屏幕,小到家庭影院用的图文显示屏,以及政府部门应用的电子黑板,证券、银行等部门用的信息数字混合屏。LCD显示屏带来广泛的社会效益和经济效益,具有良好的发展前景。
关键词:液晶显示器89C51 串行通信 单片机
Abstract
This article designs with develops one kind based on51 SCM(Single Chip Microcomputer )thereal-time control LCD display monitor control system. Thissystem is composed by onSCM smallsystemand LCD display system, on thePCmachine carries on the demonstrationcontent the edition and matrix data withdrawing;LCDdisplaysystem controls the moduleand certain LCD by the hostdemonstrated the moduleT6963Ccomposes, the host controls the moduleT6963Cto beresponsible for in the receive theSCMmatrix data andcontrols each demonstration module work, demonstrated the module takethe host controls the module T6963Cas a core, controls the LCD displaymonitordisplay,In order to the convenient system expands, between various modulesconnection uses meets inserts the type structure,between the SCM and PC machineto use the RS-232 standard to carry on the data and the order serialcommunication. This article not only has carried on the whole planfrom the overall to the system, but also in detail introduced takemodule design as the example the PC machine matrix withdraws, thematrix data transmission, the monolithic integrated circuit serialreceive data, theLCD display monitordisplayand so on the partial software andhardware design and the realization process.Its advantage hardware circuit is simple, the software is with perfect function, the control system is reliable, higher characteristic of the sex price, and has certain use and reference value.
51单片机频率计设计(LCD显示)[1]
![51单片机频率计设计(LCD显示)[1]](https://img.taocdn.com/s3/m/67c6b0ec03d8ce2f0166233b.png)
51单片机频率计设计(LCD显示)[1]————————————————————————————————作者:————————————————————————————————日期://单片机89C51的数字频率计C程序:#include 〈AT89x51。
h>#include 〈stdio。
h〉#include <math.h>#include 〈intrins.h〉float f;//频率float p; //周期float sj;float mk; //脉宽char idata buff[20];char xs=0;//设置闸门时间结束后是否显示结果的标志位unsigned char m=0,n=0,yichu=0,fenpin;//m定时中断次数n计数中断次数yichu判断是定时器还是sbit B153=P2^4;sbit A153=P2^3;sbit P35=P3^5;unsigned char LCD_Wait(void);void LCD_Write(bit style,unsigned char input);void LCD_SetDisplay(unsigned char DisplayMode);void LCD_SetInput(unsigned char InputMode);void LCD_Initial();void GotoXY(unsigned char x, unsigned char y);void Print(unsigned char *str);void C51_Initial();void Delay(unsigned int t);void display(float f);void cepin();void panduan();void Mkdisplay(float mk);void ccpin();/***************************************** 模块名称:LCD1602显示程序*****************************************//***********************端口定义***********************************/sbit LcdRs= P2^0;sbit LcdRw= P2^1;sbit LcdEn= P2^2;sfr DBPort= 0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/************************内部等待函数********************************/unsigned char LCD_Wait(void){LcdRs=0;//寄存器选择输入端1:数据0:指令LcdRw=1;_nop_(); //RW:为0:写状态;为1:读状态;LcdEn=1; _nop_();//使能输入端,读状态,高电平有效;写状态,下降沿有效LcdEn=0;return DBPort;}/***********************向LCD写入命令或数据*********************************/#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style,unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input; _nop_();//注意顺序LcdEn=1; _nop_();//注意顺序LcdEn=0;_nop_();LCD_Wait();}/********************设置显示模式****************************************/#define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode);}/*********************设置输入模式***************************************/#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}/******************初始化LCD******************************************/void LCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示,无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增,画面不动}/*****************************LCD**************************************/void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}void Print(unsigned char *str){while(*str!=’\0'){LCD_Write(LCD_DA TA,*str);str++;}}/***************************89c51初始化************************************/void C51_Initial(){sj=1000000.00;TMOD=0x51; // 01010001 T1为计数器,T0为定时器EA=1;ET0=1;ET1=1;EX0=1;PX0=1; //外部中断0设置为高优先级IT0=0; //电平触发方式}/**************************ms延时子程序***************************/void Delay(unsigned int t) //t随着数值越大,误差趋于平衡。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文研制一种基于51单片机实时控制的LCD液晶显示屏循环显示系统。硬件系统由单片机最小系统和液晶显示系统组成。此次课程设计采用AT89C51型单片机和12864点阵型LCD液晶显示器来实现。LCD上要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。要想实现循环移动,只需不断改变图片的字模数据在液晶面板上的显示位置(RAM地址)即可。程序采用C语言编写,使用Keil编译器进行编译。
本次课程设计使用12864LCD实现。12864LCD是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。可完成图形显示,也可以显示8×4个(16×16点阵)汉字。下面以12864液晶显示器为例,介绍其用法。一般12864液晶显示器实物如图1-1所示:
图1-112864液晶显示器实物图
液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
1.1.3 12864LCD简介
为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。存放一个显示块的RAM区称为存储页。即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息。因此存储单元地址包括页地址(Xpage,0~7)和列地址(Yaddress,0~63)。
例如点亮128*64的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数据00010000写入Xpage=2,Yaddress=29的存储单元中即点亮(20,30)上的液晶点。
0/1
输入
复位信号,低电平有效
18
VEE
-10V
输入
负压输出,单电源供电时输出-10V负电压
19
BLA
+5V
输入
背光电源阳极
20
BLK
0V
输入
背光电源阴极
(3)12864液晶显示器的RAM地址映射
12864点阵(LCM)就是由128*64个液晶显示点组成的一个128列*64行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。存储这些点阵信息的RAM称为显示数据存储器。要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。图形或汉字的点阵信息当然由自己设计,问题的关键就是显示点在液晶屏上的位置(行和列)与其在存储器中的地址之间的关系。
关键词:单片机AT89C51 12864LCDC语言字模
1 概述
在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单。
(4)12864LCD的指令说明
该类液晶显示模块的指令系统比较简单,总共只有七种。其指令表如表1-3所示:
序号
指令名称
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
显示开关设置
0
0
0
0
1
1
1
1
1
*
2
显示起始行设置
0
0
1
1
*
*
*
*
*
*
3
页面地址设置
0
0
1
0
1
1
1
*
*
*
4
列地址设置
0
0
0
1
*
*
*
*
*
*
5
读取状态字
0
1
BUSY
0
ON/OFF
REST
0
0
0
0
6
写显示数据
1
0
数据
7
读显示数据
1
1
数据
2 方案设计
2.1 硬件电路设计
DB[7~0]接数据总线,RS,R/W,CS接地址总线,E接读写控制总线,采用与非门匹配时序,如果存在地址冲突还需统一编制。
图2-1 电路连线图
N N
Y Y
图2-2程序设计流程图
1.1 液晶显示简介
1.1.1 液晶显示原理
液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
1.1.2 液晶显示器的分类
由于多数的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。显示点在64*64上的位置由行号(line,0~63)与列号(column,0~63)确定。512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。每个存储单元存储8个液晶点的显示信息。
(1)12864LCD主要技术参数:
电源:VDD 3.3V~+5V(内置升压电路,无需负压);
显示内容:128列×64行
显示颜色:黄绿
显示角度:6:00钟直视
逻辑工作电压(VDD):4.5~5.5V
电源地(GND):0V
工作温度(Ta):0~60℃(常温) / -20~75℃(宽温)
(2)引脚功能说明:
12864LCD采用标准的20脚(带背光)接口,各引脚接口说明如表1-1所示。
表1-1 12864LCD引脚功能说明
引脚号
引脚名
电平
输入/输出
作用
1
Vss
0V
电源地
2
VDD
+5V
电源(+5V)
3
VLCD
0~-10V
LCD驱动负电压,要求VDD-VLCD=13V
4
RS
0/1
输入
寄存器选择信号
5
R/W
0/1Βιβλιοθήκη 输入读/写操作选择信号6
E
0/1
输入
使能信号,高电平有效
7
DB0
0/1
输入/输出
八位三态并行数据总线
8
DB1
9
DB2
10
DB3
11
DB4
12
DB5
13
DB6
14
DB7
15
CS1
0/1
输入
片选信号,当CS1=1时,控制液晶左半屏
16
CS2
0/1
输入
片选信号,当CS1=2时,控制液晶右半屏
17
/RSET