注释是对应的伪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') je if_cin_r_true ; cmp al,INVALID ; if(key == INVALID) je mainlp ; continue; call _addledbuf ; else printch(key); ; elseif_cin_r_true: ; exit(0); mov ax,4c00h int 21h ret ; }_main endp ;} _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_getchar endp ;} _testkey proc ;char testkey() mov al,07h ;{ xor al,0ffh call _outpb ; outpb(0f8h); call _inpa ; return inpa(); ret_testkey endp ;} _scankey proc ;int scankey(){ mov bx,0 ; int code = 0; mov dx,0 ; int index = 0; mov ax,1 ; int outcode = 1; xor ax,0ffffh mov cx,3 ; for(int i=0;i<3;i++)for_3: ; { push ax call _scanline ; code = scanline(~outcode); mov bx,ax pop ax cmp bl,0ffh ; if(code != INVALID){ je for_3_next push ax mov ax,bx call _transcode ; index += transcode(code); add dx,ax pop ax call _waitup ; waitup(~outcode,code); mov ax,dx ret ; return index; ; }for_3_next: ; else{ add dx,8 ; index += 8; rol ax,1 ; outcode << 1; loop for_3 ; } mov ax,INVALID ; } ret ; return INVALID;_scankey endp ;} _scanline proc ;char scanline(char outcode){ call _outpb ; outpb(outcode); call _inpa ; return inpa(); ret_scanline endp ;} _transcode proc ;int transcode(char code){ push bx mov bx,1 ; char test = 1; xor bl,0ffh mov cx,8 ; for(int i=0;i<8;i++)tc_lp: ; { cmp al,bl ; if(code == ~test) je tc_ret ; return 8-i; rol bl,1 ; test << 1; loop tc_lp ; }tc_ret: mov ax,8 sub ax,cx pop bx ret_transcode endp ;} _waitup proc ;void waitup(char outcode,char code) pusha ;{ mov dx,axwu_lp: ;wu_lp: mov ax,dx call _scanline ; char test = scanline(outcode); cmp dx,bx ; if(test == code) je wu_lp ; goto wu_lp; popa ret_waitup endp ;} _addledbuf proc ;void addledbuf(char chnum) pusha ;{ cmp al,'0' ; if(chnum < '0' || chnum > 'F') jc alb_ret cmp al,'F' jnc alb_ret ; return; cmp al,'9'+1 ; if(chnum < '9'+1) jc alb_1 ; chnum -= 0x30; cmp al,'A' ; else if(chnum >= 'A') jnc alb_2 ; chnum -= 0x37; jmp alb_ret ; else return;alb_1: sub al,30h jmp alb_addalb_2: sub al,37halb_add:mov si,offset g_led_buf mov di,si ; for(int i=0;i<5;i++) inc si ; g_led_buf[i] = g_led_buf[i+1]; mov cx,5 cld rep movsb mov ah,0 mov bx,ax mov al,g_led_tbl[bx] mov [di],al ; g_led_buf[5] = g_led_tbl[chnum];alb_ret:popa ret_addledbuf endp ;} _setledbuf proc ;void setledbuf(char num,int index) pusha mov ah,0 push bx mov bx,ax mov al,g_led_tbl[bx] pop bx mov g_led_buf[bx],al; g_led_buf[index] = g_led_tbl[num]; popa ret_setledbuf endp ;} _printled proc ;void printled() { pusha mov cx,6 mov bx,1 ; char bitcode = 1; mov si,0 ; int index = 0;pl_lp: ; for(int i=0;i<6;i++) { mov al,g_led_buf[si]; char segcode = g_led_buf[index]; mov ah,0 push cx call _ptled ; ptled(segcode,bitcode); pop cx rol bx,1 ; bitcode << 1; inc si ; index++; loop pl_lp ; } popa ret_printled endp ;} _ptled proc ;void ptled(char seg,char bit) { pusha call _outledcode ; outledcode(seg); mov ax,0 call _outledpos ; outledpos(0); mov ax,bx call _outledpos ; outledpos(bit); call _delay ; delay(); mov ax,0 call _outledpos ; outledpos(0); popa ret_ptled endp ;} _outledcode proc ;void outledcode(char segcode) { push dx mov dx,201h out dx,al pop dx ret_outledcode endp _outledpos proc ;void outledpos(char bitcode) { push dx mov dx,200h out dx,al pop dx ret_outledpos endp ;} _outpb proc ;void outpb(char outcode) push dx ;{ mov dx,PORT_PB out dx,al pop dx ret_outpb endp ;} _inpa proc ;char inpa() push dx ;{ mov dx,PORT_PA in al,dx 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 ;} _delay proc ;void delay() { pusha mov ah,86h mov cx,0 mov dx,5000 int 15h popa ret_delay endp ;} cseg ends end start

评论