3.¿ØÖƳÌÐòÉè¼Æ
3.1 ¿ØÖƳÌÐòÉè¼ÆË¼Â·ËµÃ÷
³õʼ»¯8255оƬ£¬ÉèÖù¤×÷·½Ê½¿ØÖÆ×ÖΪ89£¨100010001B£©£¬¼´A¡¢B¿ÚΪÊä³ö£¬·Ö±ð¿ØÖÆLEDµÄ¶ÎÑ¡¡¢Î»Ñ¡£¬C¿ÚÊäÈë¡£ÏÂͼΪ¿ØÖÆ×Ö£º
ÒÔ²ÉÑùÎåÊ®´ÎΪһÖÜÆÚ£¬ÇóµÃÎåÊ®´Î²ÉÑùµÄ×ÜÖµ¡£È»ºó³ýÒÔ50£¬µÃµ½²ÉÑù50´ÎµÄƽ¾ùÖµ£¬´æÈëLastAD¡£ÔÚÿһ´Î²ÉÑù¹ý³ÌÖУ¬¶¼ÔÚPC»úºÍLEDÉÏÊä³öÉÏÒ»ÖÜÆÚ²ÉÑùת»¯µÃµ½µÄ¹âÕÕÇ¿¶È£¨µ¥Î»£ºÀÕ¿Ë˹£©¡£¾ßÌåת»¯¹ý³ÌΪ£º
²ÉÑùµÃµ½µÄÄ£ÄâÖµ¾¹ýADת»¯ºóΪµçѹֵ£¬µçѹ·¶Î§Îª0-5V¡£¶ø¿¼Âǵ½Êµ¼ÊÉú»îÖУ¬Ò»°ãÕÕÃ÷Ϊ200lux£¬ÖصãÕÕÃ÷Ϊ300lux£¬ËùÒÔʵÑéÖпÉÏÔʾµÄ¹âÕÕÇ¿¶ÈΪ0-500lux¡£ÓÚÊDzο¼Á½ÕßÖ®¼äµÄÏßÐÔ¹ØÏµ£¬¶¨ÏÂÈëÏÂͼµÄ¹ØÏµ£º
ͼ10 µçѹ-¹âÕնȺ¯Êý(¼°¸±±¾º¯Êý)
×¢£º±¾ÊµÑ黹֯×÷ÁËÒ»¸ö5V¶ÔÓ¦300luxµÄ¸±±¾³ÌÐò¡£
3.2 ³ÌÐòÁ÷³Ìͼ
¿ªÊ¼ ³õʼ»¯8255 CX=50 ²ÉÑù£¬¼ÆËã²ÉÑù×ÜÖµ °ÙλÊý/ÕûÊý²¿·Ö ÈëBUF/BUFFER+4£¬ ʮλÊý/µÚһλСÊý ÈëBUF+1/BUFFER+6£¬ ¸öλÊý/µÚ¶þλСÊý ÈëBUF+2/BUFFER+7¡£ µ÷ÓÃDOSµÄ9ºÅ¹¦ÄÜÔÚPC»úÉÏÊä³öµçѹ¡£ ²ÉÑùƽ¾ùÖµËÍ8255£¬ 8255µÄPA¿Ú¶ÎÑ¡¡¢PB¿Úλѡ¡£ ÔÚLEDÉÏÊä³öһλÊý¾Ý£¬ λѡÊý¾ÝDATA2×óÒÆÒ»Î»¡£ ÖØ¸´Èý´ÎΪһ¸öÖÜÆÚ¡£ È»ºó»¹ÔDATA2=0FEH¡£ ÑÓʱ£¬ i -- i=0? ¼ÌÐøÏÂÒ»´Î²ÉÑù Y ¼ÆËã²ÉÑùƽ¾ùÖµ N ³ÌÐòÇ¿ÖÆ¹Ø±Õ ½áÊø ͼ1-11 ³ÌÐòÁ÷³Ìͼ
3.3¿ØÖƳÌÐò
.MODEL TINY PCIBAR3 EQU 1CH ;8λI/O¿Õ¼ä»ùµØÖ·(Ëü¾ÍÊÇʵÑéÒǵĻùµØÖ·,ҲΪDMA & 32 BIT RAM°å¿¨ÉϵÄ8237Ìṩ»ùµØÖ·) Vendor_ID EQU 10EBH ;³§ÉÌIDºÅ Device_ID EQU 8376 ;É豸IDºÅ START2: CALL AD0809 XOR AH,AH ;²ÉÑùÖµÔÚALÖÐ,AHÇå0ºó£¬AX¼´Îª²ÉÑùÖµ ADD BX,AX ;BXΪ²ÉÑù×ÜÖµ CALL DISPLAY_PC
;ÔÚPC»úÉÏÏÔʾ½á¹û
CALL DISPLAY_LED
.STACK 100 .DATA
ADDR_0809 DW 00F0H LastAD DB 0 ;ÉÏÒ»´ÎADת»»Öµ IO_Bit8_BaseAddress DW ? BUFFER DB ' H . V$' msg0 DB 'BIOS²»Ö§³Ö·ÃÎÊPCI $' msg1 DB 'ÕÒ²»µ½Star PCI9052°å¿¨ $' msg2 DB'¶Á8λI/O¿Õ¼ä»ùµØÖ·Ê±³ö´í$' msg3 DB 'ADת»»½á¹û(ǰ±ßÊÇ16½øÖÆÊý,ºó±ßÊÇÊ®½øÖÆÊý): $'
COM_ADD DW 00E3H ;¿ØÖÆ¿ÚÆ«ÒÆÁ¿ PA_ADD DW 00E0H ;PA¿ÚÆ«ÒÆÁ¿ PB_ADD DW 00E1H ;PB¿ÚÆ«ÒÆÁ¿ PC_ADD DW 00E2H ;PC¿ÚÆ«ÒÆÁ¿ LED_DATA DB 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h,7Fh,6Fh ;0-9µÄÆß¶Î´úÂë±í SHIFT DB 0FEH ;ÓÃÓÚλѡ .CODE
START: MOV AX,@DATA MOV DS,AX NOP CALL InitPCI CALL ModifyAddress ;¸ù¾ÝPCIÌṩµÄ»ùµØÖ·,½«Æ«ÒƵØÖ·×ª»¯ÎªÊµµØÖ· MOV AH,09H LEA DX,msg3 INT 21H CALL Init8255 ;³õʼ»¯8255A XOR AL,AL JMP START6
START1: MOV CX,50 ;²ÉÑùÎåÊ®´Î MOV BX,0 ;ÀÛ¼ÆÎåÊ®´Î²ÉÑùÖµ
;LEDÏÔʾÉÏÒ»´Î²ÉÑùµÄ½á¹ûLastAD LOOP START2 MOV AX,50 XCHG AX,BX DIV BL ;ÎåÊ®´ÎµÄƽ¾ùÖµ,BL=50,ƽ¾ùÖµÔÚALÖУ¬ÓàÊýÔÚAHÖÐ CMP AL,LastAD JZ START3
START6: MOV LastAD,AL
;LastADֵΪADת»»Öµ START3: CALL IfExit JZ START1 JMP Exit
AD0809 PROC NEAR MOV SI,CX MOV AL,0
MOV DX,ADDR_0809 OUT DX,AL
MOV DX,IO_Bit8_BaseAddress MOV CX,100 AD08091:IN AL,DX
LOOP AD08091
;ÑÓʱ,µÈ´ýADת»»Íê³É
MOV DX,ADDR_0809 IN AL,DX MOV CX,SI RET
AD0809 ENDP
ToChar PROC NEAR ;ת»¯Îª¿ÉÏÔʾµÄ16½øÖÆÊý ADD AL,'0' CMP AL,'9' JBE ToChar1 ADD AL,07H
ToChar1: RET ToChar ENDP
DISPLAY_PC PROC NEAR MOV SI,AX ;Ï൱ÓÚPUSH MOV DI,BX MOV AL,LastAD
;½«ADת»»Öµ¶ÁÈëAXÖÐ MOV AH,AL AND AL,0FH CALL ToChar MOV BUFFER + 1,AL MOV AL,AH AND AL,0F0H ROR AL,4 CALL ToChar MOV BUFFER,AL MOV AL,AH XOR AH,AH MOV BL,51
;255/5 (16½øÖƵÄ1 = 1/51V) DIV BL OR AL,'0'
;ת»¯Îª¿ÉÏÔʾµÄ10½øÖÆÊý MOV BUFFER + 4,AL
;ÕûÊý²¿·Ö MOV AL,10 MUL AH DIV BL OR AL,'0' MOV BUFFER + 6,AL
;µÚһλСÊý MOV AL,10 MUL AH DIV BL OR AL,'0' MOV BUFFER + 7,AL
;µÚ¶þλСÊý MOV DX,43 MOV AH,02H INT 10H ;¶¨Î»¹â±ê LEA DX,BUFFER MOV AH,09H INT 21H ;ÏÔʾ½á¹û MOV AX,SI ;Ï൱ÓÚPOP
MOV BX,DI RET
DISPLAY_PC ENDP
TO_LED PROC NEAR ;LEDÏÔʾ LEA BX,LED_DATA XLAT ;¾´úÂë±íת»»ÎªÆß¶ÎLED±íÖеĶÎÂ룬AL=BX[AL] MOV DX,PA_ADD ;´Ó8255A µÄPA¿Ú¶ÁÈ¡Êý×ÖÁ¿,¶ÎÑ¡ OUT DX,AL MOV AL,SHIFT ;Æß¶ÎLEDµÄλѡ£¬0FEHѡȡ×îµÍλ£¬Î»Ñ¡ MOV DX,PB_ADD ;PB¿Úλѡ OUT DX,AL CALL DLTIME ;ÑÓʱ ROL AL,1
;Ïòǰѡȡ´ÎµÍλ£¬Î»Ñ¡ MOV SHIFT,AL MOV AL,0FFH
;½ûÖ¹ÏÔʾ,È«ÖÃΪÃð,·ÀÖ¹Êý×Ö´®Î» OUT DX,AL RET TO_LED ENDP
DISPLAY_LED PROC NEAR MOV SI,AX MOV DI,BX XOR AX,AX MOV AL,BUFFER + 7 SUB AL,30H CALL TO_LED
;ÔÚLEDÉÏÏÔʾÓÒÆðµÚһλÊý MOV AL,BUFFER + 6 SUB AL,30H CALL TO_LED
;ÏÔʾµÚ¶þλÊý MOV AL,BUFFER + 4 SUB AL,30H CALL TO_LED ;ÏÔʾµÚÈýλÊý MOV SHIFT,0FEH
;»Ö¸´SHIFTÔÖµ£¬Ó¦ÓÃÓÚÏÂÒ»´ÎÊä³ö MOV AX,SI MOV BX,DI RET
DISPLAY_LED ENDP
DLTime PROC NEAR MOV SI,CX MOV CX,1563 DLT: NOP ;¿Õ²Ù×÷£¬ÓÃÓÚÑÓʱ LOOP DLT
;Ñ»·ÑÓʱ,ÑÓʱ1.25ms MOV CX,SI RET
DLTime ENDP
IfExit PROC NEAR MOV SI,AX MOV DI,DX MOV DL,0FFH MOV AH,06H INT 21H MOV AX,SI MOV DX,DI RET IfExit ENDP
InitPCI PROC NEAR MOV AH,00H MOV AL,03H INT 10H ;ÇåÆÁ MOV AH,0B1H MOV AL,01H INT 1AH CMP AH,0 JZ InitPCI2 LEA DX,msg0 InitPCI1: MOV AH,09H INT 21H JMP Exit
InitPCI2: MOV AH,0B1H MOV AL,02H MOV CX,Device_ID MOV DX,Vendor_ID
MOV SI,0 INT 1AH
JNC InitPCI3
;ÊÇ·ñ´æÔÚStar PCI9052°å¿¨ LEA DX,msg1 JMP InitPCI1 InitPCI3: MOV DI,PCIBAR3 MOV AH,0B1H MOV AL,09H INT 1AH
;¶ÁÈ¡¸Ã¿¨PCI9052»ùµØÖ· JNC InitPCI4 LEA DX,msg2 JMP InitPCI1 InitPCI4: AND CX,0FFFCH MOV IO_Bit8_BaseAddress,CX RET InitPCI ENDP
Init8255 PROC NEAR MOV DX,COM_ADD MOV AL,89H
;A¡¢B¿ÚΪÊä³ö(¶ÎÑ¡£¬Î»Ñ¡)£¬C¿ÚÊäÈë OUT DX,AL MOV DX,PA_ADD
;LEDȫϨÃð MOV AL,0FFH OUT DX,AL RET Init8255 ENDP
ModifyAddress PROC NEAR ADD ADDR_0809,CX ;ADDR_0809=34F0H ADD COM_ADD,CX ADD PA_ADD,CX ADD PB_ADD,CX ADD PC_ADD,CX RET
ModifyAddress ENDP Exit: MOV AH,4CH INT 21H END START
°Ù¶ÈËÑË÷¡°77cn¡±»ò¡°Ãâ·Ñ·¶ÎÄÍø¡±¼´¿ÉÕÒµ½±¾Õ¾Ãâ·ÑÔĶÁÈ«²¿·¶ÎÄ¡£Êղر¾Õ¾·½±ãÏ´ÎÔĶÁ£¬Ãâ·Ñ·¶ÎÄÍø£¬Ìṩ¾µäС˵½ÌÓýÎÄ¿â¹âÕÕÇ¿¶È²âÁ¿ÒÇ(3)ÔÚÏßÈ«ÎÄÔĶÁ¡£
Ïà¹ØÍÆ¼ö£º