freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

利用單片機(jī)分時(shí)電價(jià)系統(tǒng)設(shè)計(jì)(編輯修改稿)

2025-07-01 16:18 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 隱藏了一個(gè)列實(shí)現(xiàn)的細(xì)節(jié), LCD 由兩塊顯示芯片控制,每一塊控制 61 列,即 0~ 60列為第一塊芯片控制,要用 Display_Left 函數(shù)顯示 ,第二塊控制 61~121 列,要用Display_Right 函數(shù)顯示,而此函數(shù)可以接受的列為 0~ 0x7F。在函數(shù)中會(huì)對(duì)輸入的列參數(shù)進(jìn)行判斷,小于 0x40 的列,函數(shù)會(huì)調(diào)用 Display_Left 函數(shù)顯示 ,大于或者等于 0x40 的列,函數(shù)會(huì)調(diào)用 Display_Right 函數(shù)顯示。這樣就完成了列的平滑顯示。 DisplayAtRow 函數(shù)是對(duì) DisplaySelected 函數(shù)的進(jìn)一步封裝,此函數(shù)的意圖是掩蓋頁(yè)的跨越,使之能夠以一個(gè)函數(shù)在 LCD 上顯示一個(gè)完整的、共 32 字節(jié)數(shù)據(jù)表示的字符。由于 DisplaySelected 函數(shù)已經(jīng)掩蓋了列的跨越,所以 DisplayAtRow的列參數(shù)就直接傳遞給了 DisplaySelected 函數(shù)。 DisplayAtRow 函數(shù)將整個(gè) LCD分成了兩個(gè)顯示行,每個(gè)顯示行包含 2 個(gè)頁(yè) , 16 個(gè)像素行,可以顯示一個(gè)完整的字符。其實(shí)現(xiàn)原理是對(duì)于位于第 0 顯示行的字符,調(diào)用 2 次 DisplaySelected函數(shù),將字符的上半數(shù)據(jù)送到第 0 頁(yè)顯示,將字符的下半數(shù)據(jù)送到第 1 頁(yè)顯示,這樣就完成了整個(gè)字符的顯示。對(duì)于位于第 1 顯示行的字符,將字符的上半數(shù)據(jù)調(diào)用 DisplaySelected 函數(shù)送到第 2 頁(yè)顯示,將 字符的下半 數(shù)據(jù)調(diào)用DisplaySelected 函數(shù)送到第 3 頁(yè)顯示。這樣就完成了頁(yè)跨越的掩蓋。 位于 LCD 顯示驅(qū)動(dòng)最高層,即 “顯示服務(wù)提供層 ”的函數(shù)只有一個(gè),即DisplayALine,此函數(shù)是基于 DisplayAtRow 函數(shù)的封裝。由于 DisplayAtRow 函數(shù)可以在指定位置顯示一個(gè)字符,基于這種能力派生的 DisplayALine 函數(shù)的功能就是將一行字符顯示在某一個(gè)顯示行上。由于 LCD 最多可以顯示 8 個(gè) 1616的字符。所以 DisplayALine 函數(shù)顯示字符串的最大字符限制也為 8 個(gè)字符。DisplayALine 函數(shù)用來(lái)向其他需要顯示的函數(shù)提供服務(wù)。一個(gè)需要進(jìn)行顯示的函數(shù)將它要進(jìn)行顯示的數(shù)據(jù)通過(guò)查表或者其他途徑轉(zhuǎn)換為 LCD 顯示的顯示碼,然后將顯示碼保存在一個(gè) 832 的數(shù)組中傳遞給 DisplayALine 函數(shù),然后DisplayALine 函數(shù)將數(shù)組中的數(shù)據(jù)全部送入某行進(jìn)行顯示。 兩個(gè)提示函數(shù) ShowDefault 和 ShowError 用于顯示必要的提示信息。 ShowDefault函數(shù)設(shè)計(jì)成一個(gè)死循環(huán),用于顯示系統(tǒng)的待機(jī)畫(huà)面。此待機(jī)畫(huà)面用于向用戶提示鍵盤(pán)上各個(gè)按鍵的功能。 ShowError 函數(shù)在用戶操作出錯(cuò)時(shí)向用戶顯示一個(gè)出錯(cuò)提示,以便防止用戶誤操作。 六、總結(jié) 這個(gè)系統(tǒng)是我所設(shè)計(jì)過(guò)的最為復(fù)雜的一個(gè)系統(tǒng),雖然硬件部分比較簡(jiǎn)單,但是這個(gè)系統(tǒng)的軟件完全是在我已經(jīng)純熟的 C 語(yǔ)言編程技巧的基礎(chǔ)上開(kāi)發(fā)的,除了為了了 解某些硬件的命令字查看過(guò)示例程序外,其他的程序完全是自己開(kāi)發(fā)的,沒(méi)有參考、抄襲其他任何論文、報(bào)告。通過(guò)這個(gè)系統(tǒng)的設(shè)計(jì),我對(duì) Keil C51 的語(yǔ)法,開(kāi)發(fā)方法有了較深的認(rèn)識(shí),可以肯定的說(shuō),如果有第二次機(jī)會(huì)開(kāi)發(fā)這樣的系統(tǒng),那么,在系統(tǒng)控制程序上所犯的錯(cuò)誤,將會(huì)大大減少。 在設(shè)計(jì)本系統(tǒng)之前,為單片機(jī)編寫(xiě)的程序都是較小的程序,一直用匯編語(yǔ)言寫(xiě)。本系統(tǒng)的復(fù)雜性使匯編語(yǔ)言程序不利于編寫(xiě)和閱讀,所以采用 C 語(yǔ)言編寫(xiě)。由于我以前都是為 Intel 80586 以上,安裝 windows 操作系統(tǒng)的 PC 寫(xiě) C 語(yǔ)言的應(yīng)用程序。所以雖然程序完 全符合標(biāo)準(zhǔn) C 語(yǔ)言的要求,但是由于硬件平臺(tái)的不同,還是出現(xiàn)了很多問(wèn)題?,F(xiàn)將各種問(wèn)題一一描述: 中斷函數(shù)寄存器組使用不當(dāng):程序中有 3 個(gè)中斷函數(shù),在最初每個(gè)中斷函數(shù)使用的寄存器組都不相同,本意是為了提高寄存器的利用效率。定義偵探狗中斷 T0 使用寄存器組 1,鍵盤(pán)中斷使用寄存器組 2,電量中斷使用寄存器組 3。但是在調(diào)試中發(fā)生了一個(gè)錯(cuò)誤。 main 函數(shù)和 KeyBoard 函數(shù)中都調(diào)用了DisplayALine 函數(shù)顯示一個(gè)字符串。 main 中的調(diào)用可以正常工作,將字符串顯示在 LCD 上,但是 KeyBoard 函數(shù)中則只能顯示 字符串的上半行,下半行的字總是顯示在 LCD 的最左邊,從而造成這樣一些亂碼。這個(gè)問(wèn)題對(duì)我們?cè)斐闪讼喈?dāng)?shù)睦_,因?yàn)?main 和 KeyBoard 調(diào)用的是同一個(gè)函數(shù)。開(kāi)始時(shí)以為是在傳遞參數(shù)時(shí)指針出錯(cuò),后來(lái)使用斷點(diǎn)調(diào)試時(shí)才發(fā)現(xiàn), DisplayALine 在顯示下半行調(diào)用DisplaySelected 函數(shù)時(shí),列 Column 的實(shí)際值都為 0,所以所有的字符的下半行都送到第一個(gè)字符下面去顯示。其后分析認(rèn)為,產(chǎn)生的錯(cuò)誤中,最大的不同是調(diào)用 DisplayALine 函數(shù)的位置不同,即一個(gè)在 mian 中,另一個(gè)在 KeyBoard 中,它們兩 個(gè)函數(shù)使用了不同的寄存器組。 main 使用的寄存器組為第 0 組, KeyBoard使用第 2 組。由于 DisplayALine 函數(shù)的參數(shù)是通過(guò)寄存器組來(lái)傳遞的,所以推斷使用其他的寄存器組會(huì)導(dǎo)致顯示錯(cuò)誤。將 KeyBoard 函數(shù)使用的寄存器組改為0 組,錯(cuò)誤消失。 數(shù)據(jù)段溢出錯(cuò)誤:在最初的程序中,除了字庫(kù)外,全局變量、靜態(tài)變量都按照標(biāo)準(zhǔn) C 語(yǔ)言方式默認(rèn)定義,沒(méi)有考慮到存儲(chǔ)位置的問(wèn)題。但是鏈接時(shí)發(fā)生錯(cuò)誤,提示 data 段溢出。最初不明所以,其后查看 C51 的幫助文檔時(shí)看到,如果不顯式說(shuō)明變量的存儲(chǔ)位置,則變量會(huì)根據(jù)系統(tǒng)模 式的設(shè)置存放到默認(rèn)的數(shù)據(jù)區(qū)。本系統(tǒng)中使用的是 89C58 最小系統(tǒng)方式,默認(rèn)情況下變量會(huì)存放到系統(tǒng)的data 段,由于 data 段只有 128 個(gè)字節(jié),而且還有寄存器組和位尋址區(qū),難以容納所有的變量。了解到這些以后,將所有的全局變量和靜態(tài)變量都顯式聲明到 idata段, idata 段為 256 字節(jié),足以容納這些變量,問(wèn)題得意解決。 編譯器匯編語(yǔ)言與 C 語(yǔ)言交叉編譯不完善:在本系統(tǒng)程序設(shè)計(jì)中,在某些位置需要用到匯編中的一條 nop 指令,由于 C 語(yǔ)言中并無(wú)與此功能相近的語(yǔ)句,所以我們求助于 C51 中的 C 語(yǔ)言與匯編語(yǔ)言的交叉 編譯。即在相應(yīng)位置加入pragma asm nop pragma endasm 匯編指令,執(zhí)行空指令。在編譯器中設(shè)置好相關(guān)選項(xiàng)并進(jìn)行編譯。在我的電腦上安裝有 Keil C51 試用版,利用此版本進(jìn)行編譯、鏈接通過(guò),但是使用版有代碼大小限制,無(wú)法生成執(zhí)行文件。實(shí)驗(yàn)室安裝的為 Keil C51 版,在鏈接時(shí)無(wú)法通過(guò),提示大堆的符號(hào)未定義。由于編譯器版本老舊的問(wèn)題,為了生成執(zhí)行文件,只能將相應(yīng)位置的匯編指令去除或者用與之近似的 C 語(yǔ)句代替。 編譯器對(duì)預(yù)編譯指令未正確解釋:本系統(tǒng)程序設(shè)計(jì)時(shí),由于 字庫(kù)比較大,所以最初是將字庫(kù)定義在一個(gè)頭文件 中,與主程序隔離。這樣的話,修改和閱讀都比較方便。但是鏈接時(shí)產(chǎn)生錯(cuò)誤,連接器抱怨說(shuō)字庫(kù)公開(kāi)變量被多次定義。推斷應(yīng)該是頭文件被多個(gè)模塊包含產(chǎn)生了錯(cuò)誤。然后修改了代碼,將 文 件 中 所 有 的 變 量 定 義 都 包 含 在 預(yù) 處 理 指 令 ifndef CHARACTERLIB_H define CHARACTERLIB_H …endif 中,但是在 Keil C51 版本中仍然會(huì)產(chǎn)生錯(cuò)誤。如果換用 Keil C51 版本,則在頭文 件中不加預(yù)編譯指令也不會(huì)報(bào)錯(cuò)。因?yàn)閷?shí)際上只有 包含了 。最后,只能將字庫(kù)定義全部從 中移到 中,問(wèn)題解決。 我可以容忍設(shè)計(jì)中出任何問(wèn)題,但是不能容忍實(shí)驗(yàn)室的儀器出一點(diǎn)點(diǎn)問(wèn)題。這是第一次課程設(shè)計(jì)時(shí)留下的痛苦回憶,設(shè)計(jì)的完全正確,但是結(jié)果完全錯(cuò)誤。最后發(fā)現(xiàn)儀器裝作可以正常工作的樣子欺騙我們,那時(shí)真想撲上去咬它。這次使用的是湖北眾友的單片機(jī)開(kāi)發(fā)實(shí)驗(yàn)箱,總算是正常工作(并不是每個(gè)人的都正常工作,汗)。但是問(wèn)題并不是沒(méi)有。由于設(shè)計(jì)的系統(tǒng)中要用到一 個(gè) LCD 顯示模塊,而這個(gè)模塊是國(guó)產(chǎn)的模塊,除了廠家外,并沒(méi)有標(biāo)準(zhǔn)使用說(shuō)明書(shū)。只能參考實(shí)驗(yàn)箱的使用手冊(cè)。在這個(gè)手冊(cè)上提供了 3 個(gè)關(guān)于 LCD 的信息,一個(gè)是 Protel 畫(huà)的實(shí)驗(yàn)箱的 LCD 部分電路圖,一個(gè)是手冊(cè)上的 LCD 連線示例圖,還有一個(gè)是 LCD 模塊引腳說(shuō)明表。但是,這 3 個(gè)資料中,任意兩個(gè)對(duì) LCD 引腳連線方法的說(shuō)明都不同。 真是很無(wú)語(yǔ),幸好這個(gè)問(wèn)題只影響 PCB 電路圖的繪制,對(duì)于編程沒(méi)有影響,暫時(shí)將其忽略了。 眾友開(kāi)發(fā)箱附帶的使用手冊(cè)也令人很無(wú)語(yǔ),居然只有薄薄的 58 頁(yè),還沒(méi)有我的設(shè)計(jì)報(bào)告長(zhǎng),國(guó)產(chǎn)產(chǎn)品的通病。幸好上面 的電路圖和隨機(jī)附帶的程序源碼都還實(shí)用,不然的話。 關(guān)于這個(gè)開(kāi)發(fā)板的硬件呢, CPU 是 SST 的 89C58, 256B 可用內(nèi)存(喜歡), 32KB的 FlashROM(喜歡),時(shí)鐘為 33MHz。此單片機(jī)帶的 32KB 的 FlashROM 幫了大忙,我的設(shè)計(jì)中程序共 20xx 多行, 1000 行為字庫(kù),一半存放于外部 RAM,一半存放于 ROM 中。 1000 行為程序代碼。這樣加起來(lái),代碼大小為 15KB,要不是他的 ROM 足夠大,還真的放不下。 LCD 為 FM12232A 液晶顯示模塊,共12232 個(gè)像素。以 1616 的像素顯示一個(gè)字的話 ,這個(gè)模塊可以勉強(qiáng)顯示 2 行,每行 8 個(gè)字。但是比較郁悶的是,如果要完全以 1616 像素顯示 8 個(gè)字,那么至少 12816 個(gè)像素,這個(gè)模塊一行只有 122 個(gè)像素,哭。既然要顯示漢字,為什么不用 12832 的啊,用 122 顯 8 個(gè)漢字就會(huì)少 6 個(gè)像素,無(wú)語(yǔ)。只能將第四個(gè)字和第 8 個(gè)字各少 3 個(gè)像素。雖然肉眼不仔細(xì)看的話是看不出來(lái)的,總覺(jué)得不爽之至。還用到一個(gè)鍵盤(pán),由 Intel 8279 和 16 鍵的鍵盤(pán)組成。這個(gè) 8279, Intel 官方出的使用手冊(cè)共 16 頁(yè),贊,看人家的資料就是詳細(xì)。自認(rèn)為英文閱讀還不錯(cuò)的我,(平時(shí)編程都是直接查 MSDN 的英文文檔練出來(lái)的,全英文的芯片手冊(cè)也看過(guò)不少)
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1