正文

大学时代8253+8259A芯片的接口程序2006-10-10 13:57:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sonicling/19180.html

分享到:

由于实验用的电路板固定了8259A芯片的中断向量为0A,因此程序中只使用10号中断。 _i8259和_i8253分别是两个芯片的初始化自程序,_setint和_clrint是设置中断和清理中断的自程序,_iserv是10号中断使用的中断服务子程序,其算法是用来计算时间来实现电子时钟的功能。只负责计算不负责输入和输出。可以根据需要改写此中断服务子程序。 注意:芯片的初始化参数根据芯片引脚的连接方式而定。 .286public _iserv,_setint,_clrint,_i8253,_i8259extrn minute:byte,second:byte,chgflg:byte ;for iserv()dseg segment para public 'DATA'P8253_A equ 208hP8253_B equ 209hP8253_C equ 20ahP8253_CON equ 20bhold0a dd ?dseg endscseg segment para public 'CODE'  assume cs:cseg,ds:dsegstart:_iserv proc   ;void iserv()  pusha   ;{  push ds  mov ax,dseg  mov ds,axis_beg:  cmp byte ptr chgflg,0h; if(!chgflg) goto is_exit //no change permitting  je is_exit  mov al,byte ptr second  cmp al,59h  ; if(second != 0x59)  je is_min  ; {  add al,1  ;  second += 1;  clc  daa   ;  _asm{daa second};  mov byte ptr second,al;  goto is_exit;  jmp is_exit  ; }is_min: mov al,byte ptr minute; else  cmp al,59h  ;  if(minute != 0x59)  je is_hur  ; {  mov byte ptr second,0h;  second = 0;  add al,1  ;  minute += 1;  clc  daa   ;  _asm{daa,minute};  mov byte ptr minute,al;  goto is_exit  jmp is_exit  ; }is_hur: mov byte ptr minute,0h; else minute = 0;is_exit:mov al,20h  ; //is_exit  out 20h,al  pop ds  popa  iret_iserv endp   ;} _setint proc   ;void setint(){  call _rd0a  ; rd0a();  call _wr0a  ; wr0a();  ret_setint endp   ;} _rd0a proc   ;void rd0a(){  mov ax,350ah  int 21h  mov word ptr old0a,bx  mov word ptr old0a + 2,es ;//Save old  ret_rd0a endp   ;} _wr0a proc   ;void wr0a(){  push ds  mov ax,cseg  mov ds,ax  mov dx,offset _iserv; //write interrupt vector  mov ax,250ah  int 21h  pop ds  ret_wr0a endp   ;} _clrint proc   ;void clrint(){  push ds  mov dx,word ptr old0a  mov ds,word ptr old0a+2  mov ax,250ah  int 21h  ; //restore old vector  pop ds  in al,0a1h  ; //disable interruption  or al,00000010b  out 0a1h,al  ret_clrint endp   ;} _i8253 proc   ;void i8253(){  pusha  mov dx,P8253_CON  mov al,36h  ; //mode 3  out dx,al  mov ax,200  ; //count = 200h  mov dx,P8253_A  out dx,al  mov ah,al  out dx,al  popa  ret_i8253 endp   ;} _i8259 proc   ;void i8259(){  pusha  in al,21h  and al,11111011b ; //open mask of main 8259a  out 21h,al  in al,0a1h  and al,11111101b ; //open mask of sub 8259a  out 0a1h,al  popa  ret_i8259 endp   ;}cseg ends  end start

阅读(6511) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册