; programa para probar la vga y el ps2 ; utilizamos caracterĄsticas del 8051 $MOD51 $TITLE () ; constantes CF EQU 00000000b CN EQU 11111111b ; segmento de datos que empieza en 30h DSEG AT 30H ORG 30H punX: DS 1 punY: DS 1 tecla: DS 1 ; reservamos 20 bytes para pila, sera suficiente pila: DS 20 ; segmento de cądigo CSEG AT 0H ;saltamos a cądigo principal jmp MAIN ; rutina de tratamiento de interrupcion para el INT0 ORG 3H jmp RUT_INT0 ; rutina de tratamiento de interrupcion para el INT1 ORG 013H ; saltamos a la verdadera rutina jmp RUT_INT1 ; RUTINA PRINCIPAL MAIN: ; inicializo pila mov SP,#pila mov PunX,#0 mov PunY,#0 ; preparo interrupciones ; interrupciones controladas por IE (bit PCT=1) ; PCT --- PT2 PS PT1 PX1 PT0 PX0 ; 1 0 0 0 0 0 0 0 mov IP,#10000000b ; habilito interrupciones INT1 e INT0 ; EA --- ET2 ES ET1 EX1 ET0 EX0 ; 1 0 0 0 0 1 0 1 mov IE,#10000101b ; habilito INT1 e INT0 por flanco ; TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 ; 0 0 0 0 0 1 0 1 mov TCON,#00000101b ; me paro aqui: jmp aqui ; RUTINA DE TRATAMIENTO DE INTERRUPCION PARA EL INT0 RUT_INT0: ; lee el teclado mov DPTR,#0FF00h movx A,@DPTR anl A,#00000010b jnz seguirINT0 jmp finINT0 seguirINT0: ; hay tecla mov DPTR,#0FF01h movx A,@DPTR mov tecla,A mov DPTR,#0FF20h movx @DPTR,A ; bit 7 de tecla mov DPTR,#0FF10h espera7: movx A,@DPTR anl A,#00010000b jnz espera7 mov DPTR,#0FF11h mov A,PunY movx @DPTR,A mov DPTR,#0FF12h mov A,#0 movx @DPTR,A mov A,tecla anl A,#10000000b RR A RR A RR A RR A RR A RR A RR A mov DPTR,#0FF13h movx @DPTR,A ; bit 6 de tecla mov DPTR,#0FF10h espera6: movx A,@DPTR anl A,#00010000b jnz espera6 mov DPTR,#0FF11h mov A,PunY movx @DPTR,A mov DPTR,#0FF12h mov A,#1 movx @DPTR,A mov A,tecla anl A,#01000000b RR A RR A RR A RR A RR A RR A mov DPTR,#0FF13h movx @DPTR,A ; bit 5 de tecla mov DPTR,#0FF10h espera5: movx A,@DPTR anl A,#00010000b jnz espera5 mov DPTR,#0FF11h mov A,PunY movx @DPTR,A mov DPTR,#0FF12h mov A,#2 movx @DPTR,A mov A,tecla anl A,#00100000b RR A RR A RR A RR A RR A mov DPTR,#0FF13h movx @DPTR,A ; bit 4 de tecla mov DPTR,#0FF10h espera4: movx A,@DPTR anl A,#00010000b jnz espera4 mov DPTR,#0FF11h mov A,PunY movx @DPTR,A mov DPTR,#0FF12h mov A,#3 movx @DPTR,A mov A,tecla anl A,#00010000b RR A RR A RR A RR A mov DPTR,#0FF13h movx @DPTR,A ; bit 3 de tecla mov DPTR,#0FF10h espera3: movx A,@DPTR anl A,#00010000b jnz espera3 mov DPTR,#0FF11h mov A,PunY movx @DPTR,A mov DPTR,#0FF12h mov A,#4 movx @DPTR,A mov A,tecla anl A,#00001000b RR A RR A RR A mov DPTR,#0FF13h movx @DPTR,A ; bit 2 de tecla mov DPTR,#0FF10h espera2: movx A,@DPTR anl A,#00010000b jnz espera2 mov DPTR,#0FF11h mov A,PunY movx @DPTR,A mov DPTR,#0FF12h mov A,#5 movx @DPTR,A mov A,tecla anl A,#00000100b RR A RR A mov DPTR,#0FF13h movx @DPTR,A ; bit 1 de tecla mov DPTR,#0FF10h espera1: movx A,@DPTR anl A,#00010000b jnz espera1 mov DPTR,#0FF11h mov A,PunY movx @DPTR,A mov DPTR,#0FF12h mov A,#6 movx @DPTR,A mov A,tecla anl A,#00000010b RR A mov DPTR,#0FF13h movx @DPTR,A ; bit 0 de tecla mov DPTR,#0FF10h espera0: movx A,@DPTR anl A,#00010000b jnz espera0 mov DPTR,#0FF11h mov A,PunY movx @DPTR,A mov DPTR,#0FF12h mov A,#7 movx @DPTR,A mov A,tecla anl A,#00000001b mov DPTR,#0FF13h movx @DPTR,A mov A,PunY inc A mov PunY,A subb A,#30 jnz finINT0 mov PunY,#0 finINT0: ; lee el teclado mov DPTR,#0FF00h movx A,@DPTR anl A,#00000010b jz super_fin_INT0 jmp RUT_INT0 super_fin_INT0: reti ;******************************************************** ; RUTINA DE TRATAMIENTO DE INTERRUPCION PARA EL INT1 ; DORMIR AL MICRO RUT_INT1: ; desactivar interrupciones anl IE,#01111111b ; guardo estado de la maquina push PSW push ACC push DPH push DPL ; avisamos que int atendida mov DPTR,#0FFFFh movx @DPTR,A volverDormir: ; pongo bit ALF=1, para ponerme en estado FLOATING ; --- T32 SERR IZC P3HZ P2HZ P1HZ ALF ; 0 0 0 0 0 0 0 1 ; IOCON = 0F8h mov 0F8h,#00000001b ; duermo al micro colocandolo en modo Power Down (PD=1), ; y permito que cualquier interrupcion le despierte, continuando la ejecucion ; normal (RPD=1) ; SMOD HPD RPD --- GF1 GF0 PD IDL ; 0 0 1 0 0 0 1 0 orl PCON,#00100000b orl PCON,#00000010b ; hago una lectura -> esta el micro dormido? si es asi volvemos mov DPTR,#0FFFFh movx A,@DPTR jz volverDormir ; recupero estado de la maquina pop DPL pop DPH pop ACC pop PSW ; activar interrupciones orl IE,#10000000b ;volvemos reti ; caracter 0000000 => 0 ORG 100000000000000b DB CF,CF,CF,CN,CN,CN,CN,CF,CF,CF ORG 100000000010000b DB CF,CF,CN,CN,CF,CF,CN,CN,CF,CF ORG 100000000100000b DB CF,CF,CN,CN,CN,CF,CN,CN,CF,CF ORG 100000000110000b DB CF,CF,CN,CN,CN,CN,CN,CN,CF,CF ORG 100000001000000b DB CF,CF,CN,CN,CF,CN,CN,CN,CF,CF ORG 100000001010000b DB CF,CF,CN,CN,CF,CF,CN,CN,CF,CF ORG 100000001100000b DB CF,CF,CF,CN,CN,CN,CN,CF,CF,CF ORG 100000001110000b DB CF,CF,CF,CF,CF,CF,CF,CF,CF,CF ; caracter 0000001 => 1 ORG 100000010000000b DB CF,CF,CF,CF,CN,CN,CF,CF,CF,CF ORG 100000010010000b DB CF,CF,CF,CN,CN,CN,CF,CF,CF,CF ORG 100000010100000b DB CF,CF,CF,CF,CN,CN,CF,CF,CF,CF ORG 100000010110000b DB CF,CF,CF,CF,CN,CN,CF,CF,CF,CF ORG 100000011000000b DB CF,CF,CF,CF,CN,CN,CF,CF,CF,CF ORG 100000011010000b DB CF,CF,CF,CF,CN,CN,CF,CF,CF,CF ORG 100000011100000b DB CF,CF,CF,CN,CN,CN,CN,CF,CF,CF ORG 100000011110000b DB CF,CF,CF,CF,CF,CF,CF,CF,CF,CF END