基于FPGA的 LCD1602顯示控制器設(shè)計(jì)_第1頁(yè)
基于FPGA的 LCD1602顯示控制器設(shè)計(jì)_第2頁(yè)
基于FPGA的 LCD1602顯示控制器設(shè)計(jì)_第3頁(yè)
基于FPGA的 LCD1602顯示控制器設(shè)計(jì)_第4頁(yè)
基于FPGA的 LCD1602顯示控制器設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、唐 山 學(xué) 院 EDA技術(shù) 課 程 設(shè) 計(jì) 題 目 LCD1602顯示控制器設(shè)計(jì) 系 (部) 信息工程系 班 級(jí) 11電本3班 姓 名 劉亮 學(xué) 號(hào) 4110218214 指導(dǎo)教師 郭耀華 田麗欣 柳延領(lǐng) 2014 年6 月 30 日至 7月 4日 共 1 周2014年 7月 4日課程設(shè)計(jì)成績(jī)?cè)u(píng)定表出勤情況出勤天數(shù) 缺勤天數(shù)成績(jī)?cè)u(píng)定出勤情況及設(shè)計(jì)過程表現(xiàn)(20分)課設(shè)答辯(20分)設(shè)計(jì)成果(60分)硬件調(diào)試設(shè)計(jì)說明書總成績(jī)(100分)提問(答辯)問題情況綜合評(píng)定 指導(dǎo)教師簽名: 年 月 日目錄1 引言11.1 EDA技術(shù)的介紹11.2 EDA技術(shù)的發(fā)展22 VHDL/Quartus II簡(jiǎn)介4

2、2.1 VHDL語言介紹42.2 界面介紹53 模塊設(shè)計(jì)63.1 LCD1602液晶模塊63.2 矩陣鍵盤模塊93.3 設(shè)計(jì)思路104 系統(tǒng)設(shè)計(jì)方案一114.1 矩陣鍵盤模塊設(shè)計(jì)114.2 LCD1602液晶顯示模塊設(shè)計(jì)145 系統(tǒng)設(shè)計(jì)方案二175.1撥碼開關(guān)控制的LCD1602顯示模塊175.2撥碼開關(guān)控制的LCD1602顯示模塊程序175.3撥碼開關(guān)控制的LCD1602顯示模塊仿真圖206 設(shè)計(jì)總結(jié)21參考文獻(xiàn)22課程設(shè)計(jì)說明書1 引言1.1 EDA技術(shù)的介紹在電子設(shè)計(jì)自動(dòng)化(英語:Electronic design automation,縮寫:EDA)出現(xiàn)之前,設(shè)計(jì)人員必須手工完成集成電

3、路的設(shè)計(jì)、布線等工作,這是因?yàn)楫?dāng)時(shí)所謂集成電路的復(fù)雜程度遠(yuǎn)不及現(xiàn)在。工業(yè)界開始使用幾何學(xué)方法來制造用于電路光繪(photoplotter)的膠帶。到了1970年代中期,開發(fā)人員嘗試將整個(gè)設(shè)計(jì)過程自動(dòng)化,而不僅僅滿足于自動(dòng)完成掩膜草圖。第一個(gè)電路布線、布局工具研發(fā)成功。設(shè)計(jì)自動(dòng)化會(huì)議(Design Automation Conference)在這一時(shí)期被創(chuàng)立,旨在促進(jìn)電子設(shè)計(jì)自動(dòng)化的發(fā)展。電子設(shè)計(jì)自動(dòng)化發(fā)展的下一個(gè)重要階段以卡弗爾·米德(Carver Mead)和琳·康維于1980年發(fā)表的論文超大規(guī)模集成電路系統(tǒng)導(dǎo)論(Introduction to VLSI Systems)

4、為標(biāo)志。這一篇具有重大意義的論文提出了通過編程語言來進(jìn)行芯片設(shè)計(jì)的新思想。如果這一想法得到實(shí)現(xiàn),芯片設(shè)計(jì)的復(fù)雜程度可以得到顯著提升。這主要得益于用來進(jìn)行集成電路邏輯仿真、功能驗(yàn)證的工具的性能得到相當(dāng)?shù)母纳?。隨著計(jì)算機(jī)仿真技術(shù)的發(fā)展,設(shè)計(jì)項(xiàng)目可以在構(gòu)建實(shí)際硬件電路之前進(jìn)行仿真,芯片布線布局對(duì)人工設(shè)計(jì)的要求降低,而且軟件錯(cuò)誤率不斷降低。直至今日,盡管所用的語言和工具仍然不斷在發(fā)展,但是通過編程語言來設(shè)計(jì)、驗(yàn)證電路預(yù)期行為,利用工具軟件綜合得到低抽象級(jí)物理設(shè)計(jì)的這種途徑,仍然是數(shù)字集成電路設(shè)計(jì)的基礎(chǔ)。從1981年開始,電子設(shè)計(jì)自動(dòng)化逐漸開始商業(yè)化。1984年的設(shè)計(jì)自動(dòng)化會(huì)議(Design Autom

5、ation Conference)上還舉辦了第一個(gè)以電子設(shè)計(jì)自動(dòng)化為主題的銷售展覽。Gateway設(shè)計(jì)自動(dòng)化在1986年推出了一種硬件描述語言Verilog,這種語言在現(xiàn)在是最流行的高級(jí)抽象設(shè)計(jì)語言。1987年,在美國(guó)國(guó)防部的資助下,另一種硬件描述語言VHDL被創(chuàng)造出來?,F(xiàn)代的電子設(shè)計(jì)自動(dòng)化工具可以識(shí)別、讀取不同類型的硬件描述。根據(jù)這些語言規(guī)范產(chǎn)生的各種仿真系統(tǒng)迅速被推出,使得設(shè)計(jì)人員可對(duì)設(shè)計(jì)的芯片進(jìn)行直接仿真。后來,技術(shù)的發(fā)展更側(cè)重于邏輯綜合。目前的數(shù)字集成電路的設(shè)計(jì)都比較模塊化(參見集成電路設(shè)計(jì)、設(shè)計(jì)收斂(Design closure)和設(shè)計(jì)流(Design flow (EDA))。半導(dǎo)體

6、器件制造工藝需要標(biāo)準(zhǔn)化的設(shè)計(jì)描述,高抽象級(jí)的描述將被編譯為信息單元(cell)的形式。設(shè)計(jì)人員在進(jìn)行邏輯設(shè)計(jì)時(shí)無需考慮信息單元的具體硬件工藝。利用特定的集成電路制造工藝來實(shí)現(xiàn)硬件電路,信息單元就會(huì)實(shí)施預(yù)定義的邏輯或其他電子功能。半導(dǎo)體硬件廠商大多會(huì)為它們制造的元件提供“元件庫(kù)”,并提供相應(yīng)的標(biāo)準(zhǔn)化仿真模型。相比數(shù)字的電子設(shè)計(jì)自動(dòng)化工具,模擬系統(tǒng)的電子設(shè)計(jì)自動(dòng)化工具大多并非模塊化的,這是因?yàn)槟M電路的功能更加復(fù)雜,而且不同部分的相互影響較強(qiáng),而且作用規(guī)律復(fù)雜,電子元件大多沒有那么理想。Verilog AMS就是一種用于模擬電子設(shè)計(jì)的硬件描述語言。此外,設(shè)計(jì)人員可以使用硬件驗(yàn)證語言來完成項(xiàng)目的驗(yàn)證

7、工作目前最新的發(fā)展趨勢(shì)是將集描述語言、驗(yàn)證語言集成為一體,典型的例子有SystemVerilog。隨著集成電路規(guī)模的擴(kuò)大、半導(dǎo)體技術(shù)的發(fā)展,電子設(shè)計(jì)自動(dòng)化的重要性急劇增加。這些工具的使用者包括半導(dǎo)體器件制造中心的硬件技術(shù)人員,他們的工作是操作半導(dǎo)體器件制造設(shè)備并管理整個(gè)工作車間。一些以設(shè)計(jì)為主要業(yè)務(wù)的公司,也會(huì)使用電子設(shè)計(jì)自動(dòng)化軟件來評(píng)估制造部門是否能夠適應(yīng)新的設(shè)計(jì)任務(wù)。電子設(shè)計(jì)自動(dòng)化工具還被用來將設(shè)計(jì)的功能導(dǎo)入到類似現(xiàn)場(chǎng)可編程邏輯門陣列的半定制可編程邏輯器件,或者生產(chǎn)全定制的專用集成電路。1.2 EDA技術(shù)的發(fā)展從20世紀(jì)70年代,人們就已經(jīng)開始基于計(jì)算機(jī)開發(fā)出一些軟件工具幫助設(shè)計(jì)者完成電路

8、系統(tǒng)的設(shè)計(jì)任務(wù),以替代傳統(tǒng)的手工設(shè)計(jì)的方法,隨著計(jì)算機(jī)軟件和硬件技術(shù)水平的提高,EDA技術(shù)也不斷進(jìn)步,大致經(jīng)歷了下面三個(gè)發(fā)展階段:(1)CAD階段:20世紀(jì)70年代至80年代初,由于電子技術(shù)軟件的功能較弱和個(gè)人計(jì)算機(jī)的普及度不高,人們主要借助于計(jì)算機(jī)對(duì)所設(shè)計(jì)的電路的性能進(jìn)行模擬和預(yù)測(cè);完成簡(jiǎn)單的版圖繪制和PCB布局。這是EDA技術(shù)發(fā)展的早起階段。(2)CAE階段:20世紀(jì)80年代至90年代初,由于人們?cè)谠O(shè)計(jì)方法學(xué)、設(shè)計(jì)工具集成優(yōu)化方面取得了長(zhǎng)足的進(jìn)步,使得集成電路規(guī)模逐漸擴(kuò)大,電子系統(tǒng)設(shè)計(jì)也逐步復(fù)雜,與CAD相比,又增加了電路功能設(shè)計(jì)和結(jié)構(gòu)設(shè)計(jì)、工程設(shè)計(jì)、原理圖輸入、邏輯仿真、電路分析、自動(dòng)布

9、局布線、PCB后分析等功能。由此EDA進(jìn)入CAE階段。(3)EDA階段:20世紀(jì)90年代以來,由于微電子工藝的顯著發(fā)展,促進(jìn)了電子設(shè)計(jì)工具的不斷改善。尤其是進(jìn)入21世紀(jì)以后,EDA技術(shù)得到了更快的發(fā)展。使得EDA技術(shù)廣泛應(yīng)用于各個(gè)領(lǐng)域,IP核的SoC設(shè)計(jì)技術(shù)日趨成熟、SoPC技術(shù)步入實(shí)用化階段、高速DSP實(shí)現(xiàn)成為了可能、復(fù)雜電子系統(tǒng)的設(shè)計(jì)和驗(yàn)證更加高效。沒有EDA技術(shù)的支持,想要完成上述超大規(guī)模集成電路的設(shè)計(jì)制造是不可想象的,反過來,生產(chǎn)制造技術(shù)的不斷進(jìn)步又必將對(duì)EDA技術(shù)提出新的要求。隨著電子技術(shù)的發(fā)展和人們對(duì)電子設(shè)計(jì)開發(fā)的難度及周期要求,EDA技術(shù)必將廣發(fā)應(yīng)用于電子設(shè)計(jì)的各個(gè)領(lǐng)域,因此本設(shè)

10、計(jì)也采用了EDA的設(shè)計(jì)方法,其設(shè)計(jì)的優(yōu)越性明顯高于傳統(tǒng)的設(shè)計(jì)方法。本次設(shè)計(jì)的LCD1602顯示控制器,就是通過eda進(jìn)行的一次實(shí)踐。在日常生活中,我們對(duì)LCD1602顯示器并不陌生。LCD1602顯示模塊已作為很多電子產(chǎn)品的通過器件,如在計(jì)算器、萬用表、電子表及很多家用電子產(chǎn)品中都可以看到,顯示的主要是數(shù)字、專用符號(hào)和圖形。LCD1604晶液顯示器作為輸出器件有以下幾個(gè)優(yōu)點(diǎn):1.顯示質(zhì)量高由于液晶顯示器每一個(gè)點(diǎn)在收到信號(hào)后就一直保持那種色彩和亮度,恒定發(fā)光,而不像陰極射線管顯示器(CRT)那樣需要不斷刷新新亮點(diǎn)。因此,液晶顯示器畫質(zhì)高且不會(huì)閃爍。2.數(shù)字式接口。液晶顯示器都是數(shù)字式的,和單片機(jī)

11、系統(tǒng)的接口更加簡(jiǎn)單可靠,操作更加方便。3.體積小、重量輕液晶顯示器通過顯示屏上的電極控制液晶分子狀態(tài)來達(dá)到顯示的目的,在重量上比相同顯示面積的傳統(tǒng)顯示器要輕得多。4.功耗低。相對(duì)而言,液晶顯示器的功耗主要消耗在其內(nèi)部的電極和驅(qū)動(dòng)IC上,因而耗電量比其它顯示器要少得多。這次設(shè)計(jì)主要任務(wù)是設(shè)計(jì)基于FPGA的LCD控制器,采用了帶ST7920驅(qū)動(dòng)的LCD1602液晶模塊,并使用Altera公司的cyclone系列的EP2C5T144C8來作為核心的控制器??刂破鞑糠植捎肰HDL語言編寫,主體程序采用了狀態(tài)機(jī)作為主要控制方式。該控制器分為字符顯示模塊和圖片顯示模塊兩個(gè)主要部分。在字符的顯示功能上采用顯

12、示控制模塊與字符調(diào)用RAM相結(jié)合的方式,使使用者能方便地調(diào)用液晶自帶的字庫(kù)來顯示字符;而圖片顯示模塊則通過特殊的處理算法解決了圖像顯示緩沖區(qū)X地址不斷移位以及上下半屏分開的問題,通過讀取圖片ROM來顯示圖片。最后實(shí)現(xiàn)使用FPGA在LCD上的任意位置顯示任意5*7的英文字符,另外要能根據(jù)輸入數(shù)據(jù)的變化同步變化LCD上顯示的內(nèi)容。同時(shí)要能將儲(chǔ)存模塊中的圖片數(shù)據(jù)正常地顯示在LCD上。2 VHDL/Quartus II簡(jiǎn)介2.1 VHDL語言介紹電子設(shè)計(jì)自動(dòng)化(EDA)的關(guān)鍵技術(shù)之一是要求用形式化方法來描述數(shù)字系統(tǒng)的硬件電路。VHDL 硬件描述語言在電子設(shè)計(jì)自動(dòng)化中扮演著重要的角色,他是EDA 技術(shù)研

13、究的重點(diǎn)之一。VHDL語言是一種用于電路設(shè)計(jì)的高級(jí)語言。它在80年代的后期出現(xiàn)。最初是由美國(guó)國(guó)防部開發(fā)出來供美軍用來提高設(shè)計(jì)的可靠性和縮減開發(fā)周期的一種使用范圍較小的設(shè)計(jì)語言 。但是,由于它在一定程度上滿足了當(dāng)時(shí)的設(shè)計(jì)需求,于是他在1987年成為ANSI/IEEE的標(biāo)準(zhǔn)(IEEE STD 1076-1987)。1993年更進(jìn)一步修訂,變得更加完備,成為ANSI/IEEE的ANSI/IEEE STD 1076-1993標(biāo)準(zhǔn)。目前,大多數(shù)的CAD廠商出品的EDA軟件都兼容了這種標(biāo)準(zhǔn)。VHDL的英文全寫是:VHSIC(Very High Speed Integrated Circuit)Hardwa

14、re Descriptiong Language.翻譯成中文就是超高速集成電路硬件描述語言。因此它的應(yīng)用主要是應(yīng)用在數(shù)字電路的設(shè)計(jì)中。目前,它在中國(guó)的應(yīng)用多數(shù)是用在FPGA/CPLD/EPLD的設(shè)計(jì)中。當(dāng)然在一些實(shí)力較為雄厚的單位,它也被用來設(shè)計(jì)ASIC。硬件描述語言是EDA 技術(shù)的重要組成部分,VHDL 是作為電子設(shè)計(jì)主流硬件描述語言,VHDL(Very High Speed Integrated Circuit Hardware Description Language)于1983 年由美國(guó)國(guó)防部發(fā)起創(chuàng)建,由IEEE進(jìn)一步發(fā)展并在1987年作為IEEE標(biāo)準(zhǔn)10760發(fā)布。因此,VHDL成為

15、硬件描述語言的業(yè)界標(biāo)準(zhǔn)之一。VHDL語言具有很強(qiáng)的電路描述和建模能力,能從多個(gè)層次對(duì)數(shù)字系統(tǒng)進(jìn)行建模和描述,從而大大簡(jiǎn)化了硬件設(shè)計(jì)任務(wù),提高了設(shè)計(jì)效率和可靠性,使用VHDL語言,可以就系統(tǒng)的總體要求出發(fā),自上而下地將設(shè)計(jì)內(nèi)容細(xì)化,最后完成系統(tǒng)硬件的整體設(shè)計(jì)。一個(gè)完整的VHDL程序包括以下幾個(gè)基本組成部分:實(shí)體(Entity),結(jié)構(gòu)體(Architecture),程序包(Package),庫(kù)(Library)。其中,實(shí)體是一個(gè)VHDL程序的基本單元,由實(shí)體說明和結(jié)構(gòu)體兩部分組成,實(shí)體說明用于描述設(shè)計(jì)系統(tǒng)的外部接口信號(hào);結(jié)構(gòu)體用于描述系統(tǒng)的行為,系統(tǒng)數(shù)據(jù)的流程或系統(tǒng)組織結(jié)構(gòu)形式。程序包存放各設(shè)計(jì)模

16、塊能共享的數(shù)據(jù)類型,常數(shù),子程序等。庫(kù)用于存放已編譯的實(shí)體,機(jī)構(gòu)體,程序包及配置。VHDL 語言的編譯環(huán)境有不同的版本,我們應(yīng)用的是Altera 公司的Maxplus 軟件,它的操作順序如下:使用TEXTEDITOR 編寫VHDL 程序使用COMPILER 編譯VHDL 程序;使用WAVE2FORMEDITOR,SIMULAROT 仿真實(shí)驗(yàn);使用TIMINGANALTZER 進(jìn)行芯片的時(shí)序分析;用FLOORPLANEDITOR 鎖定芯片管腳位置;使用PROGRAMMER 將編譯好的VHDL 程序下載到芯片中。2.2 界面介紹軟件打開界面如圖2.1所示:圖2.1 軟件打開界面3 模塊設(shè)計(jì)本設(shè)計(jì)將

17、基于VHDL語言,以EDA技術(shù)作為開發(fā)手段,采用復(fù)雜的可編程邏輯器件作為控制核心實(shí)現(xiàn)功能。采用VHDL語言描述。整體分為4*4鍵盤掃描模塊和LCD1602的現(xiàn)實(shí)模塊,最后利用元件例化語句生成頂層電路,用Max+PlusII軟件進(jìn)行仿真。具體要求如下:1.掌握LCD1602字符型液晶顯示器工作和時(shí)序原理。2.使用VHDL語言通過FPGA實(shí)現(xiàn)對(duì)LCD1602字符型液晶顯示器的控制。3.基本設(shè)計(jì)內(nèi)容:在LCD1602字符型液晶顯示器上面顯示個(gè)人信息,包括姓名和學(xué)號(hào)。4.進(jìn)階設(shè)計(jì)內(nèi)容:在LCD1602字符型液晶顯示器上面顯示動(dòng)態(tài)字符,通過按鍵輸入相應(yīng)的數(shù)字和字符。3.1 LCD1602液晶模塊所謂16

18、02是指顯示的內(nèi)容為16*2,即可以顯示兩行,每行16個(gè)字符。目前市面上字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780寫的控制程序可以很方便地應(yīng)用于市面上大部分的字符型液晶。字符型LCD1602通常有14條引腳線或16條引腳線的LCD,多出來的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理與14腳的LCD完全一樣,引腳定義如表3.1所示:表3.1 LCD1602管腳功能圖LCD1602內(nèi)置了DDRAM和CGRAM。DDRAM就是顯示數(shù)據(jù)RAM,用來寄存待顯示的字符代碼。共80個(gè)字節(jié),其地址和屏幕的對(duì)應(yīng)關(guān)系如表3.2:1602液

19、晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)表3.2 DDRAM地址與顯示位置陣字符圖形,如下表3.3所示,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)、和日文假名等,每一個(gè)字符都有一個(gè)固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時(shí)模塊把地址41H中的點(diǎn)陣字符圖形顯示出來,我們就能看到字“A”。表3.3 CGROM地址所對(duì)應(yīng)的字符關(guān)系表如何對(duì)DDRAM的內(nèi)容和地址進(jìn)行具體操作,LCD1602的指令集及其設(shè)置說明,共5條指令:1.清屏指令如表3.4:表3.4 清屏指令功能: <1> 清除液晶顯示器,即將DDRAM的內(nèi)容全

20、部填入"空白"的ASCII碼20H; <2> 光標(biāo)歸位,即將光標(biāo)撤回液晶顯示屏的左上方; <3> 將地址計(jì)數(shù)器(AC)的值設(shè)為0。2.光標(biāo)歸位指令如表3.5:表3.5 光標(biāo)歸位功能:<1> 把光標(biāo)撤回到顯示器的左上方; <2> 把地址計(jì)數(shù)器(AC)的值設(shè)置為0; <3> 保持DDRAM的內(nèi)容不變3.模式設(shè)置指令如表3.6:表3.6 模式設(shè)置指令功能:設(shè)定每次定入1位數(shù)據(jù)后光標(biāo)的移位方向,并且設(shè)定每次寫入的一個(gè)字符是否移動(dòng)。4. 設(shè)定DDRAM地址指令如表3.7:表3.7 設(shè)定DDRAM地址指令功能:設(shè)定下一個(gè)要存入

21、數(shù)據(jù)的CGRAM的地址。(注意這里送地址的時(shí)候應(yīng)該是0x80+Address,這也是前面說到寫地址命令的時(shí)候要加上0x80的原因) 5.數(shù)據(jù)寫入DDRAM或CGRAM指令如表3.8表3.8 數(shù)據(jù)寫入DDRAM或CGRAM指令功能:<1> 將字符碼寫入DDRAM,以使液晶顯示屏顯示出相對(duì)應(yīng)的字符; <2> 將使用者自己設(shè)計(jì)的圖形存入CGRAM。3.2 矩陣鍵盤模塊矩陣式鍵盤由行線和列線組成,按鍵位于行、列的交叉點(diǎn)上。(如圖3.1)當(dāng)鍵被按下時(shí),其交點(diǎn)的行線和列線接通,相應(yīng)的行線或列線上的電平發(fā)生變化,通過檢測(cè)行或列線上的電平變化可以確定哪個(gè)按鍵被按下。矩陣鍵盤不僅在連接上

22、比單獨(dú)式按鍵復(fù)雜,它的按鍵識(shí)別方法也比單獨(dú)式按鍵復(fù)雜。矩陣鍵盤的檢測(cè)方法有多種,常見的有:逐點(diǎn)掃描法、逐行掃描法、全局掃描法。在本實(shí)例中我們采用逐行掃描法來實(shí)現(xiàn)按鍵檢測(cè),其中PD0-PD3作為列線,PD4-PD7作為行線。識(shí)別過程如下:1、判斷鍵盤中是否有鍵按下。設(shè)置所有行線為輸出口,并輸出低電平;設(shè)置列線為輸入口,讀取列線上的電平狀態(tài),只要有一列的電平為低,就表示有按鍵按下,并且被按下的鍵位于電平為低的列線與4跟行線相交叉的4個(gè)按鍵中,若所有列線都為高電平,表示沒有按鍵按下。2、判斷被按下按鍵所在的位置。在確認(rèn)有鍵按下后(進(jìn)行按鍵消抖處理后),接下來就是確定具體哪個(gè)案件被按下,方法是:依次將

23、每根行線設(shè)置為輸出口,并輸出低電平(同時(shí)剩余行線輸出高電平),然后逐列檢查每根列線的電平狀態(tài),若某列為低電平,則該列線與設(shè)置為輸出低電平的行線交叉處的按鍵就是被按下的按鍵。3、按鍵位置確定后,接下來就要給矩陣鍵盤中的每個(gè)按鍵進(jìn)行編號(hào),也就是進(jìn)行按鍵編碼,程序設(shè)計(jì)中常用計(jì)算法和查表法兩種方式對(duì)按鍵進(jìn)行編碼,本實(shí)例采用計(jì)算法編碼。圖3.1 矩陣鍵盤結(jié)構(gòu)圖3.3 設(shè)計(jì)思路1、循環(huán)輸出行信號(hào),檢測(cè)列信號(hào)輸入,將行列信號(hào)相并。2、譯鍵值。3、去抖動(dòng)。在譯碼一個(gè)鍵值后,為了防止抖動(dòng),加了一個(gè)計(jì)算環(huán)節(jié),一旦檢測(cè)到列信號(hào)后,譯碼,緊跟著進(jìn)入計(jì)數(shù)環(huán)節(jié),此時(shí)鍵抖動(dòng)不會(huì)進(jìn)入其他環(huán)節(jié),這樣可以防止抖動(dòng)。4、譯碼、循環(huán)

24、顯示。電路的具體功能羅列如下:采用4×4矩陣鍵盤作為操作數(shù)和操作符的輸入設(shè)備。由于所有鍵盤在按下或者彈起的時(shí)候均有按鍵抖動(dòng),所以應(yīng)該采用去抖電路,當(dāng)檢測(cè)到有按鍵按下去的時(shí)候,應(yīng)該延時(shí)20ms后,再進(jìn)行檢測(cè),如果仍有鍵盤按鍵被按下去的話,則進(jìn)行鍵盤讀值。4 系統(tǒng)設(shè)計(jì)方案一4.1 矩陣鍵盤模塊設(shè)計(jì)本文所設(shè)計(jì)的矩陣鍵盤的電路符號(hào)如圖4.1所示。其中,clk為時(shí)鐘信號(hào)輸入端(頻率可為1 024Hz);start為清零控制端;kbrow為列掃描信號(hào)輸入端;kbeol為行掃描信號(hào)輸出端;seg7為L(zhǎng)CD1602顯示信號(hào)輸出端。圖4.1矩陣鍵盤模塊程序:library ieee;use ieee.

25、std_logic_1164.all;use ieee.std_logic_unsigned.all;entity scanf isport( clk : in std_logic;-掃描時(shí)鐘信號(hào) start : in std_logic;-開始信號(hào),高電平有效 kbcol : in std_logic_vector(3 downto 0);-行掃描信號(hào) kbrow : out std_logic_vector(3 downto 0);-列掃描信號(hào) seg7_out : out std_logic_vector(6 downto 0);-七段顯示控制信號(hào)(abcdefg)end scanf;a

26、rchitecture one of scanf is signal count : std_logic_vector(1 downto 0); signal sta : std_logic_vector(1 downto 0); signal seg7 : std_logic_vector(6 downto 0); signal dat : std_logic_vector(4 downto 0); signal fn : std_logic;-按鍵標(biāo)志位,判斷是否有鍵被按下begin -循環(huán)掃描計(jì)數(shù)器 process(clk) begin if clk'event and clk=

27、'1' then count<=count+1; end if; end process;-循環(huán)列掃描 process(clk) begin if clk'event and clk='1' then case count is when "00"=>kbrow<="0001"sta<="00" when "01"=>kbrow<="0010"sta<="01" when "10&qu

28、ot;=>kbrow<="0100"sta<="10" when "11"=>kbrow<="1000"sta<="11" when others=>kbrow<="1111" end case; end if; end process;-行掃描譯碼 process(clk,start) begin if start='0' then seg7<="0000000" elsif clk&

29、#39;event and clk='1' then case sta is when "00"=> case kbcol is when "0001"=>seg7<="1111001"dat<="00011"-3when "0010"=>seg7<="1101101"dat<="00010"-2when "0100"=>seg7<="0110000&quo

30、t;dat<="00001"-1when "1000"=>seg7<="1111110"dat<="00000"-0when others=>seg7<="0000000"dat<="11111" end case; when "01"=> case kbcol is when "0001"=>seg7<="1110000"dat<="001

31、11"-7when "0010"=>seg7<="1011111"dat<="00110"-6when "0100"=>seg7<="1011011"dat<="00101"-5when "1000"=>seg7<="0110011"dat<="00100"-4when others=>seg7<="0000000"dat

32、<="11111" end case; when "10"=> case kbcol is when "0001"=>seg7<="0011111"dat<="01011"-bwhen "0010"=>seg7<="1110111"dat<="01010"-awhen "0100"=>seg7<="1111011"dat<=&quo

33、t;01001"-9when "1000"=>seg7<="1111111"dat<="01000"-8when others=>seg7<="0000000"dat<="11111" end case; when "11"=> case kbcol is when "0001"=>seg7<="1000111"dat<="01111"-fwhen

34、 "0010"=>seg7<="1001111"dat<="01110"-ewhen "0100"=>seg7<="0111101"dat<="01101"-dwhen "1000"=>seg7<="1001110"dat<="01100"-cwhen others=>seg7<="0000000"dat<="111

35、11" end case; when others=>seg7<="0000000" end case; end if; end process;fn<=not(dat(0)and dat(1)and dat(2)and dat(3)and dat(4);-產(chǎn)生按鍵標(biāo)志位,用于存儲(chǔ)按鍵信息 process(fn) begin if fn'event and fn='1' then-按鍵信息存儲(chǔ) seg7_out<=seg7; end if; end process;end one;矩陣鍵盤模塊仿真圖: 圖4.2 矩陣

36、鍵盤仿真圖4.2 LCD1602液晶顯示模塊設(shè)計(jì)本文所設(shè)計(jì)的LCD1602液晶顯示模塊設(shè)計(jì)的電路符號(hào)如圖4.3所示。其中,clk為時(shí)鐘信號(hào)輸入端(頻率可為1 024Hz);reset為復(fù)位控制端;addr為地址信號(hào)輸入端;det為數(shù)據(jù)信號(hào)輸入端;LCD_RS為寄存器選著信號(hào);LCD_RW為讀寫控制信號(hào);LCD_EN為液晶時(shí)鐘控制信號(hào);LCD_Data為L(zhǎng)CD1602顯示信號(hào)輸出端。 圖4.3 LCD1602液晶顯示模塊LCD1602液晶顯示模塊程序:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use

37、 IEEE.STD_LOGIC_UNSIGNED.ALL;entity keyboardlcd is Port ( CLK : in std_logic; -狀態(tài)機(jī)時(shí)鐘信號(hào),同時(shí)也是液晶時(shí)鐘信號(hào),其周期應(yīng)該滿足液晶數(shù)據(jù)的建立時(shí)間 Reset : in std_logic; addr: in std_logic_vector(4 downto 0); det: in std_logic_vector(3 downto 0); LCD_RS : out std_logic; -寄存器選擇信號(hào) LCD_RW : out std_logic; -液晶讀寫信號(hào) LCD_EN : out std_logi

38、c; -液晶時(shí)鐘信號(hào) LCD_Data : out std_logic_vector(7 downto 0); -液晶數(shù)據(jù)信號(hào)end keyboardlcd;architecture Behavioral of keyboardlcd istype state is (set_dlnf,set_cursor,set_dcb,set_cgram,write_cgram,set_ddram,write_LCD_Data);signal Current_State:state;type ram1 is array(0 to 15) of std_logic_vector(7 downto 0);co

39、nstant cgram1 : ram1 :=(X"30",X"31",X"32",x"33",x"34",x"35",x"36",x"37",x"38",x"39",x"41",x"42",x"43",x"44",x"45",x"46"); signal CLK1 : std_

40、logic;signal LCD_Clk : std_logic; beginLCD_RW <= '0' ; -RW='0'寫入設(shè)置LCD_EN <= Clk ; -用1024Hz作為L(zhǎng)CD的使能,也作為L(zhǎng)CD的時(shí)鐘LCD_Clk <= Clk; -用1024Hz作為L(zhǎng)CD的時(shí)鐘process(LCD_Clk,Reset) -狀態(tài)機(jī)控制顯示 begin if Reset='1'then Current_State<=set_dlnf; - Reset就清屏,Reset接出用一個(gè)按鈕作為復(fù)位按鍵即可,按下就為'0&#

41、39;復(fù)位。 LCD_RS<='0' elsif rising_edge(LCD_Clk) then Current_State <= Current_State ; LCD_RS <= '0' case Current_State is when set_dlnf=> LCD_Data<="00000001" - /*清除顯示*/ 清屏指令 Current_State<=set_cursor; when set_cursor=> LCD_Data<="00111000" -

42、/*設(shè)置8位格式,2行,5*7*/ Current_State<=set_dcb; when set_dcb=> LCD_Data<="00001100" -/*整體顯示,關(guān)光標(biāo),不閃爍*/ Current_State<=set_cgram; when set_cgram=> LCD_Data<="00000110" Current_State<=write_cgram; when write_cgram=> LCD_RS<='1' LCD_Data<=cgram1(conv_i

43、nteger(det); Current_State<=set_ddram; when set_ddram=> if addr<="01111" then LCD_Data<="10000000"+addr;-80H -顯示數(shù)據(jù), else LCD_Data<="11000000"+addr-"10000"-C0H end if; Current_State<=write_LCD_Data; when write_LCD_Data=> LCD_Data<="

44、00000000" Current_State<=write_cgram; when others => null; end case; end if;end process;end Behavioral;LCD1602液晶顯示模塊仿真圖圖4.4 液晶顯示模塊仿真圖5 系統(tǒng)設(shè)計(jì)方案二5.1撥碼開關(guān)控制的LCD1602顯示模塊由撥碼開關(guān)取代矩陣鍵盤控制LCD1602的顯示,元器件的封裝(如圖5),其中,clk為時(shí)鐘信號(hào)輸入端(頻率可為1024Hz);reset為復(fù)位控制端;addr為地址信號(hào)輸入端;det為數(shù)據(jù)信號(hào)輸入端;LCD_RS為寄存器選著信號(hào);LCD_RW為讀寫控制

45、信號(hào);LCD_EN為液晶時(shí)鐘控制信號(hào);LCD_Data為L(zhǎng)CD1602顯示信號(hào)輸出端。 圖5.1 元器件封裝5.2撥碼開關(guān)控制的LCD1602顯示模塊程序library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity LCD is Port ( CLK : in std_logic; -狀態(tài)機(jī)時(shí)鐘信號(hào),同時(shí)也是液晶時(shí)鐘信號(hào),其周期應(yīng)該滿足液晶數(shù)據(jù)的建立時(shí)間 Reset : in std_logic; fn : in std_logic; ad

46、dr: in std_logic_vector(4 downto 0); det: in std_logic_vector(3 downto 0); LCD_RS : out std_logic; -寄存器選擇信號(hào) LCD_RW : out std_logic; -液晶讀寫信號(hào) LCD_EN : out std_logic; -液晶時(shí)鐘信號(hào) LCD_Data : out std_logic_vector(7 downto 0); -液晶數(shù)據(jù)信號(hào)end LCD;architecture Behavioral of LCD istype state is (set_dlnf,set_cursor,

47、set_dcb,set_cgram,write_cgram,set_ddram,write_LCD_Data);signal Current_State:state;type ram1 is array(0 to 31) of std_logic_vector(7 downto 0);type ram2 is array(0 to 31) of std_logic_vector(7 downto 0);type ram3 is array(0 to 15) of std_logic_vector(7 downto 0);constant cgram1 : ram1 :=(X"20&q

48、uot;,X"20",X"20",x"4c",x"69",x"75",x"20",x"6a",x"69",x"61",x"20",x"71",x"69",x"20",x"20",x"20",x"20",x"20",x"20",x"

49、34",x"31",x"31",x"30",x"32",x"31",x"38",x"32",x"33",x"37",x"20",x"20",x"20"); -分行顯示Liu jia qi 和4110218237constant cgram2 : ram2 :=(X"20",X"20",X"20&qu

50、ot;,x"4c",x"69",x"75",x"20",x"6c",x"69",x"61",x"6e",x"67",x"20",x"20",x"20",x"20",x"20",x"20",x"20",x"34",x"31",x"3

51、1",x"30",x"32",x"31",x"38",x"32",x"31",x"34",x"20",x"20",x"20"); -顯示Liu liang and 4110218214constant cgram3 : ram3 :=(X"30",X"31",X"32",x"33",x"34&quo

52、t;,x"35",x"36",x"37",x"38",x"39",x"41",x"42",x"43",x"44",x"45",x"46"); signal CLK1 : std_logic;signal LCD_Clk : std_logic;signal m :std_logic_vector(1 downto 0);beginLCD_RW <= '0'

53、 ; -RW='0'寫入設(shè)置LCD_EN <= Clk ; -用1024Hz作為L(zhǎng)CD的使能,也作為L(zhǎng)CD的時(shí)鐘LCD_Clk <= Clk; -用1024Hz作為L(zhǎng)CD的時(shí)鐘process(Clk) -再分頻,1024/1000=1.024Hz,1s的周期輸出,CLK1輸出周期1.024Hzvariable n2:integer range 0 to 499; begin if rising_edge(Clk) then if n2<499 then n2:=n2+1; else n2:=0; Clk1<=not Clk1; end if; end i

54、f;end process;process(fn) variable n3:integer range 0 to 3; begin if rising_edge(fn) then n3:=n3+1; if n3=0 then m<="00" elsif n3=1 then m<="01" else m<="10" end if; end if;end process;process(LCD_Clk,Reset) -狀態(tài)機(jī)控制顯示variable cnt1: std_logic_vector(4 downto 0);

55、begin if Reset='1'then Current_State<=set_dlnf; - Reset就清屏,Reset接出用一個(gè)按鈕作為復(fù)位按鍵即可,按下就為'0'復(fù)位。 cnt1:="11110" LCD_RS<='0' elsif rising_edge(LCD_Clk) then Current_State <= Current_State ; LCD_RS <= '0' case Current_State is when set_dlnf=> LCD_Data<="00000001" - /*清除顯示*/ 清屏指令 Current_State<=set_cursor; when set_cursor=> LCD_Data<="00111000" -/*設(shè)置8位格式,2行,5*7*/ Current_State<=set_dcb; when set_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論