一、实验目的
为了有效加深对数字系统的分析和设计方法,熟练用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 #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引脚锁定的灵活性。的在实验过程中,遇到好多问题,通过老师的帮助,一步一步的改好程序,改善程序,最终实现了所有的实验要求。 因篇幅问题不能全部显示,请点此查看更多更全内容