定時液晶顯示_第1頁
定時液晶顯示_第2頁
定時液晶顯示_第3頁
定時液晶顯示_第4頁
定時液晶顯示_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1定時液晶顯示實驗定時液晶顯示實驗n實驗?zāi)康膶嶒災(zāi)康膎實驗器材實驗器材n硬件接線硬件接線n軟件功能軟件功能n程序清單程序清單n備注說明備注說明2實驗?zāi)康模簩嶒災(zāi)康模篖CD與定時中斷的聯(lián)合編程,與定時中斷的聯(lián)合編程,顯示時鐘顯示時鐘3實驗器材:實驗器材:1.SD-1型在線編程實驗儀型在線編程實驗儀2.導(dǎo)線若干導(dǎo)線若干4硬件接線:硬件接線: 使用實驗板使用實驗板LCD固定接線固定接線 (1.單片機的單片機的PTB0-PTB7作為輸出與作為輸出與LCD的的D0-D7連接連接; 2.單片機的單片機的PTC0,PTC1,PTC2分別接分別接LCD的的RS R/W E; 3.單片機的單片機的PTA7-4接

2、接4根鍵盤列線(根鍵盤列線(X4-1),), PTA3-0接接4根鍵盤行線(根鍵盤行線(Y4-1))5軟件功能:軟件功能:n開始時開始時,LCD顯示兩行顯示兩行“Current Time is: 00:00:00 SUDA ” “*”鍵為設(shè)置鍵鍵為設(shè)置鍵,按下后可設(shè)置時按下后可設(shè)置時,分分,秒秒, 隨后隨后 按按“#”時鐘開始運行時鐘開始運行 。6程序清單:程序清單:n口地址定義口地址定義n定時器的寄存器地址定時器的寄存器地址定義定義n變量定義變量定義n系統(tǒng)初始化系統(tǒng)初始化n總循環(huán)總循環(huán)n掃描讀鍵值子程序掃描讀鍵值子程序n鍵盤中斷子程序鍵盤中斷子程序n定時器溢出子程序定時器溢出子程序鍵盤中斷初

3、始化子程鍵盤中斷初始化子程序序鍵盤轉(zhuǎn)化為具體值子鍵盤轉(zhuǎn)化為具體值子程序程序LCD初始化子程序初始化子程序LCD命令執(zhí)行子程序命令執(zhí)行子程序LCD顯示子程序顯示子程序轉(zhuǎn)碼子程序轉(zhuǎn)碼子程序中斷矢量中斷矢量7備注說明:備注說明:n運行時請與標準時間進行校對運行時請與標準時間進行校對8口地址定義口地址定義n*單片機的PTA7-4接4根鍵盤列線(X4-1),PTA3-0接4根鍵盤行線(Y4-1)nDDRA EQU $0004 ;A口數(shù)據(jù)方向寄存器nPTA EQU $0000 ;A口數(shù)據(jù)寄存器nPTAPUE EQU $000D ;A口上拉電阻允許寄存器n*單片機的PTB0-PTB7作為輸出與LCD的D0-

4、D7連接nDDRB equ $0005 ;B口數(shù)據(jù)方向寄存器 nPTB equ $0001 ;B口數(shù)據(jù)寄存器n*單片機的PTC0,PTC1,PTC2分別接LCD的RS R/W EnPTC EQU $0002 ;C口數(shù)據(jù)寄存器nDDRC EQU $0006 ;C口數(shù)據(jù)方向寄存器nLCD-RS EQU 0 ;LCD寄存器選擇信號接PTC0nLCD-RW EQU 1 ;讀寫信號接PTC1nLCD_E EQU 2 ;LCD使能信號接PTC2nINTKBSCR EQU $001A ;鍵盤狀態(tài)和控制寄存器nINTKBIER EQU $001B ;鍵盤中斷允許寄存器9定時器的寄存器地址定義nT1SC EQU

5、 $0020 ;定時器1狀態(tài)和控制寄存器nT1CNTHEQU $0021 ;定時器1計數(shù)寄存器(高位)nT1CNTLEQU $0022 ;定時器1計數(shù)寄存器(低位)nT1MODHEQU $0023 ;定時器1模數(shù)寄存器(高位)nT1MODLEQU $0024 ;定時器1模數(shù)寄存器(低位)10變量定義nRAMstartAddr equ $0040 ;RAM的起始地址(因芯片不同可以更改)nFlashStartAddr equ $8000 ;程序開始地址(因芯片不同可以更改)nORG RAMstartAddrnLCD_Buffer1 RMB 16 ;存放16字節(jié)顯示緩沖數(shù)據(jù)(第一行)nLCD_Bu

6、ffer2 RMB 16 ;存放16字節(jié)顯示緩沖數(shù)據(jù)(第二行)nSec RMB 1 ;時鐘的秒 nMin RMB 1 ;時鐘的分nHou RMB 1 ;時鐘的小時nBeginRun RMB 1 ; nSetByte RMB 1 ;nKBValue RMB 1 ;執(zhí)行鍵盤中斷程序后,存放鍵值的內(nèi)存KbValuenTmpvar1 RMB 1 ;變量Tmpvar1,緩沖使用nTmpvar2 RMB 1 ;變量Tmpvar2,緩沖使用nTmpvar3 RMB 1 ;變量Tmpvar3nTmpvar4 RMB 1 ;變量Tmpvar411初始化n系統(tǒng)初始化nPLL初始化n口初始化n定時器1初始化n設(shè)定初

7、始時間n鍵盤中斷初始化12系統(tǒng)初始化NOP ;初始化開始 SEI ;禁止所有中斷 LDHX #$023F ;堆棧初始化,放入GP32的RAM最高端 TXS MOV #%00000001,$001E ;初始化CONFIG2,內(nèi)部總線時鐘用作SCI的時鐘 MOV #%00111101,$001F ;初始化CONFIG1,允許LVI復(fù)位信號, ;禁止LIV模塊的電源,LIV工作在5V, ;經(jīng)過32個周期退出STOP模式,禁止COP模塊13PLL初始化 ;外接晶陣32.768KHz,初始化成總線頻率為2.4576MHz CLR $0036 ;清零,初始化PCTL, MOV #$01,$0036 MOV

8、 #$01,$0038 MOV #$2C,$0039 MOV #$80,$003A BSET 5,$0036 BSET 7,$0037 ;自動方式 BSET 4,$0036 ;選擇PLL為系統(tǒng)時鐘源14口初始化 LDA #%11110000 STA PTAPUE LDA #%11111111 ;B口為輸出 STA DDRB LDA #%00000111 ;C口的PTC0-2為輸出 STA DDRC15定時器1初始化 LDA #%01100110 ;允許溢出中斷、不啟動計數(shù)、分頻因子=64 STA T1SC LDHX #$0000 ;計數(shù)寄存器初值=$0000 STHX T1CNTH LDHX

9、#$9600 ;設(shè)1秒產(chǎn)生1次溢出中斷 STHX T1MODH ;模數(shù)寄存器設(shè)定值=1(2457600/64)=$9600 16設(shè)定初始時間 LDHX #$0000Display1: ;把要顯示的16個初始字符放入LCD_Buffer12中 LDA DisplayBytes1,X STA LCD_Buffer1,X LDA DisplayBytes2,X STA LCD_Buffer2,X AIX #1 CPHX #$10 BNE Display1 ;循環(huán)16次 JSR Init_LCD ;LCD初始化 JSR Show_LCD ;將內(nèi)存LCD_Buffer12的32字節(jié)ASCII字符送LCD

10、顯示 MOV #$00,SEC MOV #$00,MIN MOV #$00,HOU17鍵盤中斷初始化 JSR KBInit ;執(zhí)行鍵盤中斷初始化子程序-初始化完畢-18總循環(huán)n ; 允許定時器1計數(shù)寄存器計數(shù),n ;開放定時中斷,開放鍵盤中斷 n BCLR 1,INTKBSCR ;開放鍵盤中斷n BCLR 5,T1SC ;允許定時器1計數(shù)寄存器計數(shù)n CLI ;開放中斷n* 總循環(huán)nStart_1: ;總循環(huán)開始處 n NOP ;僅為實驗例程,主循環(huán)無實際工作n BRA Start_119掃描讀鍵值子程序(從KBA開始)n功能:掃描一次接在PTA口的4*4鍵盤n (PTA7-4接4根鍵盤列線(

11、X4-1),PTA3-0接 n 4根鍵盤行線(Y4-1)上的按鍵(使用行掃描法),n 鍵值放在A中若無按鍵, A中值$FF n占用內(nèi)存:Tmpvar1(緩沖使用) n出口:A=鍵值 n-20掃描讀鍵值子程序nKBA: MOV #%11111110,Tmpvar1 ;第一根行線為0 LDX #$04 ;掃描4根行線KB1: LDA PTA ;取PTA給A ORA #%00001111 ;PTA7-4保留原態(tài),PTA3-0為1 AND Tmpvar1 ;令PTAn=0,n=0,1,2,3 STA PTA ;處理后給PTA以便查詢 NOP NOP LDA PTA ;查第n列上是否有鍵按下 AND #

12、%11110000 ;保留PTA7-4列值,令低PTA3-0=0 CBEQA #$F0,KB2 ;A等于$F0,本行線沒鍵按下,轉(zhuǎn)到KB2 ;A不等于$F0,本行有鍵按下 LDA PTA ;A放鍵值 BRA KB3 ;轉(zhuǎn)到KB3結(jié)束中斷KB2: SEC ;令C=1 ROL Tmpvar1 ;使下一個行線為0,查下一行 DBNZX KB1 ;對行線循環(huán) LDA #$FF ;沒有鍵被按下為$FFKB3:RTS21鍵盤中斷初始化子程序(從KBInit開始)n功能:對被定義為鍵盤中斷的引腳進行初始化,n 但未開放 鍵盤中斷 n占用CPU內(nèi)寄存器:A 22鍵盤中斷初始化子程序nKBInit:n LDA

13、#$00 ;定義A口之前復(fù)位PTAn STA PTAn LDA #%00001111 ;定義A口7-4輸入(作為列),3-0輸出(作為行)n STA DDRAn LDA #%11110000 ;定義A口7-4有上拉電阻n STA PTAPUEn BSET 1,INTKBSCR ;屏蔽鍵盤中斷n LDA #%11110000 ;允許KBIE7-4PIN中斷進入n STA INTKBIERn BSET 2,INTKBSCR ;清除鍵盤中斷n RTS23鍵盤中斷子程序(從KBint開始)n-鍵盤中斷子程序(從KBint開始)-n功能:鍵盤中斷程序,鍵值放入內(nèi)存KbValue中 n調(diào)用子程序:掃描法讀

14、鍵值子程序(KBA),鍵盤中斷初始化子程序(KBInit) n出口:第0頁內(nèi)存單元KbValue中為鍵值 -24鍵盤中斷子程序1nKBint:n PSHH ;保護Hn SEI ;禁止中斷n BSET 1,INTKBSCR ;禁止鍵盤中斷n JSR KBA ;調(diào)子程序KBA,鍵值放在A中n STA KbValue ;放入內(nèi)存KbValuen JSR KBdef ;執(zhí)行鍵盤轉(zhuǎn)化為具體值子程序,轉(zhuǎn)成鍵定義值 n ;是否為*?,不是退出KBint_Exitn CMP #!42 ;ASCI *鍵n BEQ SetUpBegin n JMP KBint_Exit ;不是,等待*鍵nSetUpBegin:

15、;是*,xx:xx:xx n BSET 2,INTKBSCR ;清除鍵盤中斷n MOV #$0,SetByte ;賦初值0nSetUpStore: ;保存原來每位顯示的數(shù)據(jù)n LDHX #$00n LDX SetByten LDA LCD_Buffer2,Xn STA Tmpvar4 nSetUp:n LDHX #$00n LDX SetByten LDA #!32 ; $39(數(shù)值9)轉(zhuǎn)SetUpn CMP #$30n BLO SetUp ;$30(數(shù)值0)轉(zhuǎn)SetUp$32(數(shù)值2) 無效 轉(zhuǎn)SetUpn BRA SetUp3數(shù)值n LDX #!10n MUL ;(A)*(X)-A n S

16、TA TmpVar3 ;A-臨時單元TmpVar3n PULAn PSHAn SUB #$30 ;ASCII 值-數(shù)值n ADD TmpVar3 n CMP #!23n PULAn BHI SetUp ;23無效 轉(zhuǎn)SetUpn BRA SetUp3 ;有效 轉(zhuǎn)SetUp3nSetUp2: ;第3、6位小于6(ASCII值小于36)n PULA n CMP #$36 n BHS SetUp ;=36(數(shù)值=6)無效 轉(zhuǎn)SetUpn nSetUp3: ;是有效的數(shù),則置于相應(yīng)位置n LDHX #$00n LDX SetByte n STA LCD_Buffer2,X數(shù)值n LDX #!10n M

17、ULn LDHX #!1n ADD LCD_Buffer2,X 數(shù)值n LDX #!10n MULn LDHX #!4n ADD LCD_Buffer2,Xn SUB #$30n STA Minn LDHX #!6n LDA LCD_Buffer2,Xn SUB #$30 ;ASCII 值-數(shù)值n LDX #!10n MULn LDHX #!7n ADD LCD_Buffer2,Xn SUB #$30n STA Secn n JSR Show_LCD ;將內(nèi)存LCD_Buffer12的32字節(jié)ASCII字符送LCD顯示30鍵盤中斷子程序7nBCLR 7,T1SC ;清除定時器溢出標志位n nK

18、Bint_Exit:n PULH ;H出棧n BSET 1,INTKBSCR ;禁止鍵盤中斷n BSET 2,INTKBSCR ;清除鍵盤中斷n JSR KBInit ;調(diào)用鍵盤中斷初始化子程序n BCLR 1,INTKBSCR ;開放鍵盤中斷n CLI n RTI31鍵盤轉(zhuǎn)化為具體值子程序(從KBdef開始)n功能:鍵值轉(zhuǎn)為鍵盤表面具體的字符或符號代表值 n入口:內(nèi)存第0頁中KBValue為鍵值,n 使用鍵值編號表 n占用CPU寄存器:X(存放相對地址) n出口:A=鍵定義值 32鍵盤轉(zhuǎn)化為具體值子程序nKBdef:n LDHX #$0000 nKBkey1:n LDA KBTABLE,Xn

19、 BEQ KBkey3 ;=0,表示表中未定義此鍵值n CMP KBValue ;與KBValue入口鍵值相比較n BNE KBkey2 ;不等,未找到轉(zhuǎn)KBkey2n INCX ;找到地址加1n LDA KBTABLE,X ;取鍵定義值給An BRA KBkeyrnKBkey2:n INCXn INCXn BRA KBkey1nKBkey3:n LDA #$FF ;未定義鍵用FF標志nKBkeyr:RTSnKBTABLE FCB $EE,1,$DE,2,$BE,3,$7E,An FCB $ED,4,$DD,5,$BD,6,$7D,Bn FCB $EB,7,$DB,8,$BB,9,$7B,Cn

20、 FCB $E7,*,$D7,0,$B7,#,$77,Dn FCB $0033Init_LCD(LCD初始化子程序)n入口:無 n功能:初始化LCD(HD44780) n調(diào)用子程序:LCD_Command(LCD命令執(zhí)行子程序) n占用CPU內(nèi)部寄存器:A,X1.6msnCLR-LCD-2-MS: ;延時n AIX #-1n CPHX #0n BNE CLR-LCD-2-MSn LDA #%00000110 ;輸入方式設(shè)置:數(shù)據(jù)讀寫操作后,AC自動增1n ;顯示不動,光標左移n JSR LCD_Commandn LDA #%00010100 ;光標移位設(shè)置:光標右移一個字符位,AC自動加1n

21、JSR LCD_Commandn LDA #%00001100 ;顯示開關(guān)設(shè)置:開顯示,關(guān)光標顯示,不閃爍n JSR LCD_Commandn RTS35LCD_Command(LCD命令執(zhí)行子程序)n入口:A n功能:對A中指令使用PORTA作為輸出口,n 到LCD進行命令執(zhí)行或字符顯示 n占用CPU內(nèi)部寄存器:A 36LCD_CommandnLCD_Command:n PSHH ;保護現(xiàn)場n PSHXn LDHX #$0020 ;等待40usn DBNZX *n STA PTB ;把指令碼送到A口n NOPn NOPn BSET LCD_E,PTC ;LCD開始接受數(shù)據(jù),置使能位為1n N

22、OPn NOPn BCLR LCD_E,PTC ;LCD結(jié)束接受數(shù)據(jù),置使能位為0n LDHX #$0020 ;等待40usn DBNZX *n PULX ;恢復(fù)現(xiàn)場n PULHn RTS37Show_LCD(LCD顯示子程序)n入口:A,HX n出口:HX所指的內(nèi)存二字節(jié)地址為A中 n描述:轉(zhuǎn)一字節(jié)16進制數(shù)為二字節(jié)ASCII碼字符38Show_LCD ;第一行Show_LCD: ;進行顯示數(shù)據(jù)寄存器(DD RAM)地址設(shè)置 BCLR LCD-RS,PTC BCLR LCD-RW,PTC ;設(shè)置前8個字符首DD RAM地址 LDA #%10000000 JSR LCD_Command LDH

23、X #$00 ;顯示前8個字符Show-First-8Byte: BSET LCD-RS,PTC ;令LCD的RS=1,R/W=0,寫入數(shù)據(jù)到DD RAM中 BCLR LCD-RW,PTC LDA LCD_Buffer1,X ;將LCD_Buffer+X的數(shù)據(jù)放入A作為入口 JSR LCD_Command AIX #1 CPHX #$8 BNE Show-First-8Byte LDA #%10001000 ;設(shè)置后8個字符首DD RAM地址 BCLR LCD-RS,PTC BCLR LCD-RW,PTC JSR LCD_Command LDHX #$08 ;顯示后8個字符39Show_LCD

24、1Show-Next-8Byte: BSET LCD-RS,PTC ;令LCD的RS=1,R/W=0,寫入數(shù)據(jù)到DD RAM中 BCLR LCD-RW,PTC LDA LCD_Buffer1,X ;將LCD_Buffer+X的數(shù)據(jù)放入A作為入口 JSR LCD_Command AIX #1 CPHX #$10 BNE Show-Next-8Byte ;第二行,進行DD RAM地址設(shè)置 BCLR LCD-RS,PTC ;令LCD的RS0、R/W=0 BCLR LCD-RW,PTC LDA #%11000000 ;設(shè)置DD RAM地址為#%1000000(即40H) JSR Lcd_Command

25、 ;執(zhí)行設(shè)置光標在DDRAM位置 LDHX #$0 ;顯示前8個字符 Show_F_8b2: BSET LCD-RS,PTC ;令LCD的RS=1,R/W=0:寫數(shù)據(jù) BCLR LCD-RW,PTC LDA LCD_Buffer2,x ;將LCD_Buffer開始的中第x位數(shù)據(jù)存放入A中 JSR Lcd_Command ;執(zhí)行命令 AIX #1 CPHX #$8 BNE Show_F_8b2 ;完成前8個字符的顯示40Show_LCD2;進行DD RAM地址設(shè)置 LDA #%11001000 ;設(shè)置DDRAM地址為#%1000000(即48H) BCLR LCD-RS,PTC ;令LCD的RS

26、0、R/W=0 BCLR LCD-RW,PTC JSR Lcd_Command ;執(zhí)行命令 LDHX #$08 ;顯示后8個字符Show_N_8b2: BSET LCD-RS,PTC ;令LCD的RS=1,R/W=0:寫數(shù)據(jù) BCLR LCD-RW,PTC LDA LCD_Buffer2,x ;將LCD_Buffer開始的中第x位數(shù)據(jù)存放入A中 JSR Lcd_Command ;執(zhí)行命令 AIX #1 CPHX #$10 BNE Show_N_8b2 ;完成后8個字符的顯示RTS41轉(zhuǎn)碼子程序TimeCH: PSHA ;進棧,保存A,H,X中的內(nèi)容 PSHH PSHX LDHX #$000A ;取10 DIV ;除以10,A中放商,H中放余數(shù) ADD #$30 ;實際數(shù)值加上$30(!48)變ASCII碼 PULX ;X出棧 PULH ;H出棧 STA ,X ;把A的內(nèi)容存儲到以(X)為地址的單元中 AIX #$1 ;立即數(shù)1加到變址寄存器,轉(zhuǎn)下一字符 PULA PSHH PSHX LDHX #$000A DIV PSHH

溫馨提示

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

評論

0/150

提交評論