這個命令是讓TimerPauseReg左移8位,即乘以256倍嗎?
如果高8位 為0的話 可以說是 乘以256
i=(addr>>8)<<1
比如 addr 值 為 1284H
addr>>8 為 0012H
(addr>>8)<<1 為 0024H
而右移7位 值 為 0025H
1<<TWINT
我也不是很清楚 抱歉 知識不精
㈡ EWD、DEP和EWP是什麼文件
是用LAR軟體編程生成的工程文件,專門用於開發430單片機的
㈢ 匯編語言(面向機器的程式設計語言)詳細資料大全
匯編語言(assembly language)是一種用於電子計算機、微處理器、微控制器或其他可程式器件的低級語言,亦稱為符號語言。在匯編語言中,用助記符(Mnemonics)代替機器指令的操作碼,用地址符號(Symbol)或標號(Label)代替指令或運算元的地址。在不同的設備中,匯編語言對應著不同的機器語言指令集,通過匯編過程轉換成機器指令。普遍地說,特定的匯編語言和特定的機器語言指令集是一一對應的,不同平台之間不可直接移植。
許多匯編程式為程式開發、匯編控制、輔助調試提供了額外的支持機制。有的匯編語言編程工具經常會提供宏,它們也被稱為宏匯編器。
匯編語言不像其他大多數的程式設計語言一樣被廣泛用於程式設計。在今天的實際套用中,它通常被套用在底層,硬體操作和高要求的程式最佳化的場合。驅動程式、嵌入式作業系統和實時運行程式都需要匯編語言。
基本介紹 中文名 :匯編語言 外文名 :Assembly Language 學科 :軟體工程 產生年代 :20世紀50年代 編譯方式 :匯編 發展歷程,語言特點,總體特點,優點,缺點,語言組成,數據傳送指令,整數和邏輯運算指令,移位指令,位操作指令,條件設定指令,控制轉移指令,串操作指令,輸入輸出指令,相關技術,匯編器,編譯環境,發展前景,實際套用,經典教材,x86處理器,ARM及單片機, 發展歷程 說到匯編語言的產生,首先要講一下機器語言。機器語言是機器指令的集合。機器指令展開來講就是一台機器可以正確執行的命令。電子計算機的機器指令是一列二進制數字。計算機將之轉變為一列高低電平,以使計算機的電子器件受到驅動,進行運算。 上面所說的計算機指的是可以執行機器指令,進行運算的機器。這是早期計算機的概念。在我們常用的PC機中,有一個晶片來完成上面所說的計算機的功能。這個晶片就是我們常說的CPU(Central Processing Unit,中央處理單元)。每一種微處理器,由於硬體設計和內部結構的不同,就需要用不同的電平脈沖來控制,使它工作。所以每一種微處理器都有自己的機器指令集,也就是機器語言。 早期的程式設計均使用機器語言。程式設計師們將用0, 1數字編成的程式代碼打在紙帶或卡片上,1打孔,0不打孔,再將程式通過紙帶機或卡片機輸入計算機,進行運算。這樣的機器語言由純粹的0和1構成,十分復雜,不方便閱讀和修改,也容易產生錯誤。程式設計師們很快就發現了使用機器語言帶來的麻煩,它們難於辨別和記憶,給整個產業的發展帶來了障礙,於是匯編語言產生了。 匯編語言的主體是匯編指令。匯編指令和機器指令的差別在於指令的表示方法上。匯編指令是機器指令便於記憶的書寫格式。 操作:暫存器BX的內容送到AX中1000100111011000機器指令movax,bx匯編指令 此後,程式設計師們就用匯編指令編寫源程式。可是,計算機能讀懂的只有機器指令,那麼如何讓計算機執行程式設計師用匯編指令編寫的程式呢?這時,就需要有一個能夠將匯編指令轉換成機器指令的翻譯程式,這樣的程式我們稱其為編譯器。程式設計師用匯編語言寫出源程式,再用匯編編譯器將其編譯為機器碼,由計算機最終執行。 工作過程 語言特點 匯編語言是直接面向處理器(Processor)的程式設計語言。處理器是在指令的控制下工作的,處理器可以識別的每一條指令稱為機器指令。每一種處理器都有自己可以識別的一整套指令,稱為指令集。處理器執行指令時,根據不同的指令採取不同的動作,完成不同的功能,既可以改變自己內部的工作狀態,也能控制其它外圍電路的工作狀態。 匯編語言的另一個特點就是它所操作的對象不是具體的數據,而是暫存器或者存儲器,也就是說它是直接和暫存器和存儲器打交道,這也是為什麼匯編語言的執行速度要比其它語言快,但同時這也使編程更加復雜,因為既然數據是存放在暫存器或存儲器中,那麼必然就存在著定址方式,也就是用什麼方法找到所需要的數據。例如上面的例子,我們就不能像高級語言一樣直接使用數據,而是先要從相應的暫存器AX、BX 中把數據取出。這也就增加了編程的復雜性,因為在高級語言中定址這部分工作是由編譯系統來完成的,而在匯編語言中是由程式設計師自己來完成的,這無異增加了編程的復雜程度,降低了程式的可讀性。 再者,匯編語言指令是機器指令的一種符號表示,而不同類型的CPU 有不同的機器指令系統,也就有不同的匯編語言,所以,匯編語言程式與機器有著密切的關系。所以,除了同系列、不同型號CPU 之間的匯編語言程式有一定程度的可移植性之外,其它不同類型(如:小型機和微機等)CPU 之間的匯編語言程式是無法移植的,也就是說,匯編語言程式的通用性和可移植性要比高級語言程式低。 正因為匯編語言有「與機器相關性」的特性,程式設計師用匯編語言編寫程式時,可充分對機器內部的各種資源進行合理的安排,讓它們始終處於最佳的使用狀態。這樣編寫出來的程式執行代碼短、執行速度快。匯編語言是各種程式語言中與硬體關系最密切、最直接的一種,在時間和空間的效率上也最高的一種,它是高等院校計算機套用技術必修的專業課程之一,對於訓練學生掌握程式設計技術,熟悉上機操作和程式調試技術有重要作用 總體特點 1.機器相關性 這是一種面向機器的低級語言,通常是為特定的計算機或系列計算機專門設計的。因為是機器指令的符號化表示,故不同的機器就有不同的匯編語言。使用匯編語言能面向機器並較好地發揮機器的特性,得到質量較高的程式。 2.高速度和高效率 匯編語言保持了機器語言的優點,具有直接和簡捷的特點,可有效地訪問、控制計算機的各種硬體設備,如磁碟、存儲器、CPU、I/O連線埠等,且佔用記憶體少,執行速度快,是高效的程式設計語言。 3.編寫和調試的復雜性 由於是直接控制硬體,且簡單的任務也需要很多匯編語言語句,因此在進行程式設計時必須面面俱到,需要考慮到一切可能的問題,合理調配和使用各種軟、硬體資源。這樣,就不可避免地加重了程式設計師的負擔。與此相同,在程式調試時,一旦程式的運行出了問題,就很難發現。 優點 1、因為用匯編語言設計的程式最終被轉換成機器指令,故能夠保持機器語言的一致性,直接、簡捷,並能像機器指令一樣訪問、控制計算機的各種硬體設備,如磁碟、存儲器、CPU、I/O連線埠等。使用匯編語言,可以訪問所有能夠被訪問的軟、硬體資源。 2、目標代碼簡短,佔用記憶體少,執行速度快,是高效的程式設計語言,經常與高級語言配合使用,以改善程式的執行速度和效率,彌補高級語言在硬體控制方面的不足,套用十分廣泛。 缺點 1、匯編語言是面向機器的,處於整個計算機語言層次結構的底層,故被視為一種低級語言,通常是為特定的計算機或系列計算機專門設計的。不同的處理器有不同的匯編語言語法和編譯器,編譯的程式無法在不同的處理器上執行,缺乏可移植性; 2、難於從匯編語言代碼上理解程式設計意圖,可維護性差,即使是完成簡單的工作也需要大量的匯編語言代碼,很容易產生bug,難於調試; 3、使用匯編語言必須對某種處理器非常了解,而且只能針對特定的體系結構和處理器進行最佳化,開發效率很低,周期長且單調。 語言組成 數據傳送指令 這部分指令包括通用數據傳送指令MOV、條件傳送指令CMOV 、堆疊操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交換指令XCHG/XLAT/BSWAP、地址或段描述符選擇子傳送指令LEA/LDS/LES/LFS/LGS/LSS等。注意,CMOV不是一條具體的指令,而是一個指令簇,包括大量的指令,用於根據EFLAGS暫存器的某些位狀態來決定是否執行指定的傳送操作。 整數和邏輯運算指令 這部分指令用於執行算術和邏輯運算,包括加法指令ADD/ADC、減法指令SUB/SBB、加一指令INC、減一指令DEC、比較操作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV、符號擴展指令CBW/CWDE/CDQE、十進制調整指令DAA/DAS/AAA/AAS、邏輯運算指令NOT/AND/OR/XOR/TEST等。 移位指令 這部分指令用於將暫存器或記憶體運算元移動指定的次數。包括邏輯左移指令SHL、邏輯右移指令SHR、算術左移指令SAL、算術右移指令SAR、循環左移指令ROL、循環右移指令ROR等。 位操作指令 這部分指令包括位測試指令BT、位測試並置位指令BTS、位測試並復位指令BTR、位測試並取反指令BTC、位向前掃描指令BSF、位向後掃描指令BSR等。 條件設定指令 這不是一條具體的指令,而是一個指令簇,包括大約30條指令,用於根據EFLAGS暫存器的某些位狀態來設定一個8位的暫存器或者記憶體運算元。比如SETE/SETNE/SETGE等等。 控制轉移指令 這部分包括無條件轉移指令JMP、條件轉移指令J /JCXZ、循環指令LOOP/LOOPE/LOOPNE、過程調用指令CALL、子過程返回指令RET、中斷指令INTn、INT3、INTO、IRET等。注意,J 是一個指令簇,包含了很多指令,用於根據EFLAGS暫存器的某些位狀態來決定是否轉移;INT n是軟中斷指令,n可以是0到255之間的數,用於指示中斷向量號。 串操作指令 這部分指令用於對數據串進行操作,包括串傳送指令MOVS、串比較指令CMPS、串掃描指令SCANS、串載入指令LODS、串保存指令STOS,這些指令可以有選擇地使用REP/REPE/REPZ/REPNE和REPNZ的前綴以連續操作。 輸入輸出指令 這部分指令用於同外圍設備交換數據,包括連線埠輸入指令IN/INS、連線埠輸出指令OUT/OUTS。 高級語言輔助指令 這部分指令為高級語言的編譯器提供方便,包括創建棧幀的指令ENTER和釋放棧幀的指令LEAVE。 控制和特權指令 這部分包括無操作指令NOP、停機指令HLT、等待指令WAIT/MWAIT、換碼指令ESC、匯流排封鎖指令LOCK、記憶體范圍檢查指令BOUND、全局描述符表操作指令LGDT/SGDT、中斷描述符表操作指令LIDT/SIDT、局部描述符表操作指令LLDT/SLDT、描述符段界限值載入指令LSR、描述符訪問權讀取指令LAR、任務暫存器操作指令LTR/STR、請求特權級調整指令ARPL、任務切換標志清零指令CLTS、控制暫存器和調試暫存器數據傳送指令MOV、高速快取控制指令INVD/WBINVD/INVLPG、型號相關暫存器讀取和寫入指令RDMSR/WRMSR、處理器信息獲取指令CPUID、時間戳讀取指令RDTSC等。 浮點和多媒體指令 這部分指令用於加速浮點數據的運算,以及用於加速多媒體數據處理的單指令多數據(SIMD及其擴展SSEx)指令。這部分指令數據非常龐大,無法一一列舉,請自行參考INTEL手冊。 虛擬機擴展指令 這部分指令包括INVEPT/INVVPID/VMCALL/VMCLEAR/VMLAUNCH/VMRESUME/VMPTRLD/VMPTRST/VMREAD/VMWRITE/VMXOFF/VMON等。 相關技術 匯編器 典型的現代 匯編器 (assembler)建造目標代碼,由解譯組語指令集的易記碼(mnemonics)到操作碼(OpCode),並解析符號名稱(symbolic names)成為存儲器地址以及其它的實體。使用符號參考是匯編器的一個重要特徵,它可以節省修改程式後人工轉址的乏味耗時計算。基本就是把機器碼變成一些字母而已,編譯的時候再把輸入的指令字母替換成為晦澀難懂機器碼。 編譯環境 用匯編語言等非機器語言書寫好的符號程式稱為源程式,匯編語言編譯器的作用是將源程式翻譯成目標程式。目標程式是機器語言程式,當它被安置在記憶體的預定位置上後,就能被計算機的CPU處理和執行。 匯編的調試環境總的來說比較少,也很少有非常好的編譯器。編譯器的選擇依賴於目標處理器的類型和具體的系統平台。一般來說,功能良好的編譯器用起來應當非常方便,比如,應當可以自動整理格式、語法高亮顯示,集編譯、連結和調試為一體,方便實用。 對於廣泛使用的個人計算機來說,可以自由選擇的匯編語言編譯器有MASM、NASM、TASM、GAS、FASM、RADASM等,但大都不具備調試功能。如果是為了學習匯編語言,輕松匯編因為擁有一個完善的集成環境,是一款非常適合初學者的匯編編譯器。 發展前景 匯編語言是機器語言的助記符,相對於比枯燥的機器代碼易於讀寫、易於調試和修改,同時優秀的匯編語言設計者經過巧妙的設計,使得匯編語言匯編後的代碼比高級語言執行速度更快,占記憶體空間少等優點,但匯編語言的運行速度和空間佔用是針對高級語言並且需要巧妙設計,而且部分高級語言在編譯後代碼執行效率同樣很高,所以此優點慢慢弱化。而且在編寫復雜程式時具有明顯的局限性,匯編語言依賴於具體的機型,不能通用,也不能在不同機型之間移植。常說匯編語言是低級語言,並不是說匯編語言要被棄之,相反,匯編語言仍然是計算機(或微機)底層設計程式設計師必須了解的語言,在某些行業與領域,匯編是必不可少的,非它不可適用。只是,現在計算機最大的領域為IT軟體,也是我們常說的計算機套用軟體編程,在熟練的程式設計師手裡,使用匯編語言編寫的程式,運行效率與性能比其它語言寫的程式相對提高,但是代價是需要更長的時間來最佳化,如果對計算機原理及編程基礎不扎實,反而增加其開發難度,實在是得不償失,對比2010年前後的軟體開發,已經是市場化的軟體行業,加上高級語言的優秀與跨平台,一個公司不可以讓一個團隊使用匯編語言來編寫所有的東西,花上幾倍甚至幾十倍的時間,不如使用其它語言來完成,只要最終結果不比匯編語言編寫的差太多,就能搶先一步完成,這是市場經濟下的必然結果。 但是,迄今為止,還沒有程式設計師敢斷定匯編語言是不需要學的,同時,匯編語言(Assembly Language)是面向機器的程式設計語言,設計精湛的匯編程式設計師,部分已經脫離軟體開發,擠身於工業電子編程中。對於功能相對小巧但硬體對語言設計要求苛刻的行業,如4位單片機,由於其容量及運算,此行業的電子工程師一般負責從開發設計電路及軟體控制,主要開發語言就是匯編,c語言使用只佔極少部分,而電子開發工程師是千金難求,在一些工業公司,一個核心的電子工程師比其它任何職員待遇都高,對比起來,一般電子工程師待遇是程式設計師的十倍以上。這種情況是因為21世紀以來,學習匯編的人雖然也不少,但是真正能學到精通的卻不多,它相對於高級語言難學,難用,適用范圍小,雖然簡單,但是過於靈活,學習過高級語言的人去學習匯編比一開始學匯編的人難得多,但是學過匯編的人學習高級語言卻很容易,簡從繁易,繁從簡難。對於一個全面了解微機原理的程式設計師,匯編語言是必修語言。 實際套用 隨著現代軟體系統越來越龐大復雜,大量經過了封裝的高級語言如C/C++,Pascal/Object Pascal也應運而生。這些新的語言使得程式設計師在開發過程中能夠更簡單,更有效率,使軟體開發人員得以應付快速的軟體開發的要求。而匯編語言由於其復雜性使得其適用領域逐步減小。但這並不意味著匯編已無用武之地。由於匯編更接近機器語言,能夠直接對硬體進行操作,生成的程式與其他的語言相比具有更高的運行速度,佔用更小的記憶體,因此在一些對於時效性要求很高的程式、許多大型程式的核心模組以及工業控制方面大量套用。 此外,雖然有眾多程式語言可供選擇,但匯編依然是各大學計算機科學類專業學生的必修課,以讓學生深入了解計算機的運行原理。 歷史上,匯編語言曾經是非常流行的程式設計語言之一。隨著軟體規模的增長,以及隨之而來的對軟體開發進度和效率的要求,高級語言逐漸取代了匯編語言。但即便如此,高級語言也不可能完全替代匯編語言的作用。就拿Linux核心來講,雖然絕大部分代碼是用C語言編寫的,但仍然不可避免地在某些關鍵地方使用了匯編代碼。由於這部分代碼與硬體的關系非常密切,即使是C語言也會顯得力不從心,而匯編語言則能夠很好揚長避短,最大限度地發揮硬體的性能。 首先,匯編語言的大部分語句直接對應著機器指令,執行速度快,效率高,代碼體積小,在那些存儲器容量有限,但需要快速和實時回響的場合比較有用,比如儀器儀表和工業控制設備中。 其次,在系統程式的核心部分,以及與系統硬體頻繁打交道的部分,可以使用匯編語言。比如作業系統的核心程式段、I/O介面電路的初始化程式、外部設備的低層驅動程式,以及頻繁調用的子程式、動態連線庫、某些高級繪圖程式、視頻游戲程式等等。 再次,匯編語言可以用於軟體的加密和解密、計算機病毒的分析和防治,以及程式的調試和錯誤分析等各個方面。 最後,通過學習匯編語言,能夠加深對計算機原理和作業系統等課程的理解。通過學習和使用匯編語言,能夠感知、體會和理解機器的邏輯功能,向上為理解各種軟體系統的原理,打下技術理論基礎;向下為掌握硬體系統的原理,打下實踐套用基礎。 經典教材 匯編語言教材很多,各種處理器都有涉及,粗略統計不下百種。在這么多的教材里,用得較多的可以分類列舉如下: x86處理器 1.《x86匯編語言:從實模式到保護模式》,李忠著,電子工業出版社,2013-1 。 基於INTEL x86處理器、NASM編譯器和BOCHS虛擬機。匯編語言就是處理器的語言,從這個意義上來說,既然學習匯編語言,就必須直接面向硬體編程,而不是使用莫名其妙的DOS中斷和API調用。這是一本有趣的書,它沒有把篇幅花在計算一些枯燥的數學題上。相反,它教你如何直接控制硬體,在不藉助於BIOS、DOS、Windows、Linux或者任何其他軟體支持的情況下來顯示字元、讀取硬碟數據、控制其他硬體等。 我們知道,32位和64位是主流,實模式和DOS作業系統已經成為歷史,Linux和Windows都工作在保護模式下。這本書從實模式講到32位保護模式,尤其以32位保護模式為重點,閱讀本書,對理解現代計算機和現代作業系統的工作原理有非常大的幫助作用。 2.《匯編語言》(第2版),王爽著,清華大學出版社,2013-4-1 基於INTEL 8086處理器、MASM編譯器,以及DOS平台的匯編教材,完全以8086處理器的實模式為主,不涉及常用的32位和64位模式,但因為通俗易懂,讀者反映很好。 3.《80X86匯編語言程式設計教程》,楊季文等 編著,清華大學出版社,1999-3-1 基於INTEL x86處理器、MASM和TASM編譯器,包含16位實模式和32位保護模式的內容,而且對後者講述較為詳細。 4.《32位匯編語言程式設計》,錢曉捷編著,機械工業出版社,2011-8-1 基於INTEL x86處理器、MASM編譯器,以及WINDOWS平台的匯編教材。 5.《16/32位微機原理匯編語言及介面技術》,錢曉捷,陳濤編著,機械工業出版社,2005-2-1 基於INTEL x86處理器,論述16位微型計算機的基本原理、匯編語言和介面技術,並引出32位微機系統相關技術。 6.《Intel匯編語言程式設計》(第五版),(美)歐文著,電子工業出版社,2012-7-1 基於INTEL x86處理器、MASM編譯器,以及DOS/WINDOWS平台的匯編教材,既有16位實模式的內容,也有32位保護模式的內容。 7.《匯編語言的編程藝術》(第2版),(美)海德著,清華大學出版社,2011-12-1 基於INTEL x86處理器,使用了作者自製的高級語言匯編器(High Level Assembler,HLA)作為教學工具,以部分地獲得高級語言的優勢和功能。 8.《x86 PC匯編語言、設計與介面》(第五版),(美)馬茲迪,考西著,電子工業出版社,2011-1-1 基於INTEL x86處理器,既講了16位實模式的內容,也講了32位保護模式的內容,對64位也有所介紹。 ARM及單片機 1.《匯編語言程式設計--基於ARM體系結構》(第2版),文全剛等主編,北京航空航天大學出版社,2010-8-1 基於ARM體系結構的處理器,是學習嵌入式技術的入門教材。 2.《零基礎學AVR單片機》,徐益民等編著,機械工業出版社,2011-1-1 單片機概述、avr單片機的開發工具、avr單片機c語言、atmega16單片機基本結構、avr的指令系統與匯編系統等。 3.《基於Multisim10的51單片機模擬實戰教程》,聶典,丁偉主編,電子工業出版社,2010-2-1 闡述了NI Multisim 10在單片機模擬中的各項主要功能。 4.《PIC18微控制器:體系結構、編程與介面設計》,(美)貝里著,清華大學出版社,2009-4-1 微控制器廣泛套用於汽車、家電、工業控制、醫療設備等眾多領域。本書以Microchip公司的PIC18系列微控制器為例,全面講解如何使用C語言和匯編語言對微控制器進行編程。 5.《CASL匯編語言程式設計》,趙立輝編著,中國電力出版社,2002-10-1 CASL匯編語言是中國計算機軟體專業技術資格和水平考試高級程式設計師級的必考內容。本書是講述CASL匯編語言程式設計的專著。
㈣ 單片機電子鍾程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;20h.1半點標示位
;20H.2鬧鍾設置中........標示,為了顯示區別用
;20H.3鬧鍾設置時間CHECK到,使能標志位
;20H.5開/關鬧鍾設置中........標示;
;20H.6鬧鍾1開關標志位
;20H.7鬧鍾2開關標志位
;psw.5用來做顯示開關標志位
;21,22,23,24這里設置第一個鬧鍾的時間
;25,26,27,28這里設置第二個鬧鍾的時間
;29H
;P0口輸出數碼管段碼,
;P2口 輸出位選信號
;
;70H存放P1.0--3按鈕值,
;71H--78H存放當前系統定時時間;
;78H 77H 76H 75H 74H 73H 72H 71H
; 星期* 小時 分鍾 秒鍾
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ts equ 24h ;這里設置`24小時周期制
trr equ #0bbh ;這個是溫度,晶振等的時間補償值,
org 0000h ;定時太慢此值調大,定時太快調小;
jmp main
;org 0bh ;定時器0中斷入口矢量
;jmp bz
org 1bh ;定時器1中斷入口矢量
jmp t1int
org 0100h ;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main:clr p3.0; ;關繼電器
mov sp,#30h
mov r3,#20
mov tmod,#10h
;mov tl0,#06h ;定時器1,方式1,定時 50 MS;
;mov th0,#06h
mov tl1,#0b0h
mov th1,#3ch
mov ie,#88h ;開定時器1中斷
;mov 65h,#5
; mov 66h,#100
;mov 64h,#4
;clr psw.5
clr p3.0
setb pt1 ;設置T1為高優先順序中斷
;setb tr1
clr tr1 ;開啟T1中斷
acall send ;71h--78h 清零;
acall send1 ;20h--29h 清零;
dd: acall daa ;進行十進制調整71H-79H
;acall compare ;第一鬧鍾
;acall compare1 ;第二鬧鍾 設置值
;acall sound
acall disp ;數碼管顯示,78H--71H分別對應著8個數碼管顯示
acall key_scanf ;按鈕控制
acall time_adj ;時間調整
acall lasttime ;調用上一次的設置值為當前定時值
;acall alarm1_set ;設置定時開/關鬧鍾
ajmp dd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;調用上次值為設置時間
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lasttime:push acc
mov a,70h
jnb acc.2,return1
clr p3.0; 緊急暫停按鈕,按下後暫停,並把上次設定值恢復.
clr tr1
mov 73h,21h
mov 74h,22h
wait7:acall disp
acall key_scanf
mov a,70h
jnb acc.0,wait7
mov 71h,#0
mov 72h,#0
mov 79h,#0
mov tl1,trr
mov th1,#3ch
mov r3,#20
setb tr1
setb p3.0
return1:pop acc
ret
daa: push acc ;對當前系統時間進行十進制調整
mov 71h,79h
mov r1,#71h
cjne @r1,#10,s2
mov 71h,#0h
mov 79h,#0
inc 72h
mov r1,#72h
cjne @r1,#6,s2
mov 72h,#0h
dec 73h
mov r1,#73h
cjne @r1,#255,s2
dec 74h
mov 73h,#9
s1: pop acc
ret
s2: mov r1,#73h
cjne @r1,#0,s1
mov r1,#74h
cjne @r1,#0,s1
clr p3.0
clr tr1
sjmp s1
h_half: ;半點CHECK
mov r1,#73h
mov a,74h
swap a
xchd a,@r1
cjne a,#29h,o25 ;CHECK 當前時間是否為29分鍾
xchd a,@r1
mov r1,#71h
mov a,72h
swap a
xchd a,@r1
cjne a,#59h,o25 ;CHECK 當前時間為59秒?
setb tr0 ;啟動T0
setb 20h.1 ;enable 半點flag bit
o25: xchd a,@r1
ret
compare: ;鬧鍾1設置時間與當前時間比較
push acc
jnb 20h.6,nequ ;鬧鍾1開/關標志位
mov a,73h
cjne a,21h,nequ ;分低位
mov a,74h
cjne a,22h,nequ ;分高位
mov a,75h
cjne a,23h,nequ ;小時低位
mov a,76h
cjne a,24h,nequ ;小時高位
setb 20h.3 ;到鬧鍾設置時間,使能鬧鍾報警標志位
nequ:pop acc
ret
compare1: ;鬧鍾2設置時間與當前時間比較
push acc
jnb 20h.7,nequ33 ;鬧鍾2開/關標志位
mov a,73h
cjne a,25h,nequ33
mov a,74h
cjne a,26h,nequ33
mov a,75h
cjne a,27h,nequ33
mov a,76h
cjne a,28h,nequ33
setb 20h.3 ;到鬧鍾設置時間,使能鬧鍾報警標志位
nequ33:
pop acc
ret
sound:
acall h_half ;check 是否半點?
jb 20h.1,s23 ;半點則返回
jb 20h.0,s23
mov r1,#73h
mov a,74h
swap a
xchd a,@r1
cjne a,#59h,s25
xchd a,@r1
mov r1,#71h
mov a,72h
swap a
xchd a,@r1
s20: cjne a,#56h,s21
ajmp s26
s21: cjne a,#58h,s22
ajmp s26
s22: cjne a,#59h,s25
setb tr0
ajmp s26
s25: xchd a,@r1
s23: ret
s26: jb 20h.0,s25
setb tr0
xchd a,@r1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中斷服務程序,報時鈴音信號輸出
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
bz: djnz 64h,rrr
jb 20h.3,alarmsign;鬧鍾到點報時有效
jb 20h.1,next ;半點報時
mov 64h,#4 ;0.5KHZ
ajmp justh
alarmsign:
mov 64h,#1; 2KHZ信號
justh:
djnz 66h,ccc
mov 66h,#100
djnz 65h,ccc ;產生1000次中斷後關中斷
mov 65h,#5 ;響0.5秒
setb 20h.0
clr tr0
reti
next:mov 64h,#2 ;1KHZ信號,半點報時音
ccc: jb 20h.3,cc
cpl p1.4 ;半點報時輸出聲音信號
rrr: reti
cc: cpl p1.4 ;鬧鍾報時輸出聲音信號
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T1中斷服務程序,定時器主時鍾;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
t1int:
clr ea
mov tl1,trr
mov th1,#3ch
djnz r3,sd ;20*50MS=1S
mov r3,#20
;cpl p1.4
inc 79h
clr 20h.0
clr 20h.1 ;半點報時標志清零
jb 20h.3,sdd ;鬧鍾CHECK有效與否?
clr tr0 ;關T0
sd: setb ea
reti
sdd: setb tr0 ;開T0,即開鬧鈴聲音
setb ea
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;顯示子函數
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dispnum1:; 顯示
ajmp disp_num
disp:
push acc
;jb 20h.5,dispnum1;開/關鬧鍾設置中界面...........
;jb 20h.2,alarmcheck;鬧鍾設置時間中界面..........
jb psw.5,closedisp
mov r2,#01h;位選通信號輸出到P2口
mov r5,#2; 顯示的位數循環控制
mov r0,#73h;分別取出內存76H-71H
cjne r3,#10,dot1;在小時和分之間閃爍DOT point
dot1:jnc dsp1
orl 73h,#10h
;dot1:cjne r3,#11,dsp1
;anl 73h,#0efh
dsp1:mov a,r2
;cpl a
mov p2,a
mov a,@r0
dsp2:mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
mov a,r2
rl a
mov r2,a
inc r0
djnz r5,dsp1
anl 73h,#0efh
pop acc
ret
closedisp:; 關顯示
acall delay
mov p0,#0ffh
mov p2,#0
pop acc
ret
;;;;;;;;;;;;;;;;;鬧鍾的定時設置顯示
alarmcheck:
mov r2,#01h
mov r5,#2 ;兩位顯示22-21H對應定時設置值
mov r0,#21h
dsp21:
mov a,r2
;cpl a
mov p2,a
mov a,@r0
mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
mov a,r2
rl a
mov r2,a
inc r0
djnz r5,dsp21
pop acc
ret
bcd:; 共陽接法數碼管段碼表
db 0c0h,0f9h,0a4h,0b0h
db 99h,92h,82h,0f8h
db 80h,90h,88h,83h
db 0c6h,0a1h,86h,8eh; 不帶小數點七段
db 40h,79h,24h,30h,19h
db 12h,02h,78h,00h,10h
db 0ffh,0bfh,7fh,3fh; 帶小數點七段
delay:mov r6,#4h
tm: mov r4,#0h
ee: djnz r4,ee; 延時2048US=2MS
djnz r6,tm
ret
send:mov r7,#9; 初始化設置
mov r0,#71h
mov a,#0h
ss: mov @r0,a
inc r0
djnz r7,ss
mov 78h,#1h
mov 77h,#01ah
;mov 71h,#1
;mov 72h,#2
;mov 73h,#3
;mov 74h,#4
ret
send1:; 初始化
mov r7,#10
mov r0,#20h
mov a,#0
ss1: mov @r0,a
inc r0
djnz r7,ss1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;開/關鬧鍾界面顯示
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
disp_num:
mov p2,#0f7h
mov a,29h ;當前要操作的鬧鍾號碼
mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
pop acc
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
key_scanf:; 按鈕處理
push acc
mov 70h,#0
orl p1,#0fh
mov a,p1
cpl a
anl a,#07h
jz nokey1
acall daa
acall disp
mov a,p1
cpl a
anl a,#07h
jz nokey1
mov 70h,a
key_wait:; 等按鈕放下
acall daa
acall disp
mov a,p1
cpl a
anl a,#07h
jnz key_wait
mov a,70h
jnb acc.1,nokey1
cpl psw.5
nokey1:; 無按鈕
pop acc
ret
a_on_off:
jnb 29h.0,iii
cpl 20h.6
iii: jnb 29h.1,out_2
cpl 20h.7
out_2:
ajmp alarmnum
alarmnum:
setb 20h.5
acall daa
acall disp
acall key_scanf
clr 20h.5
mov a,70h
jb acc.0,a_on_off
jb acc.1,alar_adj_1
jb acc.2,a_num_inc
acall numb
ajmp alarmnum
alarm1_set:
push acc
mov a,70h
jb acc.1,alarmnum
alarm1_out:
clr 20h.2
pop acc
ret
a_num_inc:
inc 29h
mov a,29h
anl a,#0fh
cjne a,#3,alarmnum
anl 29h,#0
ajmp alarmnum
alar_adj_1:
setb 20h.2
acall daa
orl 21h,#10h
acall disp
anl 21h,#0fh
acall key_scanf
mov a,70h
jb acc.1,hadj_1
jb acc.2,minc_1
ajmp alar_adj_1
madj_2:
acall daa
orl 25h,#10h
acall disp
anl 25h,#0fh
acall key_scanf
mov a,70h
jb acc.1,hadj_2
jb acc.2,minc_2
ajmp madj_2
hadj_1:
acall daa
orl 23h,#10h
acall disp
anl 23h,#0fh
acall key_scanf
mov a,70h
jb acc.1,madj_2
jb acc.2,hinc_1
ajmp hadj_1
hadj_2:acall daa
orl 27h,#10h
acall disp
anl 27h,#0fh
acall key_scanf
mov a,70h
jb acc.1,alarm1_out
jb acc.2,hinc_2
ajmp hadj_2
minc_1:
inc 21h
mov r1,#21h
cjne @r1,#10,alar_adj_1
mov 21h,#0
inc 22h
mov r1,#22h
cjne @r1,#6,alar_adj_1
mov 22h,#0h
ajmp alar_adj_1
minc_2:
inc 25h
mov r1,#25h
cjne @r1,#10,madj_2
mov 25h,#0
inc 26h
mov r1,#26h
cjne @r1,#6,madj_2
mov 26h,#0
ajmp madj_2
hinc_1:
inc 23h
mov r1,#23h
cjne @r1,#10,ss14
mov 23h,#0
inc 24h
ss14:
mov a,24h
swap a
xchd a,@r1
cjne a,#ts,ss15
mov 23h,#0
mov 24h,#0
ajmp hadj_1
ss15:xchd a,@r1
ajmp hadj_1
hinc_2:
inc 27h
mov r1,#27h
cjne @r1,#10,sss14
mov 27h,#0
inc 28h
sss14:
mov a,28h
swap a
xchd a, @r1
cjne a,#ts,sss15
mov 27h,#0
mov 28h,#0
ajmp hadj_2
sss15:
xchd a,@r1
ajmp hadj_2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;時間調整程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
time_adj:;
clr psw.5
push acc
mov a,70h
jb acc.0,l1;P1.0調時功能鍵,每按一次切換一位
ajmp nokeyout
adj_out:
mov 21h,73h
mov 22h,74h
setb p3.0 ;閉合繼電器
setb tr1
nokeyout:
pop acc
ret
QQ: anl 73h,#0fh
anl 74h,#0fh
;anl 78h,#0fh
ret
l1: clr tr1;acall dab; 分鍾調整
orl 73h,#10h;點亮分右下角的小數點,當前調整位置
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,h_adj;切換到小時調整
jb acc.1,m_inc;P1.2加1按鈕
ajmp l1
h_adj:; 小時調整
;acall dab
orl 74h,#10h
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,out_adj;切換到星期調整
jb acc.1,h_inc;小時加1
ajmp h_adj
w_adj:
acall daa
orl 78h,#10h
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,out_adj
jb acc.2,w_inc
ajmp w_adj
out_adj:
ajmp adj_out
m_inc:;;;;;;;;;;;;;;; 調整分時,對定時復位,初始化
clr tr1
mov 71h,#0
mov 72h,#0
mov 79h,#0
mov tl1,trr
mov th1,#3ch
mov r3,#20
inc 73h
mov r1,#73h
cjne @r1,#10,s12
mov 73h,#0
inc 74h
mov r1,#74h
cjne @r1,#10,s12
mov 74h,#0
s12: ajmp l1
;;;;;;;;;;;;;;;;;;;;;;調整小時位
h_inc:
inc 74h
mov r1,#74h
cjne @r1,#10,s14
mov 74h,#0
;inc 76h
s14: ajmp h_adj
;mov a,76h
;swap a
;xchd a,@r1
;cjne a,#ts,s15;;;12進制,24進制設置值決定
;mov 75h,#0
;mov 76h,#0
;ajmp h_adj
;s15: ;xchd a,@r1
;ajmp h_adj
;;;;;;;;;;;;;;;;;;;;;;;調整星期位
w_inc:
inc 78h
mov r1,#78h
cjne @r1,#8,s16
mov 78h,#1h
s16: ajmp w_adj
;;;;;;;;;;;;;;;;;;;;;;;當前鬧鍾開/關情況報告位
numb:clr 29h.4
jnb 29h.0,iii1
jnb 20h.6,iii1
setb 29h.4
iii1:jnb 29h.1,out_21
jnb 20h.7,out_21
setb 29h.4
out_21:
jnb 20h.6,out_12
jnb 20h.7,out_13
mov 77h,#1dh
ajmp out_22
out_12:
jnb 20h.7,out_14
mov 77h,#1bh
ajmp out_22
out_13:
mov 77h,#1ch
ajmp out_22
out_14:
mov 77h,#1ah
out_22:
ret
end
㈤ msc-51系列單片機的定址方式有哪幾種
立即數定址、直接定址、寄存器定址、寄存器間接定址、變址定址、位定址、相對定址。
http://ke..com/link?url=4tr_CoYw8Tk4lYCYAAN695g689mn_KQUP0R4laRWk-
㈥ 求助啊:::單片機,這是啥錯誤啊AT24C_BC.H(2):error C141: syntax error near '';'
AT24C_BC.H(2):error C141: syntax error near '';'
===============================
是不是你在中文狀態下輸入了「;」?
這樣就不是注釋號,而是一個十六進制字元了
㈦ 用AT89S51(單片機)設計一個電子鍾
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;20h.1半點標示位
;20H.2鬧鍾設置中........標示,為了顯示區別用
;20H.3鬧鍾設置時間CHECK到,使能標志位
;20H.5開/關鬧鍾設置中........標示;
;20H.6鬧鍾1開關標志位
;20H.7鬧鍾2開關標志位
;psw.5用來做顯示開關標志位
;21,22,23,24這里設置第一個鬧鍾的時間
;25,26,27,28這里設置第二個鬧鍾的時間
;29H
;P0口輸出數碼管段碼,
;P2口 輸出位選信號
;
;70H存放P1.0--3按鈕值,
;71H--78H存放當前系統定時時間;
;78H 77H 76H 75H 74H 73H 72H 71H
; 星期* 小時 分鍾 秒鍾
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ts equ 24h ;這里設置`24小時周期制
trr equ #0bbh ;這個是溫度,晶振等的時間補償值,
org 0000h ;定時太慢此值調大,定時太快調小;
jmp main
;org 0bh ;定時器0中斷入口矢量
;jmp bz
org 1bh ;定時器1中斷入口矢量
jmp t1int
org 0100h ;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
main:clr p3.0; ;關繼電器
mov sp,#30h
mov r3,#20
mov tmod,#10h
;mov tl0,#06h ;定時器1,方式1,定時 50 MS;
;mov th0,#06h
mov tl1,#0b0h
mov th1,#3ch
mov ie,#88h ;開定時器1中斷
;mov 65h,#5
; mov 66h,#100
;mov 64h,#4
;clr psw.5
clr p3.0
setb pt1 ;設置T1為高優先順序中斷
;setb tr1
clr tr1 ;開啟T1中斷
acall send ;71h--78h 清零;
acall send1 ;20h--29h 清零;
dd: acall daa ;進行十進制調整71H-79H
;acall compare ;第一鬧鍾
;acall compare1 ;第二鬧鍾 設置值
;acall sound
acall disp ;數碼管顯示,78H--71H分別對應著8個數碼管顯示
acall key_scanf ;按鈕控制
acall time_adj ;時間調整
acall lasttime ;調用上一次的設置值為當前定時值
;acall alarm1_set ;設置定時開/關鬧鍾
ajmp dd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;調用上次值為設置時間
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
lasttime:push acc
mov a,70h
jnb acc.2,return1
clr p3.0; 緊急暫停按鈕,按下後暫停,並把上次設定值恢復.
clr tr1
mov 73h,21h
mov 74h,22h
wait7:acall disp
acall key_scanf
mov a,70h
jnb acc.0,wait7
mov 71h,#0
mov 72h,#0
mov 79h,#0
mov tl1,trr
mov th1,#3ch
mov r3,#20
setb tr1
setb p3.0
return1:pop acc
ret
daa: push acc ;對當前系統時間進行十進制調整
mov 71h,79h
mov r1,#71h
cjne @r1,#10,s2
mov 71h,#0h
mov 79h,#0
inc 72h
mov r1,#72h
cjne @r1,#6,s2
mov 72h,#0h
dec 73h
mov r1,#73h
cjne @r1,#255,s2
dec 74h
mov 73h,#9
s1: pop acc
ret
s2: mov r1,#73h
cjne @r1,#0,s1
mov r1,#74h
cjne @r1,#0,s1
clr p3.0
clr tr1
sjmp s1
h_half: ;半點CHECK
mov r1,#73h
mov a,74h
swap a
xchd a,@r1
cjne a,#29h,o25 ;CHECK 當前時間是否為29分鍾
xchd a,@r1
mov r1,#71h
mov a,72h
swap a
xchd a,@r1
cjne a,#59h,o25 ;CHECK 當前時間為59秒?
setb tr0 ;啟動T0
setb 20h.1 ;enable 半點flag bit
o25: xchd a,@r1
ret
compare: ;鬧鍾1設置時間與當前時間比較
push acc
jnb 20h.6,nequ ;鬧鍾1開/關標志位
mov a,73h
cjne a,21h,nequ ;分低位
mov a,74h
cjne a,22h,nequ ;分高位
mov a,75h
cjne a,23h,nequ ;小時低位
mov a,76h
cjne a,24h,nequ ;小時高位
setb 20h.3 ;到鬧鍾設置時間,使能鬧鍾報警標志位
nequ:pop acc
ret
compare1: ;鬧鍾2設置時間與當前時間比較
push acc
jnb 20h.7,nequ33 ;鬧鍾2開/關標志位
mov a,73h
cjne a,25h,nequ33
mov a,74h
cjne a,26h,nequ33
mov a,75h
cjne a,27h,nequ33
mov a,76h
cjne a,28h,nequ33
setb 20h.3 ;到鬧鍾設置時間,使能鬧鍾報警標志位
nequ33:
pop acc
ret
sound:
acall h_half ;check 是否半點?
jb 20h.1,s23 ;半點則返回
jb 20h.0,s23
mov r1,#73h
mov a,74h
swap a
xchd a,@r1
cjne a,#59h,s25
xchd a,@r1
mov r1,#71h
mov a,72h
swap a
xchd a,@r1
s20: cjne a,#56h,s21
ajmp s26
s21: cjne a,#58h,s22
ajmp s26
s22: cjne a,#59h,s25
setb tr0
ajmp s26
s25: xchd a,@r1
s23: ret
s26: jb 20h.0,s25
setb tr0
xchd a,@r1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中斷服務程序,報時鈴音信號輸出
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
bz: djnz 64h,rrr
jb 20h.3,alarmsign;鬧鍾到點報時有效
jb 20h.1,next ;半點報時
mov 64h,#4 ;0.5KHZ
ajmp justh
alarmsign:
mov 64h,#1; 2KHZ信號
justh:
djnz 66h,ccc
mov 66h,#100
djnz 65h,ccc ;產生1000次中斷後關中斷
mov 65h,#5 ;響0.5秒
setb 20h.0
clr tr0
reti
next:mov 64h,#2 ;1KHZ信號,半點報時音
ccc: jb 20h.3,cc
cpl p1.4 ;半點報時輸出聲音信號
rrr: reti
cc: cpl p1.4 ;鬧鍾報時輸出聲音信號
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T1中斷服務程序,定時器主時鍾;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
t1int:
clr ea
mov tl1,trr
mov th1,#3ch
djnz r3,sd ;20*50MS=1S
mov r3,#20
;cpl p1.4
inc 79h
clr 20h.0
clr 20h.1 ;半點報時標志清零
jb 20h.3,sdd ;鬧鍾CHECK有效與否?
clr tr0 ;關T0
sd: setb ea
reti
sdd: setb tr0 ;開T0,即開鬧鈴聲音
setb ea
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;顯示子函數
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
dispnum1:; 顯示
ajmp disp_num
disp:
push acc
;jb 20h.5,dispnum1;開/關鬧鍾設置中界面...........
;jb 20h.2,alarmcheck;鬧鍾設置時間中界面..........
jb psw.5,closedisp
mov r2,#01h;位選通信號輸出到P2口
mov r5,#2; 顯示的位數循環控制
mov r0,#73h;分別取出內存76H-71H
cjne r3,#10,dot1;在小時和分之間閃爍DOT point
dot1:jnc dsp1
orl 73h,#10h
;dot1:cjne r3,#11,dsp1
;anl 73h,#0efh
dsp1:mov a,r2
;cpl a
mov p2,a
mov a,@r0
dsp2:mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
mov a,r2
rl a
mov r2,a
inc r0
djnz r5,dsp1
anl 73h,#0efh
pop acc
ret
closedisp:; 關顯示
acall delay
mov p0,#0ffh
mov p2,#0
pop acc
ret
;;;;;;;;;;;;;;;;;鬧鍾的定時設置顯示
alarmcheck:
mov r2,#01h
mov r5,#2 ;兩位顯示22-21H對應定時設置值
mov r0,#21h
dsp21:
mov a,r2
;cpl a
mov p2,a
mov a,@r0
mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
mov a,r2
rl a
mov r2,a
inc r0
djnz r5,dsp21
pop acc
ret
bcd:; 共陽接法數碼管段碼表
db 0c0h,0f9h,0a4h,0b0h
db 99h,92h,82h,0f8h
db 80h,90h,88h,83h
db 0c6h,0a1h,86h,8eh; 不帶小數點七段
db 40h,79h,24h,30h,19h
db 12h,02h,78h,00h,10h
db 0ffh,0bfh,7fh,3fh; 帶小數點七段
delay:mov r6,#4h
tm: mov r4,#0h
ee: djnz r4,ee; 延時2048US=2MS
djnz r6,tm
ret
send:mov r7,#9; 初始化設置
mov r0,#71h
mov a,#0h
ss: mov @r0,a
inc r0
djnz r7,ss
mov 78h,#1h
mov 77h,#01ah
;mov 71h,#1
;mov 72h,#2
;mov 73h,#3
;mov 74h,#4
ret
send1:; 初始化
mov r7,#10
mov r0,#20h
mov a,#0
ss1: mov @r0,a
inc r0
djnz r7,ss1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;開/關鬧鍾界面顯示
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
disp_num:
mov p2,#0f7h
mov a,29h ;當前要操作的鬧鍾號碼
mov dptr,#bcd
movc a,@a+dptr
mov p0,a
acall delay
pop acc
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
key_scanf:; 按鈕處理
push acc
mov 70h,#0
orl p1,#0fh
mov a,p1
cpl a
anl a,#07h
jz nokey1
acall daa
acall disp
mov a,p1
cpl a
anl a,#07h
jz nokey1
mov 70h,a
key_wait:; 等按鈕放下
acall daa
acall disp
mov a,p1
cpl a
anl a,#07h
jnz key_wait
mov a,70h
jnb acc.1,nokey1
cpl psw.5
nokey1:; 無按鈕
pop acc
ret
a_on_off:
jnb 29h.0,iii
cpl 20h.6
iii: jnb 29h.1,out_2
cpl 20h.7
out_2:
ajmp alarmnum
alarmnum:
setb 20h.5
acall daa
acall disp
acall key_scanf
clr 20h.5
mov a,70h
jb acc.0,a_on_off
jb acc.1,alar_adj_1
jb acc.2,a_num_inc
acall numb
ajmp alarmnum
alarm1_set:
push acc
mov a,70h
jb acc.1,alarmnum
alarm1_out:
clr 20h.2
pop acc
ret
a_num_inc:
inc 29h
mov a,29h
anl a,#0fh
cjne a,#3,alarmnum
anl 29h,#0
ajmp alarmnum
alar_adj_1:
setb 20h.2
acall daa
orl 21h,#10h
acall disp
anl 21h,#0fh
acall key_scanf
mov a,70h
jb acc.1,hadj_1
jb acc.2,minc_1
ajmp alar_adj_1
madj_2:
acall daa
orl 25h,#10h
acall disp
anl 25h,#0fh
acall key_scanf
mov a,70h
jb acc.1,hadj_2
jb acc.2,minc_2
ajmp madj_2
hadj_1:
acall daa
orl 23h,#10h
acall disp
anl 23h,#0fh
acall key_scanf
mov a,70h
jb acc.1,madj_2
jb acc.2,hinc_1
ajmp hadj_1
hadj_2:acall daa
orl 27h,#10h
acall disp
anl 27h,#0fh
acall key_scanf
mov a,70h
jb acc.1,alarm1_out
jb acc.2,hinc_2
ajmp hadj_2
minc_1:
inc 21h
mov r1,#21h
cjne @r1,#10,alar_adj_1
mov 21h,#0
inc 22h
mov r1,#22h
cjne @r1,#6,alar_adj_1
mov 22h,#0h
ajmp alar_adj_1
minc_2:
inc 25h
mov r1,#25h
cjne @r1,#10,madj_2
mov 25h,#0
inc 26h
mov r1,#26h
cjne @r1,#6,madj_2
mov 26h,#0
ajmp madj_2
hinc_1:
inc 23h
mov r1,#23h
cjne @r1,#10,ss14
mov 23h,#0
inc 24h
ss14:
mov a,24h
swap a
xchd a,@r1
cjne a,#ts,ss15
mov 23h,#0
mov 24h,#0
ajmp hadj_1
ss15:xchd a,@r1
ajmp hadj_1
hinc_2:
inc 27h
mov r1,#27h
cjne @r1,#10,sss14
mov 27h,#0
inc 28h
sss14:
mov a,28h
swap a
xchd a, @r1
cjne a,#ts,sss15
mov 27h,#0
mov 28h,#0
ajmp hadj_2
sss15:
xchd a,@r1
ajmp hadj_2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;時間調整程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
time_adj:;
clr psw.5
push acc
mov a,70h
jb acc.0,l1;P1.0調時功能鍵,每按一次切換一位
ajmp nokeyout
adj_out:
mov 21h,73h
mov 22h,74h
setb p3.0 ;閉合繼電器
setb tr1
nokeyout:
pop acc
ret
QQ: anl 73h,#0fh
anl 74h,#0fh
;anl 78h,#0fh
ret
l1: clr tr1;acall dab; 分鍾調整
orl 73h,#10h;點亮分右下角的小數點,當前調整位置
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,h_adj;切換到小時調整
jb acc.1,m_inc;P1.2加1按鈕
ajmp l1
h_adj:; 小時調整
;acall dab
orl 74h,#10h
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,out_adj;切換到星期調整
jb acc.1,h_inc;小時加1
ajmp h_adj
w_adj:
acall daa
orl 78h,#10h
acall disp
acall QQ
acall key_scanf
clr psw.5
mov a,70h
jb acc.0,out_adj
jb acc.2,w_inc
ajmp w_adj
out_adj:
ajmp adj_out
m_inc:;;;;;;;;;;;;;;; 調整分時,對定時復位,初始化
clr tr1
mov 71h,#0
mov 72h,#0
mov 79h,#0
mov tl1,trr
mov th1,#3ch
mov r3,#20
inc 73h
mov r1,#73h
cjne @r1,#10,s12
mov 73h,#0
inc 74h
mov r1,#74h
cjne @r1,#10,s12
mov 74h,#0
s12: ajmp l1
;;;;;;;;;;;;;;;;;;;;;;調整小時位
h_inc:
inc 74h
mov r1,#74h
cjne @r1,#10,s14
mov 74h,#0
;inc 76h
s14: ajmp h_adj
;mov a,76h
;swap a
;xchd a,@r1
;cjne a,#ts,s15;;;12進制,24進制設置值決定
;mov 75h,#0
;mov 76h,#0
;ajmp h_adj
;s15: ;xchd a,@r1
;ajmp h_adj
;;;;;;;;;;;;;;;;;;;;;;;調整星期位
w_inc:
inc 78h
mov r1,#78h
cjne @r1,#8,s16
mov 78h,#1h
s16: ajmp w_adj
;;;;;;;;;;;;;;;;;;;;;;;當前鬧鍾開/關情況報告位
numb:clr 29h.4
jnb 29h.0,iii1
jnb 20h.6,iii1
setb 29h.4
iii1:jnb 29h.1,out_21
jnb 20h.7,out_21
setb 29h.4
out_21:
jnb 20h.6,out_12
jnb 20h.7,out_13
mov 77h,#1dh
ajmp out_22
out_12:
jnb 20h.7,out_14
mov 77h,#1bh
ajmp out_22
out_13:
mov 77h,#1ch
ajmp out_22
out_14:
mov 77h,#1ah
out_22:
ret
end