内蒙古师范大学计算机与信息工程学院《数字信号处理》课程设计报告实习题目指导教师职称学生姓名学号日期实习题目指导教师职称学生姓名学号日期实习题目指导教师职称学生姓名学号日期设计题目利用键盘控制液晶屏的显示指导教师郭改枝职称教授姓名学号日期2013年6月20日1利用键盘控制液晶屏的显示指导教师郭改枝讲师摘要本系统包括DSP对语音信号的处理、键盘控制、液晶屏显示几部分。DSP作为主芯片实现各模块之间的通信,其主要工作有:上电自举,读取键盘值并初始化液晶屏,通过液晶屏显示键盘的码值。同时,本设计在程序编写部分很好地将汇编语言与C语言结合起来,体现了语言之间的联系性,成功地利用键盘控制了液晶屏并显示了键码值。关键词上电自举;中断;读取键码;液晶显示1.系统总体概况1.1总体描述键盘的按键按下,表示一次中断,每次中断,DSP转向中断服务程序并且讲键码值送到液晶屏并显示出来。1.2程序框图2.系统的组成部分2.1键盘模块2.1.1键盘说明2键盘矩阵的行线和列线分别映射为DSP的IO空间的某个地址的数据线,行线的输出状态通过读IO空间的数据获得,列线的输入状态通过向IO空间写数据实现。实现键盘有两种方案:一是采用现有的一些芯片实现键盘扫描;另一种就是用软件实现键盘扫描。这里就介绍一下软键盘的实现方案。图2-1通常在一个键盘中使用了一个瞬时接触开关,并且用如上图2-1所示的简单电路,微处理器可以容易地检测到闭合。当开关打开时,通过处理器的I/O口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的I/O口的输入将被拉低得到逻辑0。可遗憾的是,开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的1或者0。尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。当触点闭合时,其弹起就像一个球。弹起效果将产生如图8-2所示的好几个脉冲。弹起的持续时间通常将维持在5ms~30ms之间。如果需要多个键,则可以将每个开关连接到微处理器上它自己的输入端口。然而,当开关的数目增加时,这种方法将很快使用完所有的输入端口。键盘上阵列这些开关最有效的方法(当需要5个以上的键时)就形成了一个如图8-3所示的二维矩阵。当行和列的数目一样多时,也就是方型的矩阵,将产生一个最优化的布列方式(I/O端被连接的时候)。一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。矩阵所需的键的数目显然根据应用程序而不同。每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。3图2-2按键抖动123456ABCD654321DCBATitleNumberRevisionSizeCDate:7-Jan-2009SheetofFile:E:\电子系项目\DSP\sch\dsp-21.ddbDrawnBy:S11S12S16S15S7S8S4S3KEY7KEY6KEY5KEY4KEY3KEY23R43R5VCCS2S1S6S5S10S9S14S13KEY13R3KEY03R2图2-3矩阵键盘键盘扫描过程就是让微处理器按有规律的时间间隔查看键盘矩阵,以确定是否有键被按下。一旦处理器判定有一个键按下,键盘扫描软件将过滤掉抖动并且判定哪个键被按下。每个键被分配一个称为扫描码的唯一标识符。应用程序利用该扫描码,根据按下的键来判定应该采取什么行动。换句话说,扫描码将告诉应用程序按下哪个键。2.1.2键盘扫描算法在初始化阶段,所有的行(输出端口)被强行设置为低电平。在没有任何键按下时。4所有的列(输入端口)将读到高电平。任何键的闭合将造成其中的一列变为低电平。为了查看是否有一个键已经被按下,微处理器仅仅需要查看任一列的值是否变成低电平。一旦微处理器检测到有键被按下,就需要找出是哪一个键。过程很简单,微处理器只需在其中一行上输出一个低电平。如果它在输入端口上发现一个0值,该微处理器就知道在所选择行上产生了键的闭合。相反,如果输入端口全是高电平,则被按下的键就不在那一行,微处理器将选择下一行,并重复该过程直到它发现了该行为止。一旦该行被识别出来,则被按下键的具体的列可以通过锁定输入端口上唯一的低电位来确定。微处理器执行这些步骤所需要的时间与最小的状态闭合时间相比是非常短的,因此它假设该键在这个时间间隔中将维持按下的状态。比如:当发现某列变为低电平时,此时微处理器仅在某一行上输出低电平,再查看列的状态,如果此时在输入端口上发现了一个0,则就可以断定就是此行上的键按下了,反之,如果输入端口上全为1,则就不是这一行上按下了键。根据第一步和第二步中得到的值,便可以得到相应的扫描码。比如,第一步中行全为零时列输入B1为零,当将输出的第二行B2置为零时,如果此时的列输入B1仍为零,则可得到扫描码为×××。2.2液晶屏模块2.2.1液晶屏说明另一种便仅是LCD显示屏,没有驱动电路,需要与驱动电路配合使用。特点是体积小,但是却需要另外的驱动芯片。也可以使用带有LCD驱动能力的高档MCU驱动。本实验我们使用的是带有驱动电路的LCD显示模块,采用DSP的总线方式来驱动。一般带有驱动模块的LCD显示屏使用这种驱动方式,由于LCD已经带有驱动硬件电路,因此模块给出的是总线接口,便于与单片机的总线进行接口。驱动模块具有八位数据总线,外加一些电源接口和控制信号。而且还自带显示缓存,只需要将要显示的内容送到显示缓存中就可以实现内容的显示。由于只有八条数据线,因此常常通过引脚信号来实现地址与数据线复用,以达到把相应数据送到相应显示缓存的目的。2.2.2指令表5指令代码功能R/WD/ID7D6D5D4D3D2D1D0显示开/关0010101111/0不论显示随机存储数据或内部状态如何,将显示打开或关闭1:开0:关显示起始线00110显示起始线(0····31)指定随机存储数据在显示器顶端显示(公共端0)编码地址设定00101110页:(0~3)设置页地址(页地址)列(段)地址设定000列地址(0~79)设置列地址(列地址)状态读取10busyADC开/关RST0000读状态busy1:I内部操作0:准备就绪ADC1:右向输出0:左向RST1:重启0:正常开/关1:显示关0:显示开写显示数据01写数据将数据总线中数据写入显存读显示数据11读数据将显存数据读入数据总线0010100000/1指定对显存数据顺时针读取或逆6ADC选择时针读取0:顺时针1:逆时针静态驱动开/关0010100100/1选择动态或静态驱动1:静态驱动0:动态驱动占空比选择0010101000/1选择占空比1:1/32H0:1/16RMW0011100000写操作时对列地址寄存器赋增量。读操作时不作改变。中止0011101110结束RWM模式重启0011100010设置显示器起始线寄存器为第1行,列地址寄存器以及编码地址寄存器为第0行节能模式(双重指令)00000011001100111001关闭显示器以及打开静态驱动,从而设置节能模式3.程序代码第一部分是键盘控制液晶屏的总体程序设计,实现了利用键盘控制液晶屏并显示代码。具体程序见附件一。第二部分是初始化程序,将各个寄存器,计数器,中断等初始化。具体程序见附件二。第三部分是命令程序,设置各个部分的位置等。具体程序见附件三。4.小结通过近两周的课程设计,我终于体会到实践是检验真理的唯一标准这句话的含义,只有不断的实践,不断的发现错误,不断的反思自己,才能一步步做出完美的结果。通过这次设计,我学到了以下几点:1.要想实现自己的小小目标,必须要有锲而不舍的精神,要有百折不挠,不怕错,不7怕输的精神。2.合作是相当重要的。没有李哲的全力付出,没有他的坚持,我们是不可能做出来的,而且我发现我的合作者具有很强的动手实践能力,这一点是我不具备的,在此向他学习。而我发现的都是小问题,而他动手能力又这么强,为此为有如此厉害的合作者高兴。3.提高了我的自学能力。很多知识是自己不会的,比如仿真软件的使用,通过查阅资料,上网学习,最终学到了有用的东西。4.巩固了我的专业知识,包括平时学的书本上的理论知识。最后,在整个设计实现过程中,得到了郭改枝老师的鼓励与精心指导,在此表示衷心的感谢!8参考文献[1]刘艳萍李志军,DSP技术原理及应用教程(第3版)北京航空航天出版社.[2]刘修文,电子控制电路300例,机械工业出版社,2005年4月.9附件一:利用键盘控制液晶屏的显示#includemath.h/*-------------------------------------*/voidWr_c_l(charcom);voidWr_c_r(charcom);voidWr_d_l(chardata);voidWr_d_r(chardata);voidInit_Lcd();voidCls_Lcd();voidlcd_dsp(charlorr,charpage_cnt,charline,charnumx[]);chartemp,clr_page_cnt,clr_byte_cnt,page_cnt,colm_cnt;ioportunsignedport0800;//lcddataioioportunsignedport1000;//lcdresetioportunsignedport0c00;//lcddiioportunsignedport1400;//lcdcs1ioportunsignedport1800;//lcdcs2ioportunsignedport2C00;//faguangcharnum0[]={0,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00};//0=00Hcharnum1[]={0,0x00,0x42,0x7F,0x40,0x00,0x00,0x00};//1=01Hcharnum2[]={0,0x42,0x61,0x51,0x49,0x46,0x00,0x00};//2=02Hcharnum3[]={0,0x21,0x41,0x45,0x4B,0x31,0x00,0x00};//3=03Hcharnum4[]={0,0x18,0x14,0x12,0x7F,0x10,0x00,0x00};//4=04Hcharnum5[]={0,0x27,0x45,0x45,0x45,0x39,0x00,0x00};//5=05Hcharnum6[]={0,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00};//6=06Hcharnum7[]={0,0x01,0x01,0x79,0x05,0x03,0x00,0x00};//7=07Hcharnum8[]={0,0x36,0x49,0x49,0x49,0x36,0x00,0x00};//8=08Hcharnum9[]={0,0x06,0x49,0x49,0x29,0x1E,0x00,0x00};//9=09Hcharnuma[]={0,0x14,0x08,0x3E,0x08,0x14,0x00,0x00};//*=0AH10charnumb[]={0,0x08,0x08,0x3E,0x08,0x08,0x00,0x00};//+=0BHcharnumc[]={0,0x00,0x50,0x30,0x00,0x00,0x00,0x00};//,=0CHcharnumd[]={0,0x08,0x08,0x08,0x08,0x08,0x00,0x00};//-=0DHcharnume[]={0,0x00,0x60,0x60,0x00,0x00,0x00,0x00};//.=0EHcharnumf[]={0,0x20,0x10,0x08,0x04,0x02,0x00,0x00};///=0FHcharnum10[]={0,0x32,0x49,0x79,0x41,0x3E,0x00,0x00};//@=10Hcharnum11[]={0,0x00,0x00,0x4F,0x00,0x00,0x00,0x00};//!=1lHcharnum12[]={0,0x00,0x07,0x00,0