博文
大学时代接口实验之小键盘接口程序(2006-10-10 14:14:00)
摘要:需要和8255程序一同连接,注意初始化参数与引脚连接方式有关。
.286public _getcharextrn _i8255:near,_outpb:near,_inpa:neardseg segment para public 'DATA'INVALID equ 0ffhg_ch_tbl db 'C','D','E','F','B','A','9','8' db '4','5','6','7','3','2','1','0' db 'W','X','Y','S','R','P','M','G'dseg endscseg segment para public 'CODE' assume cs:cseg,ds:dsegstart:_getchar proc ;char getchar(){ call _testkey ; char al = testkey(); cmp al,0ffh ; if(al == INVALID){ je gc_ret ; return INVALID; ; } ; else{ call _scankey ; al = scankey(); cmp al,INVALID ; if(al == INVALID) return INVALID; je gc_ret mov bx,ax ; return g_ch_tbl[al]; mov al,g_ch_tbl[bx] ; } retgc_ret: mov ax,INVALID ret_getch......
大学时代接口实验:时钟的实现(2006-10-10 14:09:00)
摘要:该程序需要与8253、8255、8259、LED、小键盘对应的asm编译结果进行连接才可以通过。
(将8255和8253、8259以及LED和小键盘的程序分别编译为obj,然后所有obj一起link。)
8255的代码:http://blog.programfan.com/article.asp?id=19179
8253+8259的代码:http://blog.programfan.com/article.asp?id=19180
LED的代码:http://blog.programfan.com/article.asp?id=19181
小键盘的代码:http://blog.programfan.com/article.asp?id=19183
.286extrn _getchar:near,_setledbuf:near,_printled:near,_setmask:near ;displayextrn _setint:near,_clrint:near ;interruptionextrn _i8255:near,_i8253:near,_i8259:near ;initializationpublic chgflg,minute,seconddseg segment para public 'DATA'MAXCT equ 20shutfg db 0hchgflg db 0hchgfg2 db 0hsetmod db 0htmask db 0hcount db MAXCTminute db 0hsecond db 0hdseg endscseg segment para public 'CODE' assume cs:cseg,ds:dsegstart: mov ax,dseg mov ds,ax mov es,ax
init: call _i8253 &nb......
大学时代接口实验LED接口代码(2006-10-10 14:05:00)
摘要:注释是对应的伪C代码,注意初始化参数和引脚连接方式有关。
.286public _getchar,_setledbuf,_addledbuf,_printled,_i8255,_delaydseg segment para public 'DATA'PORT_CON equ 21bhPORT_PA equ 218hPORT_PB equ 219hINVALID equ 0ffhg_led_buf db 6 dup(3fh)g_led_tbl db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h db 7fh,6fh,77h,7ch,39h,5eh,79h,71hg_ch_tbl db 'C','D','E','F','B','A','9','8' db '4','5','6','7','3','2','1','0' db 'W','X','Y','S','R','P','M','G'dseg endscseg segment para public 'CODE' assume cs:cseg,ds:dseg_main proc ;void main(void)start: mov ax,dseg ;{ mov ds,ax mov es,ax
call _i8255 ; i8255(); ; while(true) ; {mainlp: call _printled call _getchar ; char key = getchar(); cmp al,'R' ; if(key != 'R')&......
大学时代8253+8259A芯片的接口程序(2006-10-10 13:57:00)
摘要:由于实验用的电路板固定了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;&......
大学时代8255A芯片的接口程序(2006-10-10 13:49:00)
摘要:这个是8255A芯片的接口库,专门供其它的asm文件调用的。
_i8255是8255A初始化子程序
.286public _i8255,_outpb,_inpadseg segment para public 'DATA'PORT_CON equ 21bhPORT_PA equ 218hPORT_PB equ 219hINVALID equ 0ffhdseg endscseg segment para public 'CODE' assume cs:cseg,ds:dsegstart:_outpb proc ;void outpb(char outcode) push dx ;{ mov dx,PORT_PB out dx,al ; _asm{out PORT_PB,outcode}; pop dx ret_outpb endp ;}
_inpa proc ;char inpa() push dx ;{ mov dx,PORT_PA in al,dx ; _asm{in PORT_PA,al}; pop dx ret_inpa endp ;}
_i8255 proc ;void i8255() push dx ;{ mov dx,PORT_CON mov al,10010000b out dx,al pop dx ret_i8255 endp ;}
cseg ends end start......
