LCD1602的电路图和程序文档格式.docx

上传人:wj 文档编号:8431187 上传时间:2023-05-11 格式:DOCX 页数:16 大小:2.09MB
下载 相关 举报
LCD1602的电路图和程序文档格式.docx_第1页
第1页 / 共16页
LCD1602的电路图和程序文档格式.docx_第2页
第2页 / 共16页
LCD1602的电路图和程序文档格式.docx_第3页
第3页 / 共16页
LCD1602的电路图和程序文档格式.docx_第4页
第4页 / 共16页
LCD1602的电路图和程序文档格式.docx_第5页
第5页 / 共16页
LCD1602的电路图和程序文档格式.docx_第6页
第6页 / 共16页
LCD1602的电路图和程序文档格式.docx_第7页
第7页 / 共16页
LCD1602的电路图和程序文档格式.docx_第8页
第8页 / 共16页
LCD1602的电路图和程序文档格式.docx_第9页
第9页 / 共16页
LCD1602的电路图和程序文档格式.docx_第10页
第10页 / 共16页
LCD1602的电路图和程序文档格式.docx_第11页
第11页 / 共16页
LCD1602的电路图和程序文档格式.docx_第12页
第12页 / 共16页
LCD1602的电路图和程序文档格式.docx_第13页
第13页 / 共16页
LCD1602的电路图和程序文档格式.docx_第14页
第14页 / 共16页
LCD1602的电路图和程序文档格式.docx_第15页
第15页 / 共16页
LCD1602的电路图和程序文档格式.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

LCD1602的电路图和程序文档格式.docx

《LCD1602的电路图和程序文档格式.docx》由会员分享,可在线阅读,更多相关《LCD1602的电路图和程序文档格式.docx(16页珍藏版)》请在冰点文库上搜索。

LCD1602的电路图和程序文档格式.docx

读取输出的D0~D7状态字

写入数据D0~D7

从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)、8KBRAM、8KB数据Flash(D-lash)组成片内存储器。

主要功能模块包括:

内部存储器,内部PLL锁相环模块,2个异步串口通讯SCI,1个串行外设接口SPIMSCAN模块,1个8通道输入/输出比较定时器模块TIM,周期中断定时器模块PIT,16通道A/D转换模块ADC,1个8通道脉冲宽度调制模块PWM,输入/输出数字I/O口。

本次设计中主要用到PORTA,PORTB端口:

PORTA:

PORTA为通用I/O口,共8个,作为通用数字I/O口使用,未集成特殊功

能.主要配置寄存器有:

数据寄存器PORTA、数据方向寄存DDRA、上拉电阻控制寄存器

PUCR和驱动控制寄存器RDR。

a.数据寄存器PORTA

通过写1/0使单片机对应引脚输出高低电平,或通过读取数据寄存器获得对应引脚的高低电平值。

例:

PORTA_PB0=1

b.数据方向寄存器DDRA

DDRA寄存器配置引脚为输出口还是输入口,“0”,输入口;

“1”,输出口。

MCU复位后,DDRA值为0x00,引脚默认为输入口。

DDRA=0xFF//配置PORTA口为输出

PORTB:

PORTB为通用数字I/O口,共8个。

其使用与PORTA基本一样。

主要配置寄存器有:

数据寄存器PORTB、数据方向寄存DDRB。

上拉电阻控制寄存器PUCR和驱动控制寄存器RDR与PORTA、PORTB、PORTE、PORTK共用。

a.数据寄存器PORTB

b.数据方向寄存器DDRB

四、原理图:

器件说明:

LCD1602(16管脚),2个排阻,4个10k电阻,一个1K电阻,飞思卡尔芯片(64管脚)

管脚连接:

VSS

GND

DB6

PB6

VCC

DB7

PB7

VEE

A

PA0

K

RW

PA1

K1

PA4

E

PA2

K2

PA5

DB0

PB0

K4

PA6

DB1

PB1

PA7

DB2

PB2

DB3

PB3

DB4

PB4

DB5

PB5

五、流程图开始

锁相环设置

初始化LCD

是否有键按下

写指令

写数据

显示字符

六、程序设计

1.voidPLL_Init(void):

内部锁相环模块,单片机使用PLL功能能够获得更高的总线频率,这对于需要提高单片机运行速度的应用场合非常必要。

2.voidLCD_init(void):

初始化LCD1602液晶显示屏,

3.voidLCD_write_command(uchardat):

写指令

4.voidLCD_write_data(uchardat):

写数据

5.voidLCD_disp_char(ucharx,uchary,uchardat):

显示字符

6.voidmain(void):

主函数

#include<

hidef.h>

/*commondefinesandmacros*/

#include"

derivative.h"

/*derivative-specificdefinitions*/

MC9S12XS128.h"

unsignedchara=0;

unsignedcharb=0;

unsignedcharc=0;

unsignedchard=0;

voidPLL_Init(void)//PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)

{//锁相环时钟=2*16*(2+1)/(1+1)=48MHz

REFDV=1;

//总线时钟=48/2=24MHz

SYNR=2;

while(!

(CRGFLG&

0x08));

CLKSEL=0x80;

//选定锁相环时钟

}

#defineLCD_DBPORTB

#defineLCD_RSPORTA_PA0

#defineLCD_RWPORTA_PA1

#defineLCD_EPORTA_PA2

voidLCD_init(void);

//初始化函数

voidLCD_write_command(ucharcommand);

//写指令函数

voidLCD_write_data(uchardat);

//写数据函数

voidLCD_disp_char(ucharx,uchary,uchardat);

//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)

//voidLCD_check_busy(void);

//检查忙函数。

我没用到此函数,因为通过率极低。

voiddelay_n25us(uintn);

//延时函数

//********************************

//*******初始化函数***************

voidLCD_init(void)

{

LCD_write_command(0x38);

//设置8位格式,2行,5x7

LCD_write_command(0x0c);

//整体显示,关光标,不闪烁

LCD_write_command(0x06);

//设定输入方式,增量不移位

LCD_write_command(0x01);

//清除屏幕显示

delay_n25us(10);

//实践证明,我的LCD1602上,用for循环200次就能可靠完成清屏指令。

//LCD_write_command(0x06);

//LCD_write_command(0x0c);

}

//********写指令函数************

voidLCD_write_command(uchardat)

LCD_DB=dat;

delay_n25us

(1);

LCD_RS=0;

//指令

LCD_RW=0;

//写入

LCD_E=1;

//允许

LCD_E=0;

//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。

//*******************************

//********写数据函数*************

voidLCD_write_data(uchardat)

LCD_RS=1;

//数据

//*******显示一个字符函数*********

voidLCD_disp_char(ucharx,uchary,uchardat)

ucharaddress;

if(y==1)

address=0x80+x;

else

address=0xc0+x;

LCD_write_command(address);

LCD_write_data(dat);

/*******检查忙函数*************

voidLCD_check_busy()//实践证明,在我的LCD1602上,检查忙指令通过率极低,以

{//至于不能正常使用LCD。

因此我没有再用检查忙函数。

而使

do//用了延时的方法,延时还是非常好用的。

我试了一下,用

{LCD_E=0;

//for循环作延时,普通指令只要1次循就可完成。

清屏指令

LCD_RS=0;

//要用200次循环便能完成。

LCD_RW=1;

LCD_DB=0xff;

LCD_E=1;

}while(LCD_DB^7==1);

******************************/

//********延时函数***************

voiddelay_n25us(uintn)

{uinti=0;

ucharj=0;

for(i=n;

i>

0;

i--)

for(j=0;

j<

2;

j++);

//在这个延时循环函数中我只做了2次循环,

}//实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。

voidcheck_key(void)//判断按键是否可以控制单片机(如果键入正常,则单片机上的LED会亮

if(!

PORTAB_PA4){

PORTE_PE5=0;

a=1;

}

elseif(!

PORTAB_PA5){

a=2;

PORTAB_PA6){

a=3;

}

elseif(!

PORTAB_PA7){

a=4;

else

PORTE_PE5=1;

//*********主函数*****************

voidport_init(){

DDRB=0XFF;

DDRA=0XFF;

PORTB=0XFF;

voidmain(void){

//PLL_Init();

port_init();

LCD_init();

DDRE_DDRE5=1;

PORTE_PE5=1;

//不亮

/*DDRA_DDRA0=1;

DDRA_DDRA1=1;

DDRA_DDRA2=1;

DDRA_DDRA3=1;

*/

DDRA_DDRA4=0;

//SETPORTAI/OINPUT

DDRA_DDRA5=0;

DDRA_DDRA6=0;

DDRA_DDRA7=0;

PORTAB_PA4=1;

PORTAB_PA5=1;

PORTAB_PA6=1;

PORTAB_PA7=1;

//LCD_disp_char(4,2,'

1'

);

for(;

;

){

_FEED_COP();

/*feedsthedog*/

check_key();

//检查按键

while

(1)

{

/*if(a==1)

{delay(10);

*///延时去抖

if(a==1){

LCD_disp_char(0,2,'

//在LCD第二行第一位输出1

}/*elseif(a==2)

*///延时去抖

elseif(a==2){

LCD_disp_char(1,2,'

2'

//在LCD第二行第二位输出2

}/*elseif(a==3)

elseif(a==3){

LCD_disp_char(2,2,'

3'

//在LCD第二行第3位输出3

}

/*elseif(a==4)//延时去抖

elseif(a==4){

LCD_disp_char(3,2,'

4'

//在LCD第二行第4位输出4

}

//else{LCD_disp_char(12,1,'

0'

//}

//LCD_disp_char(2,1,'

}/*loopforever*/

/*pleasemakesurethatyouneverleavemain*/

七、调试过程

(1)使用Altium画出电路图:

在电路图设计过程中,注明所用器件名称,规格,注意管脚的连接,尽可能让电路原理图规范,正确,方便看图焊接的工作。

(2)测量电路焊接是否正常:

焊接好电路板后,首先用万用表测试是否连通,将表笔两端分别置于连接的两管脚,将万用表开关置于分贝档,若有响声,则电路已经联通,分别测试该设计所用的所有管脚。

(3)检验输入I0:

用万用表分别检测4个按键,看按键是否起到输入作用。

将万用表开关置于电压档,分别测试按键按下前后的单片机电压。

若按键前电压为5v,按键后为0,则说明按键起到了输入的作用。

(4)输出IO端口:

输出口主要检验lcd1602的显示情况,首先用万用表测试,检查LCD1602管脚链接是否有问题。

LCD1602的VEE串联一个电位器后接地,通过调节电位器,调节显示对比度,否则即使初始化程序正确,字符也可能显示不出来。

(5)程序:

程序中主要注意Lcd1602显示部分,因为LCD1602相对于单片机速度比较慢,所以在编写程序时应注意加延时。

八、遇到的问题及解决办法

(1)初次焊接LCD1602后,屏幕不亮

首先检查了电路板的焊接,及查阅了LCD1602的数据手册,因为使用的1602为16个管脚,需要将BLK接电源。

(2)BDM仿真器下载不上程序

重新安装BDM仿真器,确认文件已拷入相应的路径。

(3)重复下载程序后lLCD1602不显示

在检查硬件电路没有问题后,检查程序,并单步执行,发现初始化1602时循环次数设置过高。

(4)LCD1602初始化成功后不能正常显示字符

根据LCD1602连接电路图,发现D0-D7应接10K左右的排阻,然后与核心板引脚相连。

(5)LCD1602显示比较模糊

根据1602的使用手册,V0与GND相连的中间应接入10K左右电阻,并且电阻值越小对比度越大。

(6)按键不起作用

检查电路连接,发现上拉电阻接法错误,并改正。

(7)按键输入的数字显示并不稳定

在检查硬件电路没问题后,检查程序,查阅资料当得知,LCD1602需要初始化且速度较慢,所以应在初始化LCD1602时加入延时。

九、附:

图片截屏

图1.使用FreescaleCodeWarrior软件编写程序

图2.使用BDM仿真器下载程序

图3.硬件电路板设计:

九、实验总结与体会

通过本次实习,使我对LCD1602及飞思卡尔单片机的应用都有了很深的理解,这是第一次独立的把软件及硬件相结合,包括改写程序及焊接电路板,整个过程中也有不成功的时候,例如在硬件的电路设计时,忽略了上拉电阻,导致LCD根本不能显示,在软件编程方面,因为缺少延时,LCD显示不正常,但经过不断修改检验,最终完成了本次的实习项目,使我对电子信息工程这个专业也有了深入的了解。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2