微机原理课程设计 电子钟 汇编语言Word下载.docx
《微机原理课程设计 电子钟 汇编语言Word下载.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计 电子钟 汇编语言Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
TPC卡厂商ID;
TPC卡子设备及厂商IDEQU0905410B5Hio_9054base_addressio_base_addressinterrupt_line
pcicardnotfind
iobaseaddress
intnumber
MESSenter_returndb0dh,0ah,'
TPCpcicardnotfindoraddress/interrupterror!
!
'
0dh,0ah,'
$'
db0dh,0ah,'
TPCpcicardI/OBaseAddress:
'
'
TPCpcicardInterruptLine:
io9054baseaddressdb0dh,0ah,'
TPCpcicard9054ChipI/OBaseAddress:
DB'
8253ATIMER0INMODE3!
COUNT=0200H'
0AH,0DH
db08h,09h,0ah,0bh,0ch,0dh,0eh,0fh,70h,71h,72h,73h,74h,75h,76h,77h;
新的中断向量,中断0-7的向量为:
08h-0fh,中断8-15的向量为:
70h-77hdb011101111b,011011111b,010111111b,001111111b
db011111011b,011111011b,011111011b,011111011b
db011111011b,011111011b,011111011b,011111011bDB'
8253ATIMER1INMODE2!
COUNT=0aHinfactitisbettertobe0003h'
0AH,0DH,'
irq_vectirq_mask_0_7_tabledb011111110b,011111101b,011111011b,011110111b
新的中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零db0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffhdb011111110b,011111101b,011111011b,011110111bdb011101111b,011011111b,010111111b,001111111b;
新的中断掩码,中断0-7时全一,中断8-15时从低至高相应位为零
irq_mask_8_15_table;
--------------------------与用户有关的数据寄存区域-------------------------------
COUNTDB50;
jishu50times
TIME1DB00H,00H,00H,00H,00H,00H;
TIMERDATAWAITNGTOBEPRINTED
CHAR1DB?
savethecharthatuhaveinputedfromthekeybord
INTMASKDB?
CONST1DW?
LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,79H,00H
TABLE1DW0101H,0201H,0401H,0801H,1001H,2001H,4001H,8001H
DW0102H,0202H,0402H,0802H,1002H,2002H,4002H,8002H
DW0104H,0204H,0404H,0804H,1004H,2004H,4004H,8004H
CHARDB'
CDEFBA9845673210RPMG'
MESDB'
------------------INSMALLKEYBORD----------------'
DB'
C--DISPLAY00,00,00;
G--GOONSHOWTHETIME'
0AH,0DHDB'
D--STOPTODISPLAY;
E--EXITTODOS'
P--POSITIONTHETHERIGHTTIME'
------------------JUSTHAVEATRY------------------'
dataends
stackssegment
db100dup(?
)
STADW512DUP(?
TOPEQULENGTHSTA
stacksends
codesegment
assumecs:
code,ds:
data,ss:
stacks,es:
data
start:
EnableLocalInterruptInput
.386
cli
movax,data
movds,ax
moves,ax
movax,stacks
movss,ax
---------------------------------主程序开始时的初始化工作-------------------------------
movdx,wordptrio_9054base_addressadddx,68h;
设置tpc卡中9054芯片io口,使能中断MOVDX,wordptrio_base_address;
初始化8253adddx,TIM_CTLMOVAL,MODE03;
计数器0工作在模式三00110110;
OUTDX,ALMOVDX,wordptrio_base_addressadddx,TIMER0MOVAL,00hOUTDX,ALOUTDX,ALMOVDX,wordptrio_base_addressadddx,TIM_CTLMOVAL,MODE12OUTDX,ALMOVDX,wordptrio_base_addressadddx,TIMER1OUTDX,ALOUTDX,ALMOVDX,OFFSETMESMOVAH,09INT21Hcallfindtpc;
查找TPC卡资源并显示MOVAL,02HMOVAL,03H;
本来是000ah但程序中有很多延时。
MOVAL,00hinax,dx
orax,0900h
outdx,ax
movbx,wordptrinterrupt_line
moval,byteptr[irq_vect+bx]movah,35hmovax,esmovcsreg,ax;
保存原中断向量int21h
movipreg,bx
设置新中断向量movbx,wordptrinterrupt_line
moval,byteptr[irq_vect+bx]
movcx,cs
movds,cx
movax,datamovds,axmoves,axmovdx,offsetint_procmovah,25hint21h
inal,21h;
设置中断掩码movbx,wordptrinterrupt_line
movah,byteptr[irq_mask_0_7_table+bx]andal,ah
out21h,al
inal,0a1h
LKEY:
CALLKEY
MOVDL,[CHAR1]
CMPDL,'
C'
JNZLGY
CALLCPRO
JMPLKEY
LGY:
CMPDL,'
G'
JNZLDY
CALLGPRO
LDY:
D'
JNZLPY
CALLDPRO
LPY:
P'
JNZLEY
CALLPPRO
JMPLKEYsti;
开中断movah,byteptr[irq_mask_8_15_table+bx]andal,ahout0a1h,al
LEY:
E'
JNZLKEY
exit:
cli
movax,4c00hint21h;
退出movax,data;
设置tpc卡中9054芯片io口,关闭中断movds,axmovdx,wordptrio_9054base_addressadddx,68hinax,dxoutdx,axmoval,byteptr[irq_vect+bx]movcx,csregmovds,cxmovah,25hmovdx,ipreg;
恢复原中断向量notahinoral,21hal,ah;
恢复中断掩码movah,byteptr[irq_mask_0_7_table+bx]out21h,almovah,byteptr[irq_mask_8_15_table+bx]notahinoral,0a1hal,ahmovbx,wordptrinterrupt_lineout0a1h,alint21handax,0f7ffh
--------------------------------中断服务程序;
每秒钟将会进入50次-----------------------int_procprocfar
pushax
PUSHBXPUSHCXPUSHSIPUSHDIpushdx
pushds
movax,data;
Interrupttodo
DEC[COUNT]
JNZDDD;
SMALLERTHAN50JUMPTONEXTGENERATIONMOV[COUNT],50;
NEWINTRRUPTISBEGIN
DDD:
moval,20h;
SendEOI
out0a0h,al
out20h,al
movcx,0ffffh
loopx:
nop
looploopx;
延时MOVDI,OFFSETTIME1CMPBYTEPTR[DI+5],09HJEDDD1;
先进性比较如果是9则跳到ddd1产生进位否则加一INCBYTEPTR[DI+5];
50TIMESTOMAKEANINCOFsecondhighJMPDDDINCBYTEPTR[DI+4];
产生进位:
CMP[DI+4],06HJNZDDDmovbyteptr[DI+4],00HINCBYTEPTR[DI+3];
产生进位:
CMP[DI+3],0AHJNZDDDmovbyteptr[DI+3],00HINCBYTEPTR[DI+2];
CMP[DI+2],06hJNZDDDmovbyteptr[DI+2],00HINCBYTEPTR[DI+1];
CMP[DI+1],04hJNZDDDmovbyteptr[DI+1],00HINCBYTEPTR[DI];
CMP[DI],03hJNZDDDmovbyteptr[DI],00HDDD1:
movbyteptr[DI+5],00H
popds
POPDIPOPSIPOPCXPOPBXpopdx
popax
sti
iret
int_procendp
-----------------------------键盘扫描的程序主程序中被调用------------------------KEYPROCNEAR
PUSHCX
KST:
MOVAL,82H
MOVDX,wordptrio_base_addressadddx,P55CTL
OUTDX,AL
MOVAL,00H
MOVDX,wordptrio_base_addressadddx,PA55MOVDX,wordptrio_base_addressadddx,PB55OUTDX,AL
INAL,DX
ORAL,0F8H
CMPAL,0FFH
JZDELAY
PUSHAX
MOVCX,0a00H
DLY:
MOVAX,wordptrCONST1
DLY1:
DECAX
JNZDLY1
DECCX
JNZDLY
POPAX
MOVCL,08H
MOVAH,0FEH
SCAN1:
MOVDX,wordptrio_base_addressadddx,PA55
MOVAL,AH
MOVDX,wordptrio_base_address
adddx,PB55
JNZKEYN
ROLAH,1
DECCL
JNZSCAN1
JMPKST
KEYN:
PUSHAX
MOVDX,wordptrio_base_addressadddx,PB55
RELEA:
INAL,DX
JNZRELEA
NOTAX
MOVSI,OFFSETTABLE1
MOVDI,OFFSETCHAR
MOVCX,24
TT:
CMPAX,[SI]
JZNN
JZKST
ADDSI,02
INCDI
JMPTT
NN:
MOVDL,[DI]
MOV[CHAR1],DL
MOVAH,02H
INT21H
POPCX
JMPYANG
DELAY:
CALLDISPLY
YANG:
RET
KEYENDP
--------------------------------------------LED数码管显示------------------------------DISPLYPROCNEAR
MOVBX,OFFSETLED
MOVCX,0006;
STANDSFOR6LEDS
MOVSI,OFFSETTIME1
MOVAH,01H
DISPLY1:
CLD;
LODSB;
AL=[BX+AL]
XLAT;
AL=
MOVDX,wordptrio_base_addressadddx,PORTSEG
MOVDX,wordptrio_base_addressadddx,PORTBIT
SHLAH,1;
ZUOYI
MOVAL,00;
EVERYTIMEWEINISIATITWITH00WHENFINISHED
LOOPDISPLY1
RET
DISPLYENDP
------------------------------------按下各种键盘时相应的操作---------------------------
CPROPROCNEAR
CLI
MOVWORDPTRWORDPTR[TIME1],0000H;
PRINTLED00:
00:
00
MOVWORDPTR[TIME1+2],0000H
MOVWORDPTR[TIME1+4],0000H
CPROENDP
---------------------------------------------------------------
GPROPROCNEAR;
STARTTHECLOCK;
STI
GPROENDP
----------------------------------------------------------------
DPROPROCNEAR;
STOPTODISPLAY
DPROENDP
PPROPROCNEAR
PUSHBX
MOVWORDPTR[TIME1],0C0CH;
ledoff
MOVWORDPTR[TIME1+2],0C0CH
MOVWORDPTR[TIME1+4],0C0CH
CALLDISPLY
CALLKEY
2'
JNGNEXT1;
SMALLERTHAN9hh<
=2
JMPERR1
NEXT1:
SUBDL,30H
MOV[YEAR1],DL
MOV[TIME1],DL
3'
JNGNEXT2;
notgreaterthanto->
exit2SMALLERTHAN9hh<
=4
NEXT2:
MOV[YEAR1+1],DL
MOV[TIME1+1],DL
6'
JNGNEXT3;
SMALLERTHAN9mh<
=6
NEXT3:
MOV[TIME1+2],DL
9'
JNGNEXT4;
SMALLERTHAN9ml<
=9
NEXT4:
mov[TIME1+3],DL
JNGNEXT5;
=9SH<
=5
NEXT5:
MOV[TIME1+4],DL
JGERR1
SUBDL,30H
MOV[TIME1+5],DL
JMPWW
ERR1:
MOVWORDPTR[TIME1],0A0BHMOVWORDPTR[TIME1+2],0A0AHMOVWORDPTR[TIME1+4],0A0AH
WW:
POPBX
PPROENDP
---------------------------tpccard------------------------------------
findtpcprocnear
MOVAX,0B102HMOVCX,io_plx_device_idMOVDX,io_plx_vendor_idMOVSI,0INT1AHpushadpushfdMOVAX,0B101HINT1AHJCfindtpc_notfind;
检查PCIBIOS是否存在;
查找TPC卡资源并显示
JCfindtpc_notfind;
检查TPC卡是否安装,设备号、厂商号MOVAX,0B10AHMOVDI,02CHINT1AHJCfindtpc_notfind;
检查TPC卡是否安装,子设备号、厂商号CMPECX,IO_PLX_SUB_IDJNZfindtpc_notfindMOVAX,0B10AHMOVDI,14HINT1AHJCfindtpc_notfind;
读TPC卡9054芯片I/O基址信息movdwordptrio_9054base_address,ecxandecx,1jzfindtpc_notfind;
检查是否为i/o基址信息movecx,dwordptrio_9054base_addressandecx,0fffffffehmovdwordptrio_9054base_address,ecx;
去除i/o指示位并保存MOVAX,0B10AHMOVDI,18HINT1AHJCfindtpc_notfind;
读TPC卡I/O基址信息movdwordptrio_base_address,ecxandecx,1jzfindtpc_notfind;
检