匯編語言實現(xiàn)電子鬧鐘思路詳解
2.1 設(shè)計思路
首先使用8255、8254、8259 三個芯片實現(xiàn)電子時鐘的功能,讓鬧鐘可以正常走時;其次,在時鐘的基礎(chǔ)上添加鬧鈴功能、整點報時功能、設(shè)置當(dāng)前時間功能;完成設(shè)計。
2.2 設(shè)計方案
1. 電子時鐘部分:此次設(shè)計是通過對計數(shù)器8254設(shè)定計數(shù)值對脈沖進(jìn)行計數(shù),在程序里,8254工作于計數(shù)器0,方式3。接入的CLK為1MHz,設(shè)計數(shù)初值為10000,每100次中斷計數(shù)一次,產(chǎn)生的記數(shù)時間正好是時鐘每秒走過的時間。通過對中斷控制器8259設(shè)置初始化命令字初值來控制中斷。程序中通過移位指令來實現(xiàn)時、秒、分的個位和十位的獨(dú)自存儲,將分、秒的個位十位分別存入指定的寄存器中。比較轉(zhuǎn)移指令來完成秒和分的累加。七段數(shù)碼管由8255并行接口的A口進(jìn)行位的選擇,通過B口輸出要顯示的段碼。這樣就在6個七段數(shù)碼管上分別顯示時、分和秒。當(dāng)1S時間到時,修改當(dāng)前數(shù)碼管數(shù)值,10秒時將秒的低位清零,高位加1,分和時亦是如此;到達(dá)60秒時,將秒清零,分加1,到達(dá)60分時,將分清零,小時加1,到達(dá)24小時則全部清零。
2. 鬧鐘響鈴部分:對于鬧鐘部分,我們首先要完成數(shù)碼管顯示單元按鍵的連接和設(shè)計,讓16個按鍵分別為0-F;再利用實驗平臺的單次脈沖輸入KK1產(chǎn)生一次中斷,這樣就可以設(shè)置時間了。將設(shè)置好的時間儲存起來,時刻與當(dāng)前的時間進(jìn)行比較,當(dāng)時間一樣時,計數(shù)器1工作,蜂鳴器蜂鳴,播放音樂,這就完成了鬧鐘響鈴功能。
3. 整點報時部分:整點報時,就是在整時的時候響一次鈴,當(dāng)時鐘整點時,無論是幾點,時鐘的分和秒部分都為零,所以,只要讓時鐘的分和秒部分與零進(jìn)行比較,當(dāng)他們都相等時,就代表到達(dá)整點了,可以響鈴了。整點報時就完成了,本鬧鐘設(shè)置的整點報時時長為5秒。
4. 設(shè)置當(dāng)前時間:本部分也用到了數(shù)碼管顯示單元的按鍵部分,只要利用之前的設(shè)計就好了,這次使用單次脈沖輸入的KK2產(chǎn)生中斷設(shè)置時間,再將設(shè)置的時間存儲在時間變量中,時間就設(shè)置好了。
A8254 EQU 06C0H ;宏定義 B8254 EQU 06C2H C8254 EQU 06C4H CON8254 EQU 06C6H MY8255_A EQU 0600H MY8255_B EQU 0602H MY8255_C EQU 0604H MY8255_CON EQU 0606H PUBLIC SEC,MIN,HOUR DATA SEGMENT ;定義數(shù)據(jù)段 TAB DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;數(shù)碼表 DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H FREQ_LIST DW 371,495,495,495,624,556,495,556,624 ;頻率表 DW 495,495,624,742,833,833,833,742,624 DW 624,495,556,495,556,624,495,416,416,371 DW 495,833,742,624,624,495,556,495,556,833 DW 742,624,624,742,833,990,742,624,624,495 DW 556,495,556,624,495,416,416,371,495,0 TIME_LIST DB 4, 6, 2, 4, 4, 6, 2, 4, 4 ;時間表 DB 6, 2, 4, 4, 12, 1, 3, 6, 2 DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4 DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4 DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4 DB 6, 2, 4, 4, 6, 2, 4, 4, 12 SEC DB 0 ;初始化 HOUR DB 0 MIN DB 0 N_TIME DB 20 DUP(0) Z_TIME DB 20 DUP(0) N_S DB 30 N_M DB 0 N_H DB 0 TIMER DB 10 DUP(0) DUAN DB 0 BUF DB 3 DUP(0) DATA ENDS SSTACK SEGMENT STACK ;堆棧段 DW 256 DUP(?) SSTACK ENDS CODE SEGMENT ;代碼段 ASSUME CS:CODE, SS:SSTACK,DS:DATA START: ;8254初始化 MOV DX, CON8254 ;8254 MOV AL, 36H ;計數(shù)器0,方式3 OUT DX, AL ;分頻 MOV DX, A8254 MOV AL, 010H OUT DX, AL MOV AL, 27H OUT DX, AL ;8255初始化 MOV AL,81H MOV DX,MY8255_CON OUT DX,AL ;MIR7中斷 MOV AX, 0000H MOV DS, AX MOV AX, OFFSET MIR7 ;取中斷入口地址 MOV SI, 003CH ;中斷矢量地址 MOV [SI], AX ;填I(lǐng)RQ7的偏移矢量 MOV AX, SEG MIR7 ;段地址 MOV SI, 003EH MOV [SI], AX ;填I(lǐng)RQ7的段地址矢量 ;MIR6中斷 MOV AX, OFFSET MIR6 ;取中斷入口地址 MOV SI, 0038H ;中斷矢量地址 MOV [SI], AX ;填I(lǐng)RQ6的偏移矢量 MOV AX, SEG MIR6 ;段地址 MOV SI, 003AH MOV [SI], AX ;填I(lǐng)RQ6的段地址矢量 ;MIR2中斷 MOV AX, OFFSET SIR1 ;取中斷入口地址 MOV SI, 00C4H ;中斷矢量地址 MOV [SI], AX ;填SIR1的偏移矢量 MOV AX, SEG SIR1 ;段地址 MOV SI, 00C6H MOV [SI], AX ;填SIR1的段地址矢量 ;8259初始化 MOV AL, 11H OUT 20H, AL ;ICW1 MOV AL, 08H OUT 21H, AL MOV AL,04H OUT 21H,AL ;ICW2 MOV AL, 03H OUT 21H, AL ;ICW4 ;初始化從片8259 MOV AL, 11H OUT 0A0H, AL ;ICW1 MOV AL, 30H OUT 0A1H, AL ;ICW2 MOV AL, 02H OUT 0A1H, AL ;ICW3 MOV AL, 01H OUT 0A1H, AL ;ICW4 MOV AL, 0FDH OUT 0A1H,AL ;OCW1 = 1111 1101 MOV AX,SEG N_TIME ;取N_TIME的段地址 MOV DS,AX MOV SI,OFFSET N_TIME ;取N_TIME的地址偏移量 MOV [SI+1],1 STI AA1: CALL DISP ;調(diào)用顯示子程序(disp) CALL BJ ;調(diào)用鬧鐘(bj) CALL ZDBS ;調(diào)用整點報時(bj) JMP AA1 MIR6 PROC CLI PUSH AX PUSH SI MOV AX,DATA MOV DS,AX MOV SI,3000H MOV AL,00H MOV [SI],AL ;清顯示緩沖 MOV [SI+1],AL MOV [SI+2],AL MOV [SI+3],AL MOV [SI+4],AL MOV [SI+5],AL MOV DI,3005H MOV DX,MY8255_CON ;寫8255控制字 MOV AL,81H OUT DX,AL BEGIN: CALL DIS ;調(diào)用顯示子程序 CALL CLEAR ;清屏 CALL CCSCAN ;掃描 JNZ INK1 JMP BEGIN INK1: CALL DIS CALL KEYDALLY CALL KEYDALLY CALL CLEAR CALL CCSCAN MOV AX,SEG DUAN ;取DUAN的段地址 MOV DS,AX MOV SI,OFFSET DUAN ;取DUAN的地址偏移量,用于技計數(shù) MOV AL,[SI] INC AL MOV [SI],AL CMP AL,7 ;AL與6相比較 JE B2 JNZ INK2 ;有鍵按下,轉(zhuǎn)到INK2 JMP BEGIN ;======================================== ;確定按下鍵的位置 ;======================================== B2: MOV AL,0 MOV [SI],AL POP AX POP SI IRET INK2: MOV CH,0FEH MOV CL,00H COLUM: MOV AL,CH MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C IN AL,DX L1: TEST AL,01H ;is L1? JNZ L2 MOV AL,00H ;L1 JMP KCODE L2: TEST AL,02H ;is L2? JNZ L3 MOV AL,04H ;L2 JMP KCODE L3: TEST AL,04H ;is L3? JNZ L4 MOV AL,08H ;L3 JMP KCODE L4: TEST AL,08H ;is L4? JNZ NEXT MOV AL,0CH ;L4 KCODE: ADD AL,CL CALL PUTBUF PUSH AX KON: CALL DIS CALL CLEAR CALL CCSCAN JNZ KON POP AX NEXT: INC CL MOV AL,CH TEST AL,08H JZ KERR ROL AL,1 MOV CH,AL JMP COLUM KERR: JMP BEGIN ;======================================== ;鍵盤掃描子程序 ;======================================== CCSCAN: MOV AL,00H MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C IN AL,DX NOT AL AND AL,0FH RET ;======================================== ;清屏子程序 ;======================================== CLEAR: MOV DX,MY8255_B MOV AL,00H OUT DX,AL RET ;======================================== ;顯示子程序 ;======================================== DIS: PUSH AX MOV SI,3000H MOV DL,0DFH MOV AL,DL AGAIN: PUSH DX MOV DX,MY8255_A OUT DX,AL MOV AL,[SI] MOV BX,OFFSET TAB AND AX,00FFH ADD BX,AX MOV AL,[BX] MOV DX,MY8255_B OUT DX,AL CALL KEYDALLY INC SI POP DX MOV AL,DL TEST AL,01H JZ OUT1 ROR AL,1 MOV DL,AL JMP AGAIN OUT1: POP AX RET ;====== 延時子程序 ====== KEYDALLY: PUSH CX MOV CX,0006H D1: MOV AX,009FH D2: DEC AX JNZ D2 LOOP D1 POP CX RET ;======================================== ;存鍵盤值到相應(yīng)位的緩沖中 ;======================================== PUTBUF: MOV SI,DI MOV [SI],AL MOV CX,SEG DUAN ;取DUAN的段地址 MOV DS,CX MOV SI,OFFSET DUAN ;取DUAN的地址偏移量 MOV BX,[SI] MOV CX,SEG N_TIME ;取DUAN的段地址 MOV DS,CX MOV SI,OFFSET N_TIME ;取DUAN的地址偏移量 MOV [SI+BX],AL MOV DX,[SI+BX] DEC DI CMP DI,2FFFH JNZ GOBACK MOV DI,3005H GOBACK: RET MIR6 ENDP SIR1 PROC CLI PUSH AX PUSH SI MOV AX,DATA MOV DS,AX MOV SI,3000H MOV AL,00H MOV [SI],AL ;清顯示緩沖 MOV [SI+1],AL MOV [SI+2],AL MOV [SI+3],AL MOV [SI+4],AL MOV [SI+5],AL MOV DI,3005H MOV DX,MY8255_CON ;寫8255控制字 MOV AL,81H OUT DX,AL BEGIN_U: CALL DIS1 ;調(diào)用顯示子程序 CALL CLEAR1 ;清屏 CALL CCSCAN1 ;掃描 JNZ INK3 JMP BEGIN_U INK3: CALL DIS1 CALL U_DALLY CALL U_DALLY CALL CLEAR1 CALL CCSCAN1 MOV AX,SEG DUAN ;取DUAN的段地址 MOV DS,AX MOV SI,OFFSET DUAN ;取DUAN的地址偏移量 MOV AL,[SI] INC AL MOV [SI],AL CMP AL,7 ;AL與7相比較 JE B3 JNZ INK4 ;有鍵按下,轉(zhuǎn)到INK2 JMP BEGIN_U ;======================================== ;確定按下鍵的位置 ;======================================== B3: MOV AL,0 MOV [SI],AL POP AX POP SI IRET INK4: MOV CH,0FEH MOV CL,00H COLUM2: MOV AL,CH MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C IN AL,DX U1: TEST AL,01H ;is L1? JNZ U2 MOV AL,00H ;L1 JMP KCODE1 U2: TEST AL,02H ;is L2? JNZ U3 MOV AL,04H ;L2 JMP KCODE1 U3: TEST AL,04H ;is L3? JNZ U4 MOV AL,08H ;L3 JMP KCODE1 U4: TEST AL,08H ;is L4? JNZ NEXT1 MOV AL,0CH ;L4 KCODE1: ADD AL,CL CALL PUTBUF1 PUSH AX KON1: CALL DIS1 CALL CLEAR1 CALL CCSCAN1 JNZ KON1 POP AX NEXT1: INC CL MOV AL,CH TEST AL,08H JZ KERR1 ROL AL,1 MOV CH,AL JMP COLUM2 KERR1: JMP BEGIN_U ;======================================== ;鍵盤掃描子程序 ;======================================== CCSCAN1: MOV AL,00H MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C IN AL,DX NOT AL AND AL,0FH RET ;======================================== ;清屏子程序 ;======================================== CLEAR1: MOV DX,MY8255_B MOV AL,00H OUT DX,AL RET ;======================================== ;顯示子程序 ;======================================== DIS1: PUSH AX MOV SI,3000H MOV DL,0DFH MOV AL,DL AGAIN1: PUSH DX MOV DX,MY8255_A OUT DX,AL MOV AL,[SI] MOV BX,OFFSET TAB AND AX,00FFH ADD BX,AX MOV AL,[BX] MOV DX,MY8255_B OUT DX,AL CALL U_DALLY INC SI POP DX MOV AL,DL TEST AL,01H JZ OUT2 ROR AL,1 MOV DL,AL JMP AGAIN1 OUT2: POP AX RET ;====== 延時子程序 ====== U_DALLY: PUSH CX MOV CX,0006H W1: MOV AX,009FH W2: DEC AX JNZ W2 LOOP W1 POP CX RET ;======================================== ;存鍵盤值到相應(yīng)位的緩沖中 ;======================================== PUTBUF1: MOV SI,DI MOV [SI],AL MOV CX,SEG DUAN ;取DUAN的段地址 MOV DS,CX MOV SI,OFFSET DUAN ;取DUAN的地址偏移量 MOV BX,[SI] MOV CX,SEG TIMER ;取DUAN的段地址 MOV DS,CX MOV SI,OFFSET TIMER ;取DUAN的地址偏移量 MOV [SI+BX],AL MOV DX,[SI+BX] DEC DI CMP DI,2FFFH JNZ GOBACK1 MOV DI,3005H GOBACK1: RET SIR1 ENDP MIR7 PROC STI ;置中斷標(biāo)志位IF PUSH AX ;壓棧 PUSH SI MOV AX,SEG TIMER ;取TIMER的段地址 MOV DS,AX MOV SI,OFFSET TIMER ;取TIMER的地址偏移量 MOV AL,[SI] INC AL MOV [SI],AL CMP AL,100 ;AL與100相比較 JNE TRNED ;若相等,則跳轉(zhuǎn) MOV AL,0 ;不等則向下執(zhí)行 MOV [SI],AL MOV AL,[SI+1] ADD AL,1 DAA ;十進(jìn)制調(diào)整,用于加法 MOV [SI+1],AL CMP AL,60H JNE TRNED MOV AL,0 MOV [SI+1],AL MOV AL,[SI+2] ADD AL,1 DAA MOV [SI+2],AL CMP AL,60H JNE TRNED MOV AL,0 MOV [SI+2],AL MOV AL,[SI+3] ADD AL,1 DAA MOV [SI+3],AL CMP AL,24H JNE TRNED MOV AL,0 MOV [SI+3],AL TRNED: MOV AL,[SI+1] MOV SEC,AL MOV AL,[SI+2] MOV MIN,AL MOV AL,[SI+3] MOV HOUR,AL POP SI ;出棧 POP AX STI ;置中斷標(biāo)志位IF IRET ;中斷返回 ENDP DISP: PUSH BX PUSH DI PUSH AX PUSH SI MOV DX,MY8255_B MOV AX,SEG TAB MOV DS,AX MOV BX,OFFSET TAB MOV AL,SEC AND AL,0FH ;與低四位相與 MOV AH,00H MOV SI,AX MOV AL,[BX+SI] OUT DX,AL MOV DX,MY8255_A MOV AL,0DFH OUT DX,AL CALL DALLY MOV AL,SEC AND AL,0F0H ror al,04 MOV AH,00H MOV SI,AX MOV AL,[BX+SI] MOV DX,MY8255_B OUT DX,AL MOV DX,MY8255_A MOV AL,0EFH OUT DX,AL CALL DALLY MOV AL,MIN AND AL,0FH MOV AH,00H MOV SI,AX MOV AL,[BX+SI] MOV DX,MY8255_B OUT DX,AL MOV DX,MY8255_A MOV AL,0F7H OUT DX,AL CALL DALLY MOV AL,MIN AND AL,0F0H ror al,04 MOV AH,00H MOV SI,AX MOV AL,[BX+SI] MOV DX,MY8255_B OUT DX,AL MOV DX,MY8255_A MOV AL,0FBH OUT DX,AL CALL DALLY MOV AL,HOUR AND AL,0FH MOV AH,00H MOV SI,AX MOV AL,[BX+SI] MOV DX,MY8255_B OUT DX,AL MOV DX,MY8255_A MOV AL,0FDH OUT DX,AL CALL DALLY MOV AL,HOUR AND AL,0F0H ror al,04 MOV AH,00H MOV SI,AX MOV AL,[BX+SI] MOV DX,MY8255_B OUT DX,AL MOV DX,MY8255_A MOV AL,0FEH OUT DX,AL CALL DALLY POP SI POP AX POP DI POP BX RET ZDBS PROC ;整點報時 MOV AL,MIN CMP AL,00H JNZ LP2 MOV AL,SEC CMP AL,00H JNZ LP2 MOV DX, CON8254 ;8254 MOV AL, 76H ;計數(shù)器1,方式3 OUT DX, AL ZD1: MOV DX, B8254 MOV AL, 00H OUT DX, AL MOV AL, 09H OUT DX, AL MOV AL,SEC CMP AL,05H JE OUTZD CALL DISP JMP ZD1 OUTZD: MOV AX,00H OUT DX,AL MOV AL,AH OUT DX,AL RET LP2: RET ZDBS ENDP BJ PROC ;鬧鈴程序 MOV AL,HOUR MOV CX,SEG N_TIME ;取DUAN的段地址 MOV DS,CX MOV SI,OFFSET N_TIME ;取DUAN的地址偏移量 MOV BL,[SI+1] ROL BL,04 MOV AL,0 MOV AL,[SI+2] OR BL,AL CMP AL,BL JNZ LP MOV CX,SEG N_TIME ;取DUAN的段地址 MOV DS,CX MOV SI,OFFSET N_TIME ;取DUAN的地址偏移量 MOV BL,[SI+3] ROL BL,04 MOV AL,0 MOV AL,[SI+4] OR BL,AL MOV AL,MIN CMP AL,BL JNZ LP MOV CX,SEG N_TIME ;取DUAN的段地址 MOV DS,CX MOV SI,OFFSET N_TIME ;取DUAN的地址偏移量 MOV BL,[SI+5] ROL BL,04 MOV AL,0 MOV AL,[SI+6] OR BL,AL MOV AL,SEC CMP AL,BL JNZ LP MOV DX, CON8254 ;8254 MOV AL, 76H ;計數(shù)器1,方式3 OUT DX, AL BEGIN_M: MOV BX,OFFSET FREQ_LIST MOV DI,OFFSET TIME_LIST ;裝入時間表起始地址 PLAY: MOV DX,0FH ;輸入時鐘為1MHz,1M = 0F4240H MOV AX,4240H DIV WORD PTR [BX] ;取出頻率值計算計數(shù)初值,0F4240H / 輸出頻率 MOV DX,B8254 OUT DX,AL ;裝入計數(shù)初值 MOV AL,AH OUT DX,AL MOV DL,[DI] ;取出演奏相對時間,調(diào)用延時子程序 CALL DALLY2 ADD BX,2 INC DI CMP WORD PTR [BX],0 ;判斷是否到曲末? JE OUTPLAY CALL DISP JMP PLAY OUTPLAY:MOV DX,B8254 MOV AX,00H OUT DX,AL MOV AL,AH OUT DX,AL RET LP: RET DALLY2 PROC ;延時子程序 H0: MOV CX,0010H H1: MOV AX,0FF0H H2: DEC AX JNZ H2 LOOP H1 DEC DL JNZ H0 RET DALLY2 ENDP BJ ENDP DALLY: PUSH CX MOV CX,0006H T1: MOV AX,009FH T2: DEC AX JNZ T2 LOOP T1 POP CX RET CODE ENDS
總結(jié)
以上所述是小編給大家介紹的匯編語言實現(xiàn)電子鬧鐘思路詳解,希望對大家有所幫助!
相關(guān)文章
UEFI開發(fā)實戰(zhàn)用戶交互界面基礎(chǔ)說明
這篇文章主要為大家介紹了UEFI開發(fā)實戰(zhàn)用戶交互界面的基礎(chǔ)說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06匯編語言功能實現(xiàn)數(shù)據(jù)復(fù)制實例詳解
這篇文章主要為大家介紹了匯編語言功能實現(xiàn)數(shù)據(jù)復(fù)制的實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11