1、这个方法将与时间相关的两个模块即显示模块和计时模块放在中断处理程序中,这样,就保证了数字显示的稳定,中断处理程序完成计时功能要依靠两个方面,因为中断处理程序是每20毫秒执行一次,但计时并不是以20毫秒为单位进行的,而是以秒为单位进行的,所以,计时功能的实现一方面要利用20毫秒这个基准时间单位,另一方面借助一个计数单位。计数单位的初始值为50,每进行一次中断,便使计数单元的内容减1。每当计数单元从50减为0时,说明已经过了1秒时间。并判断是否有进位,如有则进行修改,实现进位。并在LED上显示。显示部分:本程序显示部分用了6个共阴极LED作为显示管,显示程序要做到每送一次段码就送一次位码,每送一次
2、位码后,将位码中的0右移1位作为下次的位码,从而可以实现从左到右使6个LED依次显示出相应的数字。虽然CPU每隔一定时间便执行显示程序,但只要这个时间段不太长,由于人眼的视觉作用,就可以在6个LED上同时见到数字显示。四、功能流程图四、源程序以及注释;* 键盘显示 8255LED *;*; IO_PLX_DEVICE_ID EQU 05406H ;TPC卡设备ID IO_PLX_VENDOR_ID EQU 010B5H ;TPC卡厂商ID IO_PLX_SUB_ID EQU 0905410B5H ;TPC卡子设备及厂商ID PA55 EQU 218H-200H ;8255端口地址 PB55 E
3、QU 219H-200H P55CTL EQU 21BH-200H PORTSEG EQU 211H-200H ;LED端口地址 PORTBIT EQU 210H-200H TIM_CTL EQU 203H-200H ;8253端口地址 TIMER0 EQU 200H-200H TIMER1 EQU 201H-200H MODE03 EQU 36H ;0011-0111 MODE12 EQU 74H ;0111-0101DATA SEGMENT CSREG DW ? IPREG DW ? ;旧中断向量保存空间 IO_9054BASE_ADDRESS DB 4 DUP(0) ;TPC卡PCI接口
4、芯片I/O基地址暂存空间 IO_BASE_ADDRESS DB 4 DUP(0) ;TPC卡I/O基地址暂存空间 INTERRUPT_LINE DB 2 DUP(0) ;TPC卡中断号暂存空间 PCICARDNOTFIND DB 0DH,0AH,TPC PCI CARD NOT FIND OR ADDRESS/INTERRUPT ERROR !,0DH,0AH,$ IO9054BASEADDRESS DB 0DH,0AH,TPC PCI CARD 9054 CHIP I/O BASE ADDRESS : , IOBASEADDRESS DB 0DH,0AH,TPC PCI CARD I/O B
5、ASE ADDRESS : INTNUMBER DB 0DH,0AH,TPC PCI CARD INTERRUPT LINE : ENTER_RETURN DB 0DH,0AH, MESS DB 8253A TIMER0 IN MODE3! COUNT=0200H,0AH,0DH DB 8253A TIMER1 IN MODE2! COUNT=0AH,0AH,0DH, MESS1 DB I AM RINGING IRQ_VECT DB 08H,09H,0AH,0BH,0CH,0DH,0EH,0FH,70H,71H,72H,73H,74H,75H,76H,77H ;新的中断向量,中断0-7的向量
6、为:08H-0FH,中断8-15的向量为:70H-77H IRQ_MASK_0_7_TABLE DB 011111110B,011111101B,011111011B,011110111B DB 011101111B,011011111B,010111111B,001111111B DB 011111011B,011111011B,011111011B,011111011B新的中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零 IRQ_MASK_8_15_TABLE DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DB 011111110B
7、,011111101B,011111011B,011110111B新的中断掩码,中断0-7时全一,中断8-15时从低至高相应位为零COUNT DB 15CTIME DB 00H,00H,00H,00H,00H,00HCLOCK DB 0AH,0AH,0AH,0AH,0AH,0AHBUF DB 00H,00H,00H,00H,00H,00H;*MYBELL DB 00H ;*OFF*INITIALIZEMONTH3 DB 0DAY3 DB 0CHAR1 DB ?INTMASK DB ?CONST1 DW ?LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6F
8、H,40H,79H,00HTABLE1 DW 0101H,0201H,0401H,0801H,1001H,2001H,4001H,8001H DW 0102H,0202H,0402H,0802H,1002H,2002H,4002H,8002H DW 0104H,0204H,0404H,0804H,1004H,2004H,4004H,8004HCHAR DB CDEFBA9845673210 RPMGMAXDAY DB 00H,1FH,1CH,1FH,1EH,1FH,1EH,1FH,1FH,1EH,1FH,1EH,1FHMES DB IN SMALL KEYRORDC-DISPLAY 12, 4
9、5, 37 ; G-GO AHEADD-STOP TO DISPLAY ; E-EXIT TO DOSM-SET THE CLOCK ; F-OPEN THE CLOCKB-CLOSE THE CLOCKP-POSITION THE BENINNING DATEDATA ENDSSTACKS SEGMENTDB 100 DUP (?)STA DW 512 DUP (?TOP EQU LENGTH STASTACKS ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKS,ES:DATASTART:ENABLE LOCAL INTERRUPT INPUT
10、.386 CLI MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACKS MOV SS,AX CALL FINDTPC ;查找TPC卡资源并显示 MOV AH,0 INT 1AH ;时间中断,保存到DX中 MOV BX,DXT1: INT 1AH CMP BX,DX JZ T1 MOV SI,0T2: MOV AX,800HT3: DEC AX ;循环800H次 JNZ T3 INC SI JZ T2 MOV AX,30H MOV BX,SI MUL BX MOV BX,56H DIV BX MOV WORD PTR CONST1,AX MOV DX,WOR
11、D PTR IO_BASE_ADDRESS ;初始化8253 ADD DX,TIM_CTL ;控制口 MOV AL,MODE03 ;36H=0011 0110 ;计数器0工作在模式3(方波发生器),计数值采用二进制格式 OUT DX,AL MOV DX,WORD PTR IO_BASE_ADDRESS ADD DX,TIMER0 ;计时器0 MOV AL,00H MOV AL,02H74H=0111 0100 ;设置计数器1工作在模式2(分频器),计数值采用二进制格式 MOV AL,MODE12 ADD DX,TIMER1 MOV AL,0AH MOV AL,00 MOV DX,OFFSET
12、MES MOV AH,09 INT 21H MOV DX,WORD PTR IO_9054BASE_ADDRESS ADD DX,68H ;设置 TPC 卡中9054芯片IO口,使能中断 IN AX,DX OR AX,0900H OUT DX,AX MOV BX,WORD PTR INTERRUPT_LINE ;保存原中断向量 MOV AL,BYTE PTR IRQ_VECT+BX MOV AH,35H MOV AX,ES MOV CSREG,AX MOV IPREG,BX设置新中断向量 MOV CX,CS MOV DS,CX MOV DX,OFFSET INT_PROC MOV AH,25H
13、 IN AL, 21H ;设置中断掩码 MOV BX,WORD PTR INTERRUPT_LINE MOV AH,BYTE PTR IRQ_MASK_0_7_TABLE+BX AND AL,AH OUT 21H, AL IN AL, 0A1H MOV AH,BYTE PTR IRQ_MASK_8_15_TABLE+BX OUT 0A1H, AL STI ;开中断*非规定的按键时继续等待*EXIT: MOV BX,WORD PTR INTERRUPT_LINE ;恢复中断掩码 NOT AH IN AL, 21H OR AL, AH恢复原中断向量 MOV DX,IPREG MOV CX,CSRE
14、G MOV AX,DATA ;设置 TPC 卡中9054芯片IO口,关闭中断 ADD DX,68H AND AX,0F7FFH MOV AX,4C00H INT 21H ;退出 PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH DSINTERRUPT TO DO DEC COUNT JNZ DDD MOV COUNT,20 MOV DI,OFFSET CTIME MOV AL,DI+4 MOV AH,0AH MUL AH ADD AL,DI+5 CMP AX,59 ;先判断秒钟是否等于59秒,是则判断分钟,否则加1 JZ FENZHONG
15、 INC BYTE PTR DI+5 CMP BYTE PTR DI+5,0AH MOV BYTE PTR DI+5,00H INC BYTE PTR DI+4 JMP DDDFENZHONG: MOV WORD PTR DI+4,0000H ;先将秒钟置为0,再转换分钟为十进制形式 MOV AL,DI+2 ADD AL,DI+3判断是否应该向时钟进位 JZ SHIZHONG INC BYTE PTR DI+3 CMP BYTE PTR DI+3,0AH MOV BYTE PTR DI+3,00H INC BYTE PTR DI+2SHIZHONG: MOV WORD PTR DI+2,000
16、0 MOV AL,DI ADD AL,DI+1 CMP AH,23 ;判断时钟该不该循环了 JNZ QQQ MOV WORD PTR DI,0000HQQQ: INC BYTE PTR DI+1 CMP BYTE PTR DI+1,0AH MOV BYTE PTR DI+1,00H INC BYTE PTR DIDDD:将闹铃功能键与闹铃条件的判断放在20次中断计数条件满足后的执行代码中有效缩短延迟时间以及误差时间 CMP BYTE PTR MYBELL,00H ;检测闹铃有没有开, JZ ZZZ LEA DI,CTIME LEA SI,CLOCK MOV CX,5CHECK:检测门铃时间是否
17、到了 MOV BL,SI CMP AL,BL JNZ ZZZ INC DI LOOP CHECK* 闹铃时的检测输出 MOV DL,07H MOV AH,02H LEA DX,MESS1 MOV AH,09H MOV BYTE PTR MYBELL,00H ZZZ: MOV AL,20H ;SEND EOI OUT 0A0H,AL OUT 20H,AL MOV CX,0FFFFHLOOPX: NOP LOOP LOOPX ;延时 POP DSPOP DI POP SI POP DX POP CX POP BX POP AX STI IRETINT_PROC ENDP-KEY PROC NEAR
18、 ;AB口端口读取的控制,是对小键盘的控制KST: MOV AL,82H ADD DX,P55CTL ADD DX,PA55 ADD DX,PB55 IN AL,DX OR AL,0F8H CMP AL,0FFH JZ DELAY MOV CX,0A00H ;两重循环DLY: MOV AX,WORD PTR CONST1DLY1: DEC AX JNZ DLY1 DEC CX JNZ DLY MOV CL,08H MOV AH,0FEHSCAN1: MOV DX,WORD PTR IO_BASE_ADDRESS;行列扫描,得到小键盘输入 MOV AL,AH JNZ KEYN ROL AH,1
19、DEC CL JNZ SCAN1 JMP KSTKEYN:RELEA: JNZ RELEA NOT AX MOV SI,OFFSET TABLE1 MOV DI,OFFSET CHAR MOV CX,24TT: CMP AX,SI JZ NN JZ KST ADD SI,02 JMP TTNN: MOV DL,DI MOV CHAR1,DL JMP YANGDELAY: CALL DISPLYYANG: RETKEY ENDP-DISPLY PROC NEAR ;LED的显示部分 MOV BX,OFFSET LED MOV CX,0006 MOV SI,OFFSET CTIME MOV AH,01HDISPLY1: CLD LODSB XLAT ADD DX,PORTSEG ADD DX,PORTBIT SHL AH,1 LOOP DISPLY1DISPLY ENDPCPRO PROC NEAR ;C键按下时执行的过程,显示预设时间 MOV WORD PTR CTIME,0201H MOV WORD PTR CTIME+2,0504H MOV WORD PTR CTIME+4,0703HCPRO ENDPGPRO PROC NEAR ;G键按下时执行的过程,开
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2