微机接口-电子时钟课程设计网络整理.doc
《微机原理与接口技术》 课程设计 课题:电子时钟的设计与实现 完成时间:2004 年 9 月 12 日 实验代码 硬件连线: 8254 硬件连线: 片选 CS——300H A0——A2 A1——A3 T0:GATE0——+5V CLK0——47KHZ OUT0——IR0 T1:GATE1——PC0 CLK1——OUT2 OUT1——蜂鸣器 8255 硬件连线: CS_1——CS1 CS_2——CS2 CS_3——CS3 CS_4——CS4 PC0——GATE1 8259 硬件连线: CS2——3A0H INT2——INTR SP/2——+5V INT_A——INTA IRQ0——8254 的 OUT0 74 系列模块硬件连线: Q_0——Q0 Q_1——Q1 Q_2——Q2 Q_3——Q3 P_0——P0 P_1——P1 P_2——P2 CS1——340H CS2——360H 程序代码段: .486p data segment at 0 use16 ORG 1000h HOUR db ? MINUTE db ? SECOND db ? STOP db ? COUNT DB 0 HHOUR DB ? MMINUTE DB ? SSECOND DB ? data ends code segment use16 assume cs:code,ds:data org 1500h BEG: jmp start TAB1 db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh,8c h,0c1h,91h,7fh,0ffh TAB2 db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh KEYCOD db 0eeh,0deh,0beh,0edh,0ddh,0bdh,0ebh,0dbh,0bbh,0e7h,0d7h,0b7h KEYVAL db 0,1,2,3,4,5,6,7,8,9,0ah,0bh start: mov eax,60000000h mov cr0,eax mov ax,code mov ds,ax CLI MOV BYTE PTR HOUR ,23 MOV BYTE PTR MINUTE,59 MOV BYTE PTR SECOND,50 MOV BYTE PTR STOP,0 ;8255 初始化 MOV EAX,0A0A0A0AH MOV DX,208H OUT DX,EAX ;8254 初始化 MOV DX,30CH MOV AL,34H ;计数器 0,16 位,方式 2,2 进制 OUT DX,AL MOV DX,300H MOV AX,1175 ;计数器 0 初值为 25ms*47KHZ OUT DX,AL MOV AL,AH OUT DX,AL MOV DX,30CH MOV AL,54H ;计数器 1,8 位,方式 2,2 进制 OUT DX,AL MOV DX,304H MOV AX,40 ;计数器 1 初值为 40,25ms*40=1s OUT DX,AL ;8259 初始化 偶地址:3A0H 奇地址:3A8H MOV DX,3A0H ;写 ICW1,写入偶地址 MOV AL,13H OUT DX,AL MOV DX,3A8H ;写 ICW2,写入奇地址 MOV AL,08H ;IR0 的中断类型号为 08H OUT DX,AL MOV DX,3A8H ;写 ICW4,写入奇地址 MOV AL,05H ;主片,8259 工作在 80X86 中 OUT DX,AL ;设置 8259 中断向量 MOV AX,OFFSET INTER MOV BX,20H ;08H*4 MOV [BX],AX MOV AX,SEG INTER MOV [BX+2],AX ;开放 IRQ0 MOV DX,3A8H MOV AL,11111110B ;开放 IRQ0 OUT DX,AL ;判断 G 键 或 S 键是否按下 G: STI NOP CALL INPUT CALL DELAY CMP AL,0D7H ;判断 G 键是否按下,若按下同时设置闹铃时间 JNZ S NOT STOP CALL INPUT CALL DELAY CALL ALARM ;设定闹铃子程序 JMP G S: CMP AL,0B7H JNZ G MOV STOP,0FFH ;设置时间 ;设置小时 MOV CX,2 JMP H1 H2: CMP AL,[SI] JZ H3 INC SI INC DI LOOP H2 POP CX JMP H1 H3: POP CX MOV AL,[DI] ;AL 中内容为 所按键的键面值 CMP CX,2 JNZ H4;CX=2 设置十位,否则设置个位 CMP AL,2 JA H1 PUSH AX PUSH BX MOV DX,208H IN AL,DX MOV BL,AL AND BL,0FCH AND AL,03H NOT AL AND AL,BL ADD AL,01H OUT DX,AL POP BX POP AX MOV AH,AL LEA BX,TAB1 ;查找七段代码值 XLAT MOV DX,200H ;送数码管时的十位 OUT DX,AL MOV DL,AH MOV AL,10 MUL DL MOV HOUR,AL CALL DELAY JMP H6 H1: PUSH CX CALL INPUT CALL DELAY LEA SI,KEYCOD LEA DI,KEYVAL MOV CX,12 JMP H2 H4: CALL DELAY PUSH AX PUSH BX MOV DX,208H IN AL,DX MOV BL,AL AND BL,0F3H AND AL,0CH NOT AL AND AL,BL ADD AL,04H OUT DX,AL POP BX POP AX CMP DL,2 JNZ H5 CMP AL,4 JA H1 H5: MOV AH,AL LEA BX,TAB1 XLAT MOV DX,204H ;送数码管时的个位 OUT DX,AL ADD HOUR,AH CALL DELAY H6: LOOP H1 ;设置分钟 MOV CX,2 JMP M1 M2: CMP AL,[SI] JZ M3 INC SI INC DI LOOP M2 POP CX JMP M1 M3: POP CX MOV AL,[DI] ;AL 中内容为 所按键的键面值 CMP CX,2 JNZ M4 ;CX=2 设置十位,否则设置个位 CMP AL,5 JA M1 PUSH AX PUSH BX MOV DX,209H IN AL,DX MOV BL,AL AND BL,0FCH AND AL,03H NOT AL AND AL,BL ADD AL,01H OUT DX,AL POP BX POP AX MOV AH,AL LEA BX,TAB1 ;查找七段代码值 XLAT MOV DX,201H ;送数码管分的十位 OUT DX,AL MOV DL,AH MOV AL,10 MUL DL MOV MINUTE,AL CALL DELAY JMP M6 M1: PUSH CX CALL INPUT CALL DELAY LEA SI,KEYCOD LEA DI,KEYVAL MOV CX,12 JMP M2 M4: CALL DELAY PUSH AX PUSH BX MOV DX,209H IN AL,DX MOV BL,AL AND BL,0F3H AND AL,0CH NOT AL AND AL,BL ADD AL,04H OUT DX,AL POP BX POP AX CMP DL,5 JNZ M5 CMP AL,9 JA M1 M5: MOV AH,AL LEA BX,TAB1 XLAT MOV DX,205H ;送数码管分的个位 OUT DX,AL ADD MINUTE,AH CALL DELAY M6: LOOP M1 ;设置秒钟 MOV CX,2 JMP S1 S2: CMP AL,[SI] JZ S3 INC SI INC DI LOOP S2 POP CX JMP S1 S3: POP CX MOV AL,[DI] ;AL 中内容为 所按键的键面值 CMP CX,2 JNZ S4 ;CX=2 设置十位,否则设置个位 CMP AL,5 JA S1 PUSH AX PUSH BX MOV DX,20AH IN AL,DX MOV BL,AL AND BL,0FCH AND AL,03H NOT AL AND AL,BL ADD AL,01H OUT DX,AL POP BX POP AX MOV AH,AL LEA BX,TAB1 ;查找七段代码值 XLAT MOV DX,202H ;送数码管秒的十位 OUT DX,AL MOV DL,AH MOV AL,10 MUL DL MOV SECOND,AL CALL DELAY JMP S6 S1: PUSH CX CALL INPUT CALL DELAY LEA SI,KEYCOD LEA DI,KEYVAL MOV CX,12 JMP S2 S4: CALL DELAY PUSH AX PUSH BX MOV DX,20AH IN AL,DX MOV BL,AL AND BL,0F3H AND AL,0CH NOT AL AND AL,BL ADD AL,04H OUT DX,AL POP BX POP AX CMP DL,5 JNZ S5 CMP AL,9 JA S1 S5: MOV AH,AL LEA BX,TAB1 XLAT MOV DX,206H ;送数码管秒的个位 OUT DX,AL ADD SECOND,AH CALL DELAY S6: LOOP S1 MOV DX,208H MOV EAX,0A0A0A0AH OUT DX,EAX MOV STOP,0 JMP G ;行扫描法读取键入值 INPUT PROC PUSH BX PUSH DX WT: MOV AL,00H MOV DX,360H OUT DX,AL NOP NOP MOV DX,360H IN AL,DX AND AL,0FH CMP AL,0FH JZ WT ;al 全为 0,说明无键按下 NOP NOP MOV DX,360H ;再次确认是否有键按下 IN AL,DX AND AL,0FH CMP AL,0FH JZ WT MOV CX,3 MOV BL,0FEH NEXT: MOV AL,BL MOV DX,360H OUT DX,AL NOP NOP IN AL,DX AND AL,0FH CMP AL,0FH JNZ KEY ROL BL,1 LOOP NEXT JMP WT KEY: SHL BL,4 OR AL,BL CALL RELEASE POP DX POP BX RET INPUT ENDP ;设定闹钟 ALARM PROC PUSH CX PUSH AX PUSH DX MOV CX,2 JMP HH1 HH2: CMP AL,[SI] JZ HH3 INC SI INC DI LOOP HH2 POP CX JMP HH1 HH3: POP CX MOV AL,[DI] ;AL 中内容为 所按键的键面值 CMP CX,2 JNZ HH4;CX=2 设置十位,否则设置个位 CMP AL,2 JA HH1 MOV AH,AL LEA BX,TAB1 ;查找七段代码值 XLAT MOV DX,200H;送数码管时的十位 OUT DX,AL CALL DELAY MOV DL,AH MOV AL,10 MUL DL MOV HHOUR,AL CALL DELAY JMP HH6 HH1: PUSH CX CALL INPUT CALL DELAY LEA SI,KEYCOD LEA DI,KEYVAL MOV CX,12 JMP HH2 HH4: CALL DELAY CMP DL,2 JNZ HH5 CMP AL,4 JA HH1 HH5: MOV AH,AL LEA BX,TAB1 XLAT MOV DX,204H ;送数码管时的个位 OUT DX,AL CALL DELAY ADD HHOUR,AH ;将闹铃值保存在内存中 CALL DELAY HH6: LOOP HH1 ;设置分钟 MOV CX,2 JMP MM1 MM2: CMP AL,[SI] JZ MM3 INC SI INC DI LOOP MM2 POP CX JMP MM1 MM3: POP CX MOV AL,[DI] ;AL 中内容为 所按键的键面值 CMP CX,2 JNZ MM4 ;CX=2 设置十位,否则设置个位 CMP AL,5 JA MM1 MOV AH,AL LEA BX,TAB1 ;查找七段代码值 XLAT MOV DX,201H ;送数码管分的十位 OUT DX,AL CALL DELAY MOV DL,AH MOV AL,10 MUL DL MOV MMINUTE,AL CALL DELAY JMP MM6 MM1: PUSH CX CALL INPUT CALL DELAY LEA SI,KEYCOD LEA DI,KEYVAL MOV CX,12 JMP MM2 MM4: CALL DELAY CMP DL,5 JNZ MM5 CMP AL,9 JA MM1 MM5: MOV AH,AL LEA BX,TAB1 XLAT MOV DX,205H ;送数码管分的个位 OUT DX,AL CALL DELAY ADD MMINUTE,AH ;将闹铃值保存在内存中 CALL DELAY MM6: LOOP MM1 ;设置秒钟 MOV CX,2 JMP SS1 SS2: CMP AL,[SI] JZ SS3 INC SI INC DI LOOP SS2 POP CX JMP SS1 SS3: POP CX MOV AL,[DI] ;AL 中内容为 所按键的键面值 CMP CX,2 JNZ SS4 ;CX=2 设置十位,否 则设置个位 CMP AL,5 JA SS1 MOV AH,AL LEA BX,TAB1 ;查找七段代码值 XLAT MOV DX,202H ;送数码管秒的十位 OUT DX,AL CALL DELAY MOV DL,AH MOV AL,10 MUL DL MOV SSECOND,AL CALL DELAY JMP SS6 SS1: PUSH CX CALL INPUT CALL DELAY LEA SI,KEYCOD LEA DI,KEYVAL MOV CX,12 JMP SS2 SS4: CALL DELAY CMP DL,5 JNZ SS5 CMP AL,9 JA SS1 SS5: MOV AH,AL LEA BX,TAB1 XLAT MOV DX,206H ;送数码管秒的个位 OUT DX,AL CALL DELAY ADD SSECOND,AH ;将闹铃值保存在内存中 CALL DELAY SS6: LOOP SS1 MOV STOP,0 POP DX POP AX POP CX ALARM ENDP ;判断按键是否释放 RELEASE PROC PUSH AX PUSH DX R1: MOV AL,00H ;行线给 0,读列线看是否为 0 MOV DX,360H OUT DX,AL NOP NOP