您的当前位置:首页正文

LCD实验报告4

2024-03-18 来源:榕意旅游网
实验五:EDA技术设计性实验-LCD菜单字符显示

一、实验目的

为了有效加深对数字系统的分析和设计方法,熟练用EDA工具完成对数字系统的设计及仿真过程;安排本“设计性实验”。本实验自行拟定实验电路、实验步骤并进行独立实验主,学会系统设计、调试、仿真及故障诊断、排除方法。 二、实验题目

题目:流动字符显示电路设计 要求:

(1)利用实验箱中的LCD2004字符型液晶,与MC8051 IP软核,编写两页以上LCD菜单。

(2)键盘分配为,功能键1位,增加键1位,确认键1位。 LCD菜单字符显示电路系统原理框图如图2-1所示。

MC8051 IP核 LCD2004字符型液晶 系统时钟 锁相环 键盘

图2-1

MC8051IP核原理图及单片机I/O口设置成双向口的电路如下:图2-2和2-3

图2-2 单片机I/O口设置成双向口的电路

图2-3 MC8051IP核原理图

三、实验设备及器材:GW48EDA/SOPC+PK2实验系统。 四、实验内容:1、流程图:

开始 初始化液晶显示器并设置其为显示的第一页 是否有功能键按下? Y N

显示第二页字符。并判断增加键的情况 是否有功能键按下? Y 显示第二页字符。并判断增加键的情况 N

2、程序: //lcd.c

#include #include

#define uchar unsigned char #define uint unsigned int sbit LCD_RS=P0^0; sbit LCD_RW=P0^1; sbit LCD_EP=P0^2;

sbit KEY_SET=P1^3; sbit KEY_UP=P1^4; sbit KEY_ENTER=P1^5;

uchar m=0; a,b,out; //全局变量 //全局变量 uchar flag=0;

uchar set=0; //功能键值

uchar code dis1[ ]={\"Welcome to Laborator\uchar code dis2[ ]={\"y! EDA Course\

uchar code dis3[ ] ={\"LiLiZhuan CaiChunHua\uchar code dis4[ ] ={\" Last Page !!\

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

// delay()

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

void delay(uint z) {

uint x,y;

for (x=z;x>0;x--)

for (y=110;y>0;y--); //当z=1时,延时1ms. }

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

// 测试忙检测

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

bit lcd_bz() {

bit result; LCD_RS=0; LCD_RW=1; LCD_EP=1; delay(1);

result=(bit)(P2&0X80); LCD_EP=0;

return result; }

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

// 写入指令到LCD中

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

void lcd_wcmd(uchar cmd) {

while (lcd_bz()); LCD_RS=0; LCD_RW=0; LCD_EP=0; _nop_();

_nop_(); P2=cmd; _nop_(); _nop_(); _nop_(); _nop_(); LCD_EP=1; _nop_(); _nop_(); _nop_(); _nop_(); LCD_EP=0; return ; }

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

////初始化

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

void lcd_init() {

lcd_wcmd(0x38);//功能设置,8位2行5x7点阵 delay(12); lcd_wcmd(0x0c);//显示开/关控制 delay(12);

lcd_wcmd(0x06);//设置输入模式 delay(12);

lcd_wcmd(0x01);//清屏 delay(12); return ; }

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

// 写入字符显示数据到LCD中去

//*************************************************************** void lcd_wdat(uchar dat) {

while(lcd_bz()); LCD_RS=1; LCD_RW=0; LCD_EP=0; P2=dat;

_nop_(); _nop_(); _nop_(); _nop_(); LCD_EP=1; _nop_(); _nop_(); _nop_(); _nop_(); LCD_EP=0; return ; }

//******************************************************* // 设置显示位置

//******************************************************* void lcd_pos(uchar POS) {

lcd_wcmd(POS|0x80); return ; }

//******************************************************* // 设置服务子函数

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

void set_value() {

if (KEY_SET==0) {

delay(10);

if(KEY_SET==0)set++;flag=1; //功能键值递增 if(set>=3)set=0; //键值的范围0~4

again:if(KEY_SET==0)goto again; //若按键未释放,则等待 } }

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

// 调整值函数

//******************************************************* void add_value() {

if (KEY_UP==0) {

delay(10);

if(KEY_UP==0)m++; //键值递增 if(m>=10)m=0; //键值的范围0~9 a1:if(KEY_UP==0)goto a1; //若按键未释放,则等待 }

lcd_pos(0x1e);

lcd_wdat(0x30+m); if(KEY_ENTER==1) {out=0;} else out=1;

a2:if(KEY_ENTER==1)a2; }

// 第一页函数 void disply_1() {

uint i;

if(flag==1)

{lcd_wcmd(0x01);flag=0;}//清屏 delay(12); lcd_pos(0); i=0;

while(dis1[i]!='\\0') {

lcd_wdat(dis1[i]); i++; }

lcd_pos(0x40); i=0;

while(dis2[i]!='\\0') {

lcd_wdat(dis2[i]); i++; }

}

// 第二页函数 void disply_2() {

uint i;

if(flag==1)

{lcd_wcmd(0x01);flag=0;}//清屏 delay(12);

lcd_pos(0x40); i=0;

while(dis3[i]!='\\0') {

lcd_wdat(dis3[i]); i++; }

add_value(); a=m; }

// 第三页函数 void disply_3() {

uint i; if(flag==1)

{lcd_wcmd(0x01);flag=0;}//清屏 delay(12);

lcd_pos(0x40); i=0;

while(dis4[i]!='\\0') {

lcd_wdat(dis4[i]); i++; }

add_value();b=m; }

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

//************************************** void main() {

lcd_init(); delay(120);

}

P0=0xFF; //置P0 口 P2=0xFF; //置P2 口 lcd_wcmd(0x01);//清屏 disply_1(); while(1) {

set_value();

switch(set) //根据Set标志散转 {

case 0:disply_1();break; //第一页 case 1:m=a;disply_2();break; //第二页 case 2:m=b;disply_3();break; //第三页 default:break; } }

五、实验结果:

实验实现了LCD液晶能显示出欢迎界面的字符,按功能键1位,可实现三页的菜单显示同时实现增加键增加值得显示。

六、心得体会:

过此次的实验设计使我更加深刻的认识EDA电子电路设计的各个模块。熟悉了IP核的结果及其功能作用,也学会FPGA引脚锁定的灵活性。的在实验过程中,遇到好多问题,通过老师的帮助,一步一步的改好程序,改善程序,最终实现了所有的实验要求。

因篇幅问题不能全部显示,请点此查看更多更全内容