1、CDIO設(shè)計(jì)目的 u 通過虛擬串口實(shí)現(xiàn)下位機(jī)與上位機(jī)之間的相互通信。 u 通過設(shè)計(jì)將串口通信的各種方式進(jìn)行進(jìn)一步的了解。 u 將接收的數(shù)字與發(fā)送的數(shù)字在LCD上進(jìn)行顯示,從而熟悉液晶顯示屏LCD1602的具體操作。 u 熟練掌握C語言在單片機(jī)上的編程應(yīng)用。 u 將各學(xué)科之間的的知識(shí)進(jìn)行綜合運(yùn)用,并能夠?qū)崿F(xiàn)所需的功能設(shè)計(jì)。 2、CDIO設(shè)計(jì)正文 2.1串口通信原理 串行通信是CPU與外界交換信息的一種基本通信方式。通信時(shí)僅需一到兩根傳輸線,且每次只能傳送一位,適用于長(zhǎng)距離傳輸,但速度較慢。MCS—51串行口是一個(gè)可編程的全雙工串行通信接口,其對(duì)應(yīng)的引腳為P3.0(10腳)和P3.1(11腳),分別為RXD和TXD,通過軟件編程它可以作通用異步收發(fā)器用,也可以做同步移位寄存器使用,其幀格式有8位、10位和11位3種,并能設(shè)置各種波特率。MCS—51串行口有兩個(gè)獨(dú)立的緩沖器,即發(fā)送緩沖器和接收緩沖器,且共用一個(gè)地址99H(SBUF)。同時(shí),MSC—51串行口可以用軟件設(shè)置成4種不同的工作方式。 2.1.1串行口的工作原理 通過對(duì)特殊功能寄存器—串行口控制寄存器中SM0、SM1兩位的操作,MCS—51單片機(jī)串口通信工作方式有4種,與串行口有關(guān)的特殊功能寄存器有串行口控制寄存器SCON、電源控制寄存器PCON和定時(shí)器T1,主要確定了串口通信的工作方式和波特率的計(jì)算方法。 (1)串行口數(shù)據(jù)緩沖器SBUF SBUF是兩個(gè)在物理上相互獨(dú)立的接收,發(fā)送緩沖器,可同時(shí)發(fā)送,接收數(shù)據(jù),兩個(gè)緩沖器共用一個(gè)字節(jié)地址,為99H,可字節(jié)尋址,不可位尋址,復(fù)位值為00H。可通過編程對(duì)SBUF的讀寫來區(qū)別是對(duì)接收緩沖器的操作還是對(duì)發(fā)送緩沖器的操作。CPU寫SBUF,就是修改發(fā)送緩沖器;CPU讀SBUF,就是讀接收緩沖器,在硬件結(jié)構(gòu)上,串行口對(duì)外有兩條獨(dú)立的收發(fā)信號(hào)線RXD和TXD,因此可以同時(shí)發(fā)送,接收數(shù)據(jù),實(shí)現(xiàn)全雙工傳送。 (2)串行口控制寄存器SCON SCON寄存器用于確定串行通信的工作方式、接收和發(fā)送控制、串行口的中斷狀態(tài)標(biāo)志,它既可以是字節(jié)尋址,也可以是位尋址,字地址為98H,其復(fù)位值為00H。 SM0,SM1—工作方式控制位,可構(gòu)成4種通信工作方式,分別為:方式0-同步移位寄存器;方式1-10位異步收發(fā);方式2-11位異步收發(fā);方式3-11位異步收發(fā)。 SM2—多機(jī)通信控制位,用于主一從式多機(jī)通信控制,因多機(jī)通信是在方式2和方式3下進(jìn)行,因此SM2位主要用于方式2和方式3。若SM2=1,則允許多機(jī)通信。若SM2=0,則不屬于多機(jī)通信情況,接收到一幀數(shù)據(jù)后,無論第9位(D8)是0還是1,都置中斷標(biāo)志RI=1,接收到的數(shù)據(jù)裝入接收/發(fā)送緩沖器(SBUF)中。 在工作方式1時(shí),若SM2=1,則只有接收到有效停止位時(shí)中斷標(biāo)志RI才置1,以便接收下一幀數(shù)據(jù);在工作方式0時(shí),SM2必須為0。 REN—允許接收控制位,用軟件置1或清零,REN=1,允許接收;REN=0,禁止接收。 TB8—發(fā)送數(shù)據(jù)位8,在方式2和方式3時(shí),TB8是要發(fā)送的第9位數(shù)據(jù)。在多機(jī)通信中,以TB8位的狀態(tài)表示主機(jī)發(fā)送的是地址還是數(shù)據(jù):TB8=0為數(shù)據(jù),TB8=1為地址,該位由軟件置位或清零,此外,該位還可以作為數(shù)據(jù)的奇偶檢驗(yàn)位。 RB8—接收數(shù)據(jù)位8,在工作方式2和工作方式3種,它是接收到的第9位數(shù)據(jù)位,既可以作為約定好的奇偶檢驗(yàn)位,也可以作為多機(jī)通信時(shí)的地址幀或數(shù)據(jù)幀標(biāo)志。在工作方式1中若SM2=0,則RB8是接收到的停止位,在工作方式0種不使用RB8。 TI—發(fā)送中斷標(biāo)志位,在工作方式0中,發(fā)送完8位數(shù)據(jù)后,由硬件置1,向CPU申請(qǐng)接收中斷,CPU響應(yīng)中斷后,必須用軟件清零;在其他方式下,在發(fā)送停止位前,由硬件置位。 RI—接收中斷標(biāo)志位。在工作方式0種,接收完8位數(shù)據(jù)后,由硬件置1,向CPU申請(qǐng)發(fā)送中斷,CPU響應(yīng)中斷后,必須用軟件清零;在其他方式下,在接收到停止位的中間時(shí)刻由硬件置1,中斷響應(yīng)后也必須用軟件清零。 串行發(fā)送中斷標(biāo)志位TI和接受中斷標(biāo)志位RI是同一個(gè)中斷源,在全雙工通信中,必須用軟件來判別是發(fā)送中斷請(qǐng)求還是接收中斷請(qǐng)求。 (3)電源控制寄存器PCON PCON主要是為CHMOS型單片機(jī)上實(shí)現(xiàn)電源控制而設(shè)置的專用寄存器,單元地址為87H其中只有一位SMOD與串行口工作有關(guān)。SMOD稱為波特率選擇位。在工作方式1,2,3中若SMOD=1,則波特率提高一倍;若SMOD=0,則波特率不加倍。 除了以上3種特殊功能寄存器以外,串口的工作還與定時(shí)器T1和中斷允許寄存器IE有關(guān),定時(shí)器T1主要在工作方式1,工作方式2中用于計(jì)算波特率,而IE主要用于接收/發(fā)送中斷的允許控制,ES=0,禁止串行中斷,ES=1,允許串行中斷。 2.1.2串行通信的波特率 在使用串口做通訊時(shí),一個(gè)很重要的參數(shù)就是波特率,只有上下位機(jī)的波特率一樣時(shí)才可以進(jìn)行正常通訊。波特率是指串行端口每秒內(nèi)可以傳輸?shù)牟ㄌ匚粩?shù)。51芯片的串口工作模式0的波特率是固定的,為fosc/12,以一個(gè)12M的晶振來計(jì)算,那么它的波特率可以達(dá)到1M。模式2的波特率是固定在fosc/64或fosc/32,具體用那一種就取決于PCON寄存器中的SMOD位,如SMOD為0,波特率為focs/64,SMOD為1,波特率為focs/32。模式1和模式3的波特率是可變的,取決于定時(shí)器1或2(52芯片)的溢出速率。計(jì)算這兩個(gè)模式的波特率可以用以下的公式去計(jì)算。 波特率=(2SMOD÷32)×定時(shí)器1溢出速率 (1) 上式中如設(shè)置了PCON寄存器中的SMOD位為1時(shí)就可以把波特率提升2倍。通常會(huì)使用定時(shí)器1工作在定時(shí)器工作模式2下,這時(shí)定時(shí)值中的TL1做為計(jì)數(shù),TH1做為自動(dòng)重裝值,這個(gè)定時(shí)模式下,定時(shí)器溢出后,TH1的值會(huì)自動(dòng)裝載到TL1,再次開始計(jì)數(shù),這樣可以不用軟件去干預(yù),使得定時(shí)更準(zhǔn)確。在這個(gè)定時(shí)模式2下定時(shí)器1溢出速率的計(jì)算公式如下: 溢出速率=(計(jì)數(shù)速率)/(256-TH1) (2) 上式中的“計(jì)數(shù)速率”與所使用的晶體振蕩器頻率有關(guān),在51芯片中定時(shí)器啟動(dòng)后會(huì)在每一個(gè)機(jī)器周期使定時(shí)寄存器TH的值增加一,一個(gè)機(jī)器周期等于十二個(gè)振蕩周期,所以可以得知51芯片的計(jì)數(shù)速率為晶體振蕩器頻率的1/12,一個(gè)12M的晶振用在51芯片上,那么51的計(jì)數(shù)速率就為1M。通常用11.0592M晶體是為了得到標(biāo)準(zhǔn)的無誤差的波特率。如我們要得到9600的波特率,晶振為11.0592M和12M,定時(shí)器1為模式2,SMOD設(shè)為1,分別看看那所要求的TH1為何值。代入公式: 11.0592M 9600=(2÷32)×((11.0592M/12)/(256-TH1)) TH1=250 12M 9600=(2÷32)×((12M/12)/(256-TH1)) TH1≈249.49 上面的計(jì)算可以看出使用12M晶體的時(shí)候計(jì)算出來的TH1不為整數(shù),而TH1的值只能取整數(shù),這樣它就會(huì)有一定的誤差存在不能產(chǎn)生精確的9600波特率。 本次設(shè)計(jì)中為了得到精確地波特率,采用的晶振頻率為11.0592MHz,此外定時(shí)器工作在方式2,即八位自動(dòng)重裝載,串口工作在方式1. 2.2接收與發(fā)送數(shù)據(jù)顯示 file:///C:/Users/Oraina/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg下位機(jī)發(fā)送的數(shù)據(jù)與上位機(jī)接受的數(shù)據(jù)都是通過LCD1602來進(jìn)行顯示的,其引腳圖如圖1所示。 圖1 LCD1602引腳圖 下位機(jī)發(fā)送的數(shù)據(jù)與上位機(jī)接受的數(shù)據(jù)都是通過LCD1602來進(jìn)行顯示的。1602LCD采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如表1所示: 表1:引腳接口說明表 編號(hào) | 符號(hào) | 引腳說明 | 編號(hào) | 符號(hào) | 引腳說明 | 1 | VSS | 電源地 | 9 | D2 | 數(shù)據(jù) | 2 | VDD | 電源正極 | 10 | D3 | 數(shù)據(jù) | 3 | VL | 液晶顯示偏壓 | 11 | D4 | 數(shù)據(jù) | 4 | RS | 數(shù)據(jù)/命令選擇 | 12 | D5 | 數(shù)據(jù) | 5 | R/W | 讀/寫選擇 | 13 | D6 | 數(shù)據(jù) | 6 | E | 使能信號(hào) | 14 | D7 | 數(shù)據(jù) | 7 | D0 | 數(shù)據(jù) | 15 | BLA | 背光源正極 | 8 | D1 | 數(shù)據(jù) | 16 | BLK | 背光源負(fù)極 |
第1腳:VSS為地電源。 第2腳:VDD接5V正電源。 第3腳:VL為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比度最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度。 第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。 第5腳:R/W為讀寫信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時(shí)可以讀忙信號(hào),當(dāng)RS為高電平R/W為低電平時(shí)可以寫入數(shù)據(jù)。 第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。 第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。 第15腳:背光源正極。 第16腳:背光源負(fù)極。 2.2.1 1602LCD的指令說明及時(shí)序 1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表2所示: 表2:控制命令表 序號(hào) | 指令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 1 | 清顯示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 2 | 光標(biāo)返回 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | * | 3 | 置輸入模式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S | 4 | 顯示開/關(guān)控制 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B | 5 | 光標(biāo)或字符移位 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | * | * | 6 | 置功能 | 0 | 0 | 0 | 0 | 1 | DL | N | F | * | * | 7 | 置字符發(fā)生存貯器地址 | 0 | 0 | 0 | 1 | 字符發(fā)生存貯器地址 | 8 | 置數(shù)據(jù)存貯器地址 | 0 | 0 | 1 | 顯示數(shù)據(jù)存貯器地址 | 9 | 讀忙標(biāo)志或地址 | 0 | 1 | BF | 計(jì)數(shù)器地址 | 10 | 寫數(shù)到CGRAM或DDRAM) | 1 | 0 | 要寫的數(shù)據(jù)內(nèi)容 | 11 | 從CGRAM或DDRAM讀數(shù) | 1 | 1 | 讀出的數(shù)據(jù)內(nèi)容 |
1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實(shí)現(xiàn)的。(說明:1為高電平、0為低電平) 指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置。 指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。 指令3:光標(biāo)和顯示模式設(shè)置 I/D:光標(biāo)移動(dòng)方向,高電平右移,低電平左移 S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。 指令4:顯示開關(guān)控制。 D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示 C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo) B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。 指令5:光標(biāo)或顯示移位 S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)。 指令6:功能設(shè)置命令 DL:高電平時(shí)為4位總線,低電平時(shí)為8位總線 N:低電平時(shí)為單行顯示,高電平時(shí)雙行顯示 F: 低電平時(shí)顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字符。 指令7:字符發(fā)生器RAM地址設(shè)置。 指令8:DDRAM地址設(shè)置。 指令9:讀忙信號(hào)和光標(biāo)地址 BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。 指令10:寫數(shù)據(jù)。 指令11:讀數(shù)據(jù)。 表3:基本操作時(shí)序表 讀狀態(tài) | 輸入 | RS=L,R/W=H,E=H | 輸出 | D0—D7=狀態(tài)字 | 寫指令 | 輸入 | RS=L,R/W=L,D0—D7=指令碼,E=高脈沖 | 輸出 | 無 | 讀數(shù)據(jù) | 輸入 | RS=H,R/W=H,E=H | 輸出 | D0—D7=數(shù)據(jù) | 寫數(shù)據(jù) | 輸入 | RS=H,R/W=L,D0—D7=數(shù)據(jù),E=高脈沖 | 輸出 | 無 |
| | file:///C:/Users/Oraina/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg |
對(duì)LCD進(jìn)行些操作時(shí)的時(shí)序圖如圖2所示
圖2 寫操作時(shí)序 2.2.2 1602LCD的RAM地址映射 液晶顯示模塊是一個(gè)慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時(shí)要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖3是1602的內(nèi)部顯示地址。 例如第二行第一個(gè)字符的地址是40H,那么是否直接寫入40H就可以將光標(biāo)定位在第二行第一個(gè)字符的位置呢?這樣不行,因?yàn)閷懭腼@示地址時(shí)要求最高位D7恒定為高電平1所以實(shí)際寫入的數(shù)據(jù)應(yīng)該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。在對(duì)液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時(shí)光標(biāo)是自動(dòng)右移的,無需人工干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。
| | file:///C:/Users/Oraina/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg |
圖3 1602LCD內(nèi)部顯示地址
例如第二行第一個(gè)字符的地址是40H,那么是否直接寫入40H就可以將光標(biāo)定位在第二行第一個(gè)字符的位置呢?這樣不行,因?yàn)閷懭腼@示地址時(shí)要求最高位D7恒定為高電平1所以實(shí)際寫入的數(shù)據(jù)應(yīng)該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。 在對(duì)液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時(shí)光標(biāo)是自動(dòng)右移的,無需人工干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。 2.2.3 1602LCD的一般初始化過程 延時(shí)15mS 寫指令38H(不檢測(cè)忙信號(hào)) 延時(shí)5mS 寫指令38H(不檢測(cè)忙信號(hào)) 延時(shí)5mS 寫指令38H(不檢測(cè)忙信號(hào)) 以后每次寫指令、讀/寫數(shù)據(jù)操作均需要檢測(cè)忙信號(hào) 寫指令38H:顯示模式設(shè)置 寫指令08H:顯示關(guān)閉 寫指令01H:顯示清屏 寫指令06H:顯示光標(biāo)移動(dòng)設(shè)置 寫指令0CH:顯示開及光標(biāo)設(shè)置 2.3軟件設(shè)計(jì) 本次設(shè)計(jì)過程中當(dāng)接收到數(shù)據(jù)后CPU響應(yīng)中斷,對(duì)接接收到得數(shù)據(jù)進(jìn)行顯示后退出中斷,主函數(shù)以及中斷函數(shù)的流程圖如圖4與圖5所示。 file:///C:/Users/Oraina/AppData/Local/Temp/msohtmlclip1/01/clip_image007.giffile:///C:/Users/Oraina/AppData/Local/Temp/msohtmlclip1/01/clip_image008.gif 圖4 主函數(shù)流程圖 圖5中斷流程圖 file:///C:/Users/Oraina/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
2.4硬件仿真及調(diào)試 圖6硬件設(shè)計(jì)總體仿真電路圖 由于本次設(shè)計(jì)只是仿真,并沒有進(jìn)行硬件電路的搭建,因此仿真時(shí)采用的是虛擬串口,通過軟件增加了一對(duì)虛擬串口COM1,COM4,其設(shè)置界面如圖7所示。 file:///C:/Users/Oraina/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
圖7 虛擬串口調(diào)試設(shè)置界面 當(dāng)仿真開始后下位機(jī)發(fā)送的數(shù)進(jìn)過虛擬串口發(fā)送上位機(jī)通過串口調(diào)試助手進(jìn)行數(shù)據(jù)的發(fā)送與接收,其,仿真時(shí)下位機(jī)與上位機(jī)的波特率均設(shè)置為9600,串口調(diào)試助手工作時(shí)界面如圖8所示。 file:///C:/Users/Oraina/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg 圖8 串口調(diào)試助手仿真界面 3、CDIO設(shè)計(jì)總結(jié) 本次設(shè)計(jì)住實(shí)現(xiàn)了上位機(jī)與下位機(jī)之間簡(jiǎn)單的通信,上位機(jī)通過串口調(diào)試助手發(fā)送一個(gè)十六進(jìn)制的數(shù)經(jīng)過虛擬串口,可以被下位機(jī)接收,并在LCD進(jìn)行顯示。在老師講述單片機(jī)課程的時(shí)候,對(duì)單片機(jī)的串口通信知識(shí)進(jìn)行了原理上的簡(jiǎn)單了解,對(duì)實(shí)際應(yīng)用過程中應(yīng)考慮的一些問題并沒有過多的了解,通過本次設(shè)計(jì),對(duì)單片機(jī)串口通信這部分的內(nèi)容進(jìn)行了更深層次的學(xué)習(xí),知道了很多可是跟你學(xué)不到的東西。另外本次設(shè)計(jì)中,對(duì)收發(fā)的數(shù)據(jù)進(jìn)行顯示時(shí)用到了LCD液晶1602,剛開始學(xué)習(xí)是覺得液晶顯示很神奇,再設(shè)計(jì)過程中,通過自己看教學(xué)視頻進(jìn)行學(xué)習(xí),對(duì)液晶的原理,以及操作命令等有了比較詳細(xì)的了解。一開始進(jìn)行操作時(shí)由于對(duì)液晶顯示的時(shí)序不是很清楚,知識(shí)把液晶顯示的代碼簡(jiǎn)單的堆在了一起,結(jié)果運(yùn)行時(shí),液晶不能顯示。后來,自己仔細(xì)對(duì)1602的時(shí)序圖進(jìn)行學(xué)習(xí)后,才發(fā)現(xiàn)液晶初始化時(shí),每條命令都是有先后順序的。 總之,通過本次設(shè)計(jì)鍛煉了我查找錯(cuò)誤時(shí)的耐力,也是我對(duì)與C語言在單片機(jī)上的編程變得更加熟練,為以后進(jìn)一步學(xué)習(xí)打下了堅(jiān)實(shí)的基礎(chǔ)。 4、參考文獻(xiàn) [1]康華光主編,電子技術(shù)基礎(chǔ)(數(shù)字部分)[M]北京:高等教育出版社,2000.6 [2]謝自美主編,電子線路設(shè)計(jì)/實(shí)驗(yàn)/測(cè)試[M]武漢:華中科技大學(xué)出版社,2000.7 [3]胡漢才.單片機(jī)原理與其接口技術(shù)(第二版)[M].北京:清華大學(xué)出版社,2004. [4]彭偉,單片機(jī)C語言程序設(shè)計(jì)實(shí)例100例.電子工業(yè)出版社.2009,06 CDIO設(shè)計(jì) 評(píng) 語 | | | | | |
代碼: #include<reg51.h> #define ucharunsigned char #define uintunsigned int uchartable[10]="send data:"; uchartable1[13]="receive data:"; sbit lcden=P2^2; sbit lcdrs=P2^0; sbit lcdrw=P2^1; uchar num,flag; uchar c; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } // 寫命令子函數(shù) voidwrite_cmd(uchar cmd) { lcdrs=0; lcden=0; P0=cmd; lcdrw=0; delay(5); lcden=1; delay(5); lcden=0; delay(5); } //寫數(shù)據(jù)子函數(shù) void write_data(uchar dataa) { lcdrs=1; P0=dataa; //lcdrw=0; delay(5); lcden=1; delay(5); lcden=0; } //液晶初始化 void init() { lcden=0; write_cmd(0x38);// 設(shè)置16*2顯示,5*7的點(diǎn)陣,8位數(shù)據(jù)口 write_cmd(0x0c);//開顯示,不顯示光標(biāo) write_cmd(0x06); write_cmd(0x01);//清屏 write_cmd(0x80);//初始化數(shù)據(jù)指針 for(num=0;num<10;num++) { write_data(table[num]); delay(5); } write_cmd(0x80+0x40); for(num=0;num<14;num++) { write_data(table1[num]); delay(5); } } void change() { uchar m,n; m=c/16; if(m<10) {m=m+0x30;} else {m=m+0x37;} n=c%16; if(n<10) {n=n+0x30;} else {n=n+55;} write_cmd(0x80+0x0a); delay(5); write_data(m); delay(20); write_cmd(0x80+0x0b); delay(5); write_data(n); delay(20); } void change1(uchars) { uchar p,q; q=s/16; if(q<10) {q=q+0x30;} else {q=q+0x37;} write_cmd(0x80+0x40+0x0d); delay(5); write_data(q); delay(20); p=s%16; if(p<10) {p=p+0x30;} else {p=p+0x37;} write_cmd(0x80+0x40+0x0e); delay(5); write_data(p); delay(20); } /********串行口初始化程序**********/ void init1() { SM0=0; SM1=1;//設(shè)置為串行口工作方式1 REN=1;// 允許串行口接收 TI=0; RI=0; PCON=0; TH1=0xFD; TL1=0XFD; TMOD=0X20;//用作定時(shí)器,工作在方式2 EA=1; ET1=0; ES=1; TR1=1; } //主函數(shù) void main() { init(); init1(); while(1) { change(); TI=0; SBUF=c; while(!TI); TI=0; delay(200); c++; } } void intrr()interrupt 4 { uchar temp; temp=SBUF; change1(temp); RI=0; }
|