西安邮电大学硬件课程设计报告院系名称:计算机学院学生姓名:王哲指导老师:杨锐班级:0901学号:时间:porta equ1400hportb equ1401hportc equ1402hportcontrol equ1403htimer0equ1440htimer1equ1441htimer2equ1442htimer_control equ1443h;-------------------------------------------------------------data segmentledbuf db3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段码datbuf db00h,00h,00h,00h;存放要显示4位copybuf db00h,00h,00h,00hdata ends;--------------------------------------------------------------code segmentassume cs:code,ds:data;---------------------------------------start:mov ax,datamov ds,axcall read_cmoscall p8254mov dx,portcontrol;将8255设为A\B口输出,A为段码输出,B为位码输出mov al,10000001Bout dx,al;---------------------------------------------------------------loop2:call dispmov dx,1402hin al,dxmov bl,aland bl,02htest bl,02hjnz resetmov bh,aland bh,04htest bh,04hjnz stopout2:and al,01htest al,1hjnz hellojmp loop2;----------------------------------------------------------------stop:push sipush axmov si,0mov al,datbuf[si]mov copybuf[si],almov al,datbuf[si+1]mov copybuf[si+1],almov al,datbuf[si+2]mov copybuf[si+2],almov al,datbuf[si+3]mov copybuf[si+3],alpop axpop sipause:call disp1mov dx,1402hin al,dxmov ah,aland al,01htest al,1hjnz plus2out3:and ah,04htest ah,04hjz out2jmp pausereset:mov si,0hmov datbuf[si],0hmov datbuf[si+1],0hmov datbuf[si+2],0hmov datbuf[si+3],0hjmp loop2hello:call pluscall p8254jmp loop2plus2:call pluscall p8254jmp out3;-----------------------------------------------------------------exit:mov dx,portbmov al,0ffh;关掉数码管显示out dx,almov ah,4ch;返回DOSint21h;----------------------------------------------------------------plus procpush axpush bxpush dxmov si,0mov al,datbuf[si]cmp al,09hjnc al9inc almov datbuf[si],aljmp out1al9:mov datbuf[si],00hmov ah,datbuf[si+1]cmp ah,05hjnc ah5inc ahmov datbuf[si+1],ahjmp out1ah5:mov datbuf[si+1],00hmov bl,datbuf[si+2]cmp bl,09hjnc bl9inc blmov datbuf[si+2],bljmp out1bl9:mov datbuf[si+2],00hmov bh,datbuf[si+3]cmp bh,05hjnc bh5inc bhmov datbuf[si+3],bhjmp out1bh5:mov datbuf[si+3],00hout1:pop dxpop bxpop axretplus endp;----------------------------------------------------------------------disp procmov cx,0900hagain:mov si,offset datbufmov bl,0fehdispnext:mov al,[si]push bxmov bx,offset ledbufxlatmov dx,portaout dx,alpop bxmov al,blmov dx,portbout dx,alpush cxmov cx,0E000hdelay:loop delaypop cx;延时稳定时间cmp bl,11110111B;判断是否六位全部显示jz doneinc si;未全部显示,指针指向下一个需要显示的数,改变位码rol bl,1jmp dispnextdone:dec cxjnz againretdisp endp;--------------------------------------------------------------------------------------------------read_cmos procpush axpush bxmov si,offset datbufmov dx,70hmov al,02hout dx,almov dx,71hin al,dxmov bl,aland al,0fhmov[si+2],almov al,blsar al,4and al,0fhmov[si+3],al;---------------------------mov dx,70hmov al,00hout dx,almov dx,71hin al,dxmov bl,aland al,0fhmov[si],almov al,blsar al,4and al,0fhmov[si+1],al;-----------------------------------------pop bxpop axretread_cmos endp;----------------------------------------------------------p8254proc;---------------------------------------push axpush dxmov dx,1443h;写控制字mov al,00110000bout dx,al;---------------------------------------mov dx,1440hmov al,0e8hout dx,almov dx,1440hmov al,03hout dx,alpop dxpop ax;---------------------------------------retp8254endp;---------------------------------------------------------------------------disp1procmov cx,0900hagain1:mov si,offset copybufmov bl,0fehdispnext1:mov al,[si]push bxmov bx,offset ledbufxlatmov dx,portaout dx,alpop bxmov al,blmov dx,portbout dx,alpush cxmov cx,0E000hdelay1:loop delay1pop cx;延时稳定时间cmp bl,11110111B;判断是否六位全部显示jz done1inc si;未全部显示,指针指向下一个需要显示的数,改变位码rol bl,1jmp dispnext1done1:dec cxjnz again1retdisp1endp;-------------------------------------------------------------------------code endsend start;接线:A口作为段码输出,B口作为位码输出,位控对应关系注意:pb0控制个位显示,依次类推,所以pb0接x4,pb1接x3,依次类推。