字符式LCD1602移动显示
- 格式:doc
- 大小:1021.00 KB
- 文档页数:18
液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。
这里介绍的字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等,这里以常用的2行16个字的1602液晶模块来介绍它的编程方法。
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:屏幕上所有文字是否左移或者右移。
LCD1602自定义显示字符从CGROM表中可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。
它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定0-2位为地址,3位无效,4-7全为零。
因此CGRAM的字符码只有最后三位能用也就是8个字节了。
等效为0000x111,x为无效位,最后三位为000-111共8个。
如果我们要想显示这8个用户自定义的字符,操作方法和显示CGROM一样,先设置DDRAM位置,再向DDRAM写入字符码,例如“A”就是41H。
现在我们要显示CGRAM的第一个自定义字符,就向DDRAM写入00000000B(00H),如果要显示第8个就写入00000111(08H)。
从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。
例如第一个自定义字符的字模地址为01000000-01000111八个地址。
我们向这8个字节写入字模数据,让它能显示出“℃”地址:01000000数据:00010000图示:○○○■○○○○0100000100000110○○○○○■■○0100001000001001○○○○■○○■0100001100001000○○○○■○○○0100010000001000○○○○■○○○0100010100001001○○○○■○○■0100011000000110○○○○○■■○0100011100000000○○○○○○○○字定义字符地址0x40————0x000x48————0x010x50————0x020x58————0x030x60————0x040x68————0x050x70————0x060x78————0x07程序操作:1.定义字符数组uchar code Word1[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A};//自定义字符数组2.写数据到CGRAM中uchar j;WriteCommandLCD(0x40);for(j=0;j<8;j++){WriteDataLCD(Word1[j]);}3.读取数据并显示WriteCommandLCD(0xC8);//显示在第一行WriteDataLCD(0x00);//地址取模软件操作左边三列为无效软件设置。
LCD1602的滚动显示/*************************************LCD1602头文件************************** *******/#ifndef _LCD1602_H_#define _LCD1602_H_//输入方式设置#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位//设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON 0x0C //显示开#define LCD_DISPLAY_OFF 0x08 //显示关#define LCD_CURSOR_ON 0x0A //光标显示#define LCD_CURSOR_OFF 0x08 //光标不显示#define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁//光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位//工作方式设置#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示#define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示#define LCD_CLEAR_SCREEN 0X01 //清屏/***********************LCD1602地址相关******************************/#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址#define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址#define LINE1 0 //第一行#define LINE2 1 //第二行#define LINE_LENGTH 16 //每行的最大字符长度/***********************LCD1602接线引脚定义**************************/#define LCDIO P2 //定义P2口与LCD1602的数据口相接sbit LCD_RS=P1^4;sbit LCD_RW=P1^3;sbit LCD_EN=P1^2;sbit LCD_BUSY=LCDIO^7;/**********************另外相关的定*********************************/#define HIGH 1#define LOW 0#define TURE 1#define FALSE 0#define uchar unsigned char#define uint unsigned int/*************************以下是函数的申明部*************************/void LCD_init(void); //LCD1602初始化void LCD_send_command(uchar command); //void LCD_send_data(uchar dat);void LCD_write_char(uchar x,uchar y,uchar dat);void LCD_disp_string(uchar x,uchar y,char *Data);void delay_ms(uint n);void LCD_check_busy(void);#endif/******************************************************************/#include <reg51.h>#include "LCD1602.h"/*******************主函数**********************************/uchar string[]=" I LOVE YOU! "; //这里是要显示的字符void main(void){uchar *cp;cp=string;LCD_init();while(1){LCD_send_command(LCD_CLEAR_SCREEN);delay_ms(2);LCD_disp_string(0,1,cp);delay_ms(100);cp++;if(*cp==''\0''){cp=string; //到达字符的尾部时,改变指针,重新指向字符串的头部 }}}/*********************************************************//**************LCD1602的初始化***************************/void LCD_init(void){LCD_send_command(LCD_DISPLAY_DOUBLE_LINE);LCD_send_command(LCD_AC_AUTO_INCREMENT LCD_MOVE_DISENABLE);LCD_send_command(LCD_DISPLAY_ON LCD_CURSOR_OFF);LCD_send_command(LCD_CLEAR_SCREEN);}/********************************************************/void LCD_check_busy(void) //检测LCD状态,看它是不是还在忙呢{do{LCD_EN=0;LCD_RS=0;LCD_RW=1;LCDIO=0xff;LCD_EN=1;}while(LCD_BUSY==1);LCD_EN=0;}/************LCD1602写命令*******************************/ void LCD_send_command(uchar command){LCD_check_busy();LCD_RS=LOW;LCD_RW=LOW;LCD_EN=HIGH;LCDIO=command;LCD_EN=LOW;}/********************************************************/ /*****************LCD1602写数据**************************/ void LCD_send_data(uchar dat){LCD_check_busy();LCD_RS=HIGH;LCD_RW=LOW;LCD_EN=HIGH;LCDIO=dat;LCD_EN=LOW;}/********************************************************void LCD_write_char(uchar x,uchar y,uchar dat){unsigned char address;if (y == LINE1)address = LINE1_HEAD + x;elseaddress = LINE2_HEAD + x;LCD_send_command(address);LCD_send_data(dat);}******************LCD1602显示字符串*********************/void LCD_disp_string(uchar x,uchar y,uchar *Data){if(y==LINE1){if(x<LINE_LENGTH){LCD_send_command(LINE1_HEAD+x);for(;x<LINE_LENGTH&&*Data!=''\0'';x++){LCD_send_data(*(Data++));}if(*Data!=''\0''){x=0;y=LINE2;}}}if(y==LINE2){LCD_send_command(LINE2_HEAD+x);for(;x<LINE_LENGTH&&*Data!=''\0'';x++){LCD_send_data(*(Data++));}}}/****************************************************************/ /********************延时函数***********************************//***************************************************************/ void delay_ms(uint n){uint i,j;for(i=n;i>0;i--)for(j=0;j<1140;j++); }。
物理与电子工程学院《单片机原理与接口技术》课程设计报告书设计题目:字符式LCD移动显示设计专业:班级:学生姓名:学号:指导教师:2015年11 月16 日专业:班级:本次课程设计用到的单片机是STC12C5A60S2,以STC12C5A60S2为控制核心,以LCD1602液晶为显示模块。
通过编程的方式让LCD1602液晶显示字符,采用移屏显示。
首先把所要显示的字符写在LCD1602的地址为10到27和50到67的隐藏显示区域,然后经过移屏指令把所要显示的字符移动到LCD1602的地址为00到0F和40到4F的显示区域。
关键词:STC12C5A60S2;1602;移屏显示1 STC12C5A60S2简介 (1)1.1 STC1602的性能 (1)1.2 引脚动能 (2)2 1602LCD简介 (3)3 硬件设计 (6)4 软件设计 (7)5 仿真 (9)6 心得体会 (9)参考文献 (10)附录 (11)1 STC12C5A60S2简介1.1 STC1602的性能本次课程用STC12C5A60S2作为控制核心,下面是有关STC12C5A60S2的介绍:STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(T1)的单片机,是高速/功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250k/s),针对电机控制,强干扰场合。
(1) 增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;(2) 工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)(3) 工作频率范围:0-35MHZ,相当于普通8051的0~420MHZ;(4) 用户应用程序空间8K/16K/20K/32K/40K/48K/52K/60K/62K字节;(5) 片上集成1280字节RAM;(6) 通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统 I/O 口),可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均可达到20ma;(7) ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;(8) 有EERROM功能(STC12C5A60S2/AD/PWM无内部EERROM);(9) 看门狗:(10)内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可以直接1K电阻到地);(11)外部掉电检测电路:在P4.6口有一个抵押门槛比较器,5V单片机为1.32V,误差为+/-5%,3.3V单片机,误差为+/-3%;(12) 共有4个16位定时器,2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟;(13) 外部中断I/O口7路,PWM(2路)/PCA(可编程计数器阵列2路);(14) A/D转换,10位精度ADC,共8路,转换速度可达250K/S;(15) 通用全双工异步串行口(UART),由于STC12系列是高速的8051,可在用定时器或PCA软件实现多串口;(16) STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RXD2/P1.2,TXD/P1.3;工作温度范围:-40~+85℃(工业级)/0~+75℃(商业级);(17) 封装:PDIP-40,LQFP-44,LQFP-48,I/O口不够时,可用到2到3 根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口,还可以用A/D键盘扫描来节省I/O口,或者双用CPU,三线通信,还多了串口。
单片机控制LCD1602显示字符(测试通过)
本次测试的是常用LCD1602 显示屏,操作流程很简单,但有些小问题要
注意,如该LCD 处理速度有些慢,单片机在发送控制指令时需要适当延时,
否则可能操作失败。
一、硬件简介
1>引脚介绍
具体引脚如下:
单片机需要操作的引脚有:RS、RW、E 及DB0~7
2>指令介绍
在这里,仅仅介绍下什么是CGRAM、什么是DDRAM?
CGRAM:是用户自定义字符存放存储器,可以自己在指定地址定义字符DDRAM:是对应屏幕位置的存储器,设定了该地址,就确定了从屏幕什么
位置开始显示字符
二、软件部分
#include#include#define DATA P0sbit RS=P2;sb it RW=P2 ;sbit EN=P2;un sign ed char zifu[]={“Hello,World!0”};unsigned char wangzhi[]={“shop108408772.taobao/”};void delayms(unsigned char m) //适当延时{unsigned char i;while(m--){for(i=0;i//写1 个字节{RW=0;_nop_();_nop_(); EN=1;_nop_();DATA=canshu;EN=0;_nop_();_nop_();}
void main(){unsigned char *point;RS=0;WRITE_BYTE(1);//清屏delayms(10);//。
1.基本简介LCD1602工业字符型液晶,能够同时显示16x02即32个字符。
(16列2行)1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
2.管脚功能1602采用标准的16脚接口,其中:第1脚:VSS为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。
第7~14脚:D0~D7为8位双向数据端。
第15~16脚:空脚或背灯电源。
15脚背光正极,16脚背光负极。
⑶特性3.3V或5V工作电压,对比度可调内含复位电路提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能有80字节显示数据存储器DDRAM内建有192个5X7点阵的字型的字符发生器CGROM 8个可由用户自定义的5X7的字符发生器CGRAM3特性应用+3.3V电压,对比度可调内含复位电路提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能有80字节显示数据存储器DDRAM内建有192个5X7点阵的字型的字符发生器CGROM8个可由用户自定义的5X7的字符发生器CGRA。
lcd1602的显示原理
LCD1602是一款16×2字符液晶显示模块,其显示原理基于液
晶分子的电光效应。
液晶分子是一种有机分子,在没有电场时,其分子内部呈现随机排列的状态,不会通过光线的传播。
然而,当液晶分子受到电场的作用时,它们会改变自身的方向,从而使光线能够通过。
在LCD1602中,液晶分子被夹在两片平行的透明电极之间。
这两片电极由透明导电材料(如氧化铟锡)制成,通过外部电源提供电压。
当电压施加在电极上时,液晶分子会重新排列,形成一个规则的结构。
在LCD1602的背光灯亮起的情况下,LCD的每个字符位置由
一个位于背光层后面的液晶单元组成。
液晶单元可以看作一个微小的透明窗口,它由液晶分子和两片玻璃之间的色素层组成。
当液晶分子处于无电场状态时,色素层会吸收背光光线,使液晶单元呈现黑色。
而当液晶分子受到电场的作用时,它们会重新排列,色素层对背光光线的吸收减少,使液晶单元呈现透明状态。
通过控制液晶分子的排列方式,可以实现对字符的显示。
LCD1602通过与微控制器(如Arduino)连接,通过微控制器
发送指令和数据来控制液晶模块的显示内容。
具体来说,微控制器通过发送脉冲来改变电场的方向和强度,从而控制液晶分子的排列方式。
然后,显示模块将电场信息转化为对应的字符显示。
LCD 液晶显示器是Liquid Crystal Display 的简称LCM(LCDModule)即LCD显示模组,是指将显示控制器,驱动器,字符存储器等集成到一起的LCD显示产品,它提供用户一个标准的LCD显示驱动接口(有4位、8位、VGA等不同类型),用户按照接口要求进行操作来控制LCD正确显示。
字符型LCD:有多个5*7或5*11点阵符位组成,每个点阵符位都可以显示一个字符。
专用于显示字母,数字,及自定义符号。
常用的有16字*1行,16字*2行,20字*2行,40字*2行:如LCD 1602 是16*2,可以显示两行字符,每行16个字符。
点阵式LCD: 不但可以显示字符,还可以显示汉字,图形。
如LCD 12864VDD :接5V正电源VL :液晶显示器对比度调整端,接正电源对比度最弱,接地时对比度最高,对比度过高会产生“鬼影”,一般在该引脚接一固定电阻或一电位器。
RS :寄存器选择,1时选择数据寄存器,0时选择指令寄存器。
R/W:读写控制信号线,1为读操作,0为写操作。
E : 为模块使能端,当有高电平跳变到低电平时,液晶模块执行命令。
DB0-DB7:8位双向数据线。
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下表:也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H 地址写入“A”字的代码就行了。
但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。
那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。
第二行也一样用前16个地址。
第一行对应16个地址位0x00-0x0fH,第二行对应的地址为:40H-4FH1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”#define RS_0 PORTC&=~(1<<PC0) //RS为0,0选择指令寄存器#define RS_1 PORTC|=(1<<PC0) //RS 为1,1选择数据寄存器#define RW_0 PORTC&=~(1<<PC1) //RW为0, 0为写操作#define RW_1 PORTC&=(1<<PC1) //RW为1,1为读操作#define EN_0 PORTC&=~(1<<PC2) //E 为0,#define EN_1 PORTC&=(1<<PC2) //E 为1. //使能端,高电平跳变到低电平时,液晶模块执行命令。
物理与电子工程学院《单片机原理与接口技术》课程设计报告书设计题目:字符式LCD移动显示设计专业:班级:学生姓名:学号:指导教师:2015年11 月16 日专业:班级:本次课程设计用到的单片机是STC12C5A60S2,以STC12C5A60S2为控制核心,以LCD1602液晶为显示模块。
通过编程的方式让LCD1602液晶显示字符,采用移屏显示。
首先把所要显示的字符写在LCD1602的地址为10到27和50到67的隐藏显示区域,然后经过移屏指令把所要显示的字符移动到LCD1602的地址为00到0F和40到4F的显示区域。
关键词:STC12C5A60S2;1602;移屏显示1 STC12C5A60S2简介 (1)1.1 STC1602的性能 (1)1.2 引脚动能 (2)2 1602LCD简介 (3)3 硬件设计 (6)4 软件设计 (7)5 仿真 (9)6 心得体会 (9)参考文献 (10)附录 (11)1 STC12C5A60S2简介1.1 STC1602的性能本次课程用STC12C5A60S2作为控制核心,下面是有关STC12C5A60S2的介绍:STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(T1)的单片机,是高速/功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250k/s),针对电机控制,强干扰场合。
(1) 增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;(2) 工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)(3) 工作频率范围:0-35MHZ,相当于普通8051的0~420MHZ;(4) 用户应用程序空间8K/16K/20K/32K/40K/48K/52K/60K/62K字节;(5) 片上集成1280字节RAM;(6) 通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统 I/O 口),可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均可达到20ma;(7) ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;(8) 有EERROM功能(STC12C5A60S2/AD/PWM无内部EERROM);(9) 看门狗:(10)内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可以直接1K电阻到地);(11)外部掉电检测电路:在P4.6口有一个抵押门槛比较器,5V单片机为1.32V,误差为+/-5%,3.3V单片机,误差为+/-3%;(12) 共有4个16位定时器,2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟;(13) 外部中断I/O口7路,PWM(2路)/PCA(可编程计数器阵列2路);(14) A/D转换,10位精度ADC,共8路,转换速度可达250K/S;(15) 通用全双工异步串行口(UART),由于STC12系列是高速的8051,可在用定时器或PCA软件实现多串口;(16) STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RXD2/P1.2,TXD/P1.3;工作温度范围:-40~+85℃(工业级)/0~+75℃(商业级);(17) 封装:PDIP-40,LQFP-44,LQFP-48,I/O口不够时,可用到2到3 根普通I/O口线外接74HC164/165/595(均可级联)来扩展I/O口,还可以用A/D键盘扫描来节省I/O口,或者双用CPU,三线通信,还多了串口。
1.2 引脚动能STC12C5A60S2的引脚如图1-1所示。
图1-1 STC12C5A60S2引脚图VCC:供电电压GND:接地P0口:P0口为一个8位漏极开路双向I/O口,每个管脚可吸收8TTL门电流。
当PI口管脚写“1”时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FLASH编程时,P0口作为源码输入口,当FASH进行校验时,P0输出原码,此时P0外部电位必须拉高:P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接受输出4TTL门电流。
P1口管脚写入“1”后,电位被内部上拉为高,可用作输入,P1口碑内部下拉为低电平时,将输入电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接受:P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接受,输入4个TTL门电流,当P2口碑写“1”时,其管脚电位被内部上拉电阻拉高,且作为输入。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接受输出4个TTL 门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入时,由于外部下拉为低电平,P3口将输出电流,也是由于上拉的缘故。
P3.0 RXD(串行输入口)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:复位输入ALE/PROG:当访问外部存储器时,地址锁存器允许的输出电平用于锁存地址的低位字节。
PSEN:外部程序存储器的选通信号。
EA/VPP:当EA保持低电平时,访问外部ROM;注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,访问内部ROM。
在FLASH编程期间,此引脚也用于施加12V编程电源;XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入;XTAL2:来自反向振荡器的输出。
2 1602LCD简介本次设计以1602LCD作为显示屏,下面是关于1602LCD的简介:LCD1602是专用的字母、符号、数字显示液晶,本次课程设计我们以长沙太阳人电子有限公司的字符型1602作为显示器作介绍,如图2-1、2-2所示。
图2-1 1602LCD实物图图2-2 1602LCD实物图1602LCD的引脚图如图2-3。
图2-3 1602LCD引脚图1602LCD采用标准的14脚或着16接口,其中14脚无背光,16脚有背光;各个引脚说明如表2-1所示。
表2-1 1602LCD引脚1602LCD的RAM地址映射如图2-4所示图2-4 1602LCD的RAM地址映射1602LCD的RAM地址00H-0FH和40H-4FH是外部显示地址,10H-27H和50H-67H是内部显示地址。
也就是说如果我们把所要显示的内容写在00H-0FH和40H-4FH任何一个地址,我们都可以直接观察得到,而把所要显示的内容写在10H-27H和50H-67H任何一个地址我们是观察不到的,是隐藏的,只有经过移位指令把它们移到00H-0FH和40H-4FH才能观察得到。
如果我们想在现在1602的第一行第一个地址写上字符,必须使光标定位在第一行第一个地址,实际的地址应该是80H+00H,因为写入显示地址时要求最高位D7始终为高电平1,所以再原来的地址上加80H;若要在第二行最后一个地址写上字符,同样的道理,地址应是80H+4FH。
1602LCD模块内部的CGROM已经存储了160个不同的点阵字符图形,如图所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B (41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”,本次课程设计用的是数组,所以用不到字符代码。
点阵字符代码如表2-2所示。
表2-2 1602LCD点阵字符代码1602LCD读写操作时序如图2-5所示。
图2-5 1602LCD读写操作时序图3 硬件设计(1)系统的原理图如图3-1所示。
图3-1 系统原理图单片机STC12C5A60S2的P0口接1602LCD的数据端D0-D7,P0口外加上拉电阻;P3.0、P3.1、P3.2分别接1602LCD的E、RW、RS引脚;单片机的第9引脚作为复位引脚,采用按键复位;最小系统采用的晶振频率为12MHZ。
(2)最小系统电路图如图3-2所示。
图3-2 最小系统单片机的XTAL1和XTAL2引脚外接12MHZ晶振与30PF瓷片电容,RST作复位引脚,ALE接+5V电压。
4 软件设计软件设计流程图如图4-1所示。
图4-1 软件流程图首先液晶初始化,然后把第一个要写的字符串写在液晶的ARM的10H-27H 上,检测是否写完第一个字符串,如果未写完,则继续执行书写第一个字符串的命令,否则执行下一个命令写第二个字符串;第二个字符串写在液晶的ARM的50H-67H上,再检测第二个字符串是否写完,若未写完则继续填写,否则执行整屏左移命令把要显示的数据移到RAM为00-0F和40-4F的区域,指令停止在此。
5 仿真仿真用的是现在最流行的软件Proteus,仿真效果如图5-1所示。
图5-1 仿真效果图因为在Proteus里面没有STC12C5A60S2单片机,所以仿真用AT89C51单片机来代替STC125A60S2单片机。
下载程序到单片机AT89C51,按下Proteus仿真运行按钮,仿真原理图开始运行,仿真效果会如图5-1一样,要显示的数据从液晶的右边左移到液晶的左边并显示“JINSHICHUAN AI WANGTINGLING”字符样式。
6 心得体会以前自己学习过液晶显示方面的知识,那时候我学的是1286LCD,1286LCD 能显示字母、阿拉伯数字、符号和汉字。
本次采用1602LCD显示字符,虽然难度不大,但是我也不能大意,因为在软件设计方面,如果不小心谨慎就很容易出错,比如说给液晶写数据的时候,使能端E要从高电平变成低电平的过程要有一个时间的延时,大概是5ms左右,如果不延时有可能会出错。
此次的设计液晶移动显示我没有用到检测液晶忙等功能,而是简单是用数组来代替,在检测液晶是否忙这方面的知识我学的不够理想,以后的生活学习中要加强,打造一个全新的自己。
参考文献[1]李全利.单片机原理及接口技术(第二版)[M].北京:高等教育出版社,2009.259-274[2]郭天祥.51单片机C语言教程[M].北京:电子工业出版社,2009附录程序清单#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit E=P3^0;sbit RW=P3^1;sbit RS=P3^2;void well_bb(uchar bb);void well_aa(uchar aa);uchar code table[]="JINSHICHUAN AI";uchar code table1[]="WANGTINGLING";uchar num;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void well_aa(uchar aa){RS=0;P0=aa;delay(5);E=1;delay(5);E=0;}void well_bb(uchar bb){RS=1;P0=bb;delay(5);E=1;delay(5);E=0;}void init(){RW=0;E=0;well_aa(0x38);well_aa(0x0c);well_aa(0x06);well_aa(0x01);well_aa(0x80+0x10);}void main(){init();for(num=0;num<14;num++){well_bb(table[num]);delay(20);}well_aa(0x80+0x54);for(num=0;num<12;num++){well_bb(table1[num]);delay(20);}for(num=0;num<16;num++){well_aa(0x18);delay(200);}while(1);}课程设计成绩评定表院系:班级:姓名:学号:。