西安交通大学电子系统实践与设计报告
低位输入指令信号,R/W高位MFC-G12864写数据,低位读数据,E位使能端,高位有效,CS1高位选中左半屏,CS2高位选中右半屏。不管是方案一还是方案二,控制信号的传输均需要CPLD内的时序电路的连接。本系统设计中,PLD的五个输出端口已在电路板上和该五个控制位接在一起,PLD内部将这五个输出口和单片及的地址线A8、A9、P16、P15通过一些逻辑门相接,实现单片机对MFC-G12864的控制。PLC设计图如下:
A8高位时选中MFC-G12864数据寄存器,低位选中MFC-G12864指令寄存器,A9需一直保持为高才能使使能端E有效。此外,另无关的地址线为高位,得出数据寄存器的地址为0xFFFF, 指令寄存器的地址为0xFEFF。同时,PLD的8个IO口与单片机的数据总线相接,但实际上PLD并不需要从数据总线上读值,故这8个IO口并不使用,查资料可知PLD闲置的这8个IO口会钳制数据总线的高低位,因此在PLD内部需将这8个口设为输出口,接在无用的IO上,PLD电路图如下:
故主要控制程序设计如下:
西安交通大学电子系统实践与设计报告
#define lcdcom XBYTE[0xFEFF] //lcd指令寄存器
#define lcddat XBYTE[0xFFFF] //lcd数据寄存器
//LCD显示口 sbit cs1=P1^5;
sbit cs2=P1^5; //low sbit RW=P1^6;
void sendcom(unsigned char
cmd ,int i)//向lcd写指令
{
if(i==1) { cs1=1; delay(1);
lcdcom=cmd;} else{
cs2=0; delay(1);
lcdcom=cmd;} }
void senddat(unsigned char
dat,int i)//向lcd写数据
{
if(i==1) {
cs1=1; delay(1); lcddat=dat; }
else{ cs2=0; delay(1); lcddat=dat; } }
(5)液晶模块显示汉字方法:
本系统设计使用图形液晶模块以点阵形式来显示汉字。每8个点组成1个字节,每个点用一个2进制位表示,存1的点显示时在屏上显示1个亮点;存0的点则在屏上不显示。在单片机系统中对字模的存储,是将提取的汉字字模数据作为常量数组存放在程序存储区内,单片机再将已提取的汉字的字模输入液晶控制器,即可按设定在液晶模块显示屏上显示需要的汉字。
故写数据函数设计如下://写汉字函数
void lcdhanzi(unsigned char page,unsigned char lie,unsigned char code *word, int cs)//汉字显示
{ int i,j;
for(i=0;i<2;i++) { delay(1);
sendcom(0xB8+page+i,cs);//x每加1,液晶上加8横行
delay(1);
sendcom(0x40+lie,cs); for(j=0;j<16;j++) { delay(1);
senddat(word[i*16+j],cs);//数组每个元素的8位,写在竖着的一列8个点(dot),写完一个元素,y(列)自动加1
} } }
//写数字函数 Void lcdshuzi(unsigned char page,unsigned char lie,unsigned char code *word, int cs)//数字显示
{ unsigned char i,j; for(i=0;i<2;i++) {
西安交通大学电子系统实践与设计报告
delay(1);
sendcom(0xBB+page+i,cs); sendcom(0x40+lie,cs); for(j=0;j<8;j++)
senddat(word[i*8+j],cs);//数组每个元素的8位,写在竖着的一列8个点(dot),写完一个元素,y(列)自动加1
} }
3、键盘控制模块的设计
在键盘控制模块中,键入信号的软件处理方法是影响系统操作性能的重要因素。键盘的接口及软件的任务主要包括以下几个方面:首先,检测并判断是否有键按下;其次,对按键开关进行时延的消抖;再次,计算并确定按键的键值;最后,程序根据计算出的键值进行一系列的动作处理和执行。
在实际系统中,当需要输入参数较多,功能复杂时,需要采用行列的键盘对单片机进行输入。本实验需要的键盘比较简单,如下图所示,键盘接上拉电阻后与电源的高电平相连。
VCCR1Res210KR2Res210KR3Res210KR4Res210KR5Res210KKEY0SW-PBKEY1SW-PBKEY2SW-PBKEY3SW-PBKEY4SW-PB
图4-5 控制键
常用的键盘识别方法有:行扫描法、线反转法和利用8279键盘接口的中断法。
键盘识别的流程如下图。
西安交通大学电子系统实践与设计报告
键盘识别 NO 是否有键按下? YES 去抖动 确定按键位置 结束 图4-6 键盘识别流程图
(1)本实验按键比较简单,故程序设计时,将五个功能键接口定义为五个标志位。然后再程序中设置按键函数,里面嵌套while循环,一直读取五个功能键接口的状态,如果各口均为高电平,则无键按下;若有低电平状态,则有键按下。按键本身是机械开关,在闭合或断开的瞬间会出现电压抖动的现象,必须去除抖动的影响,才能正确识别被按下的键。为简单起见,使用软件方法消抖,延时10ms,再次读取各状态,若两次状态相同,说明信号稳定,可以继续进入相应的键处理子程序中。软件主要实现三个功能:键盘按键的消抖、查询按下的键所在的位置、相应的处理子程序,键盘接口程序如下:
//按键查询口定义
sbit key0=P1^0; sbit key1=P1^1; sbit key2=P1^2; sbit key3=P1^3; sbit key4=P1^4; //按键处理函数 void judge_key() { while(1) {
if(key0==0) {delay(10); if(key0==0) { init_lcd(); clear_lcd();
// key0功能函数
} }
if(key1==0) { delay(10); if(key1==0) { init_lcd();
西安交通大学电子系统实践与设计报告
clear_lcd(); // key1功能函数
}
}
if(key2==0) { delay(10); if(key2==0) { init_lcd(); clear_lcd(); // key2功能函数
}
}
if(key3==0) { delay(10); if(key3==0)
{ init_lcd(); clear_lcd(); // key3功能函数
}
}
if(key4==0) { delay(10); if(key4==0) { init_lcd(); clear_lcd(); // key4功能函数
}
} } }
(2)本系统的设计中,功能按键模块放在设计最后,主要目的是考虑到可以通过该模块,将测頻模块和显示模块联系在一起。而且整个系统的功能最终都是要通过按键注意选择来显示出来的。
系统功能设计:1.key0:按键显示频率值及其单位;
2. key1:按键操作改变显示字符大小;
3 .key2:按键切换到测脉宽状态; 4.key3:按键复位,重新进行初始化 5.key4:按键退出测频和测脉宽
系统初始化完毕后会自动进入按键查询,标致状态为屏幕中央的“请按键??” Key0处理子程序:
working=1;---------工作状态标志位,由此来控制循环的进行及部分液晶显示内容 displaywork();------液晶显示子函数,会在第一行滚屏显示“working??” manage1616();------频率值显示子函数,会在屏幕中央显示被测的频率值及单位 Key1处理子程序:
working=1;---------工作状态标志位,由此来控制循环的进行及部分液晶显示内容 displaywork();------液晶显示子函数,会在第一行滚屏显示“working??” manage2424();-----大字符显示子函数,会在屏幕中央显示放大的被测频率值及单位