正文

大学时代接口实验LED接口代码2006-10-10 14:05:00

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

分享到:

注释是对应的伪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

阅读(5876) | 评论(0)


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

评论

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