Bobinadeira PAGE 1 1 ; Programa Controlador de Bobinadeira 2 ; Microcontrolador AT89S52 3 ; Autor: Cion Cassiano Basso 4 ; Versão: 1.0 - última atualização: 26 junho 2016 5 6 ; Descrição do hardware: Este programa, escrito na linguagem assembly do 8051, efetua a contagem do n 7 ; O hardware, baseado no microcomputador com o AT89S52, é constituído por um teclado com cinco chaves 8 ; Os 3 displays operam de forma multiplexada para indicar a casa das Centenas (Cent), Dezenas (Dez) e 9 ; A contagem do número de espiras é realizada no sistema decimal de forma decrescente e a decodificaç 10 ; O código 7 segmentos para os displays é escrito na porta P0, à qual está conectado o buffer de corr 11 ; A multiplexação dos displays é realizada pelo acionamento de 3 transistores PNP, conectados nos ter 12 ; As 5 teclas, conectadas nos bits p1.0, p1.1, p1.2, p1.3 e p1.4, são empregadas para a entrada do nú 13 ; As teclas são configuradas como: incremento (Up), decremento (Down), deslocamento para direita (Rig 14 ; O sensor óptico, ligado à porta p3.7, detecta a passagem de uma lingueta. A cada acionamento, a con 15 ; A energia aplicada ao motor de tracionamento do carretel é controlada por um relé, e seu transistor 16 17 ; Descrição do firmware: A varredura dos displays multiplexados é realizada por uma Rotina de Serviço 18 ; A ISRVarDp é chamada a cada término de contagem de 700 ciclos realizada pelo temporizador/contador 19 ; O C/T 1 é inicializado com 64.836 e conta até 65.536, totalizando 700 ciclos de máquina (CM), o que 20 ; Ao final da contagem do temporizador, um pedido de interrupção é gerado e o programa é desviado par 21 ; No programa principal, são realizadas as seguintes inicializações: (i)) das variáveis da contagem ( 22 ; Após as inicializações, é chamada a subrotina para a leitura do número de espiras (LeEspiras) que d 23 ; Ao retornar da LeEspiras, o número de espiras é mantido piscado até que a tecla Enter seja pression 24 ; A seguir, é verificado se a contagem foi encerrada. Se não, é chamada a subrotina de leitura do sen 25 ; Caso a contagem tenha alcançado o valor 000, os displays são mantidos piscando (subrotina PiscaDp) 26 27 ; --------------------------------------------------------------------------------------------------- 28 ; Definição das variáveis 29 0020 30 Unid equ 20h ; armazena a casa da Unidades 0021 31 Dez equ 21h ; armazena a cada das Dezenas 0022 32 Cent equ 22h ; armazena a casa das Centenas 0023 33 BufUnid equ 23h ; armazena os valores apresentados nos displays - Unidades 0024 34 BufDez equ 24h ; Dezenas 0025 35 BufCent equ 25h ; Centenas 0026 36 DpAtivo equ 26h ; código do display ativo (0 - Unidade, 1 - Dezena e 2 - Centena) 0027 37 Tecla equ 27h ; código da tecla pressionada(0 - Up, 1 - Down, 2 - Left, 3 - Right e 4 - E 0028 38 Count equ 28h ; contador de uso geral 0029 39 CountAtL equ 29h ; contador para atraso - byte menos significativo 002A 40 CountAtH equ 2ah ; contador para atraso - byte mais significativo 41 0080 42 ULN2803 equ p0 ; buffer de corrente para acionamento dos displays de 7 segmentos 43 0090 44 TeclaUp equ p1.0 ; tecla Up 0091 45 TeclaDown equ p1.1 ; tecla Down 0092 46 TeclaRight equ p1.2 ; tecla Right 0093 47 TeclaLeft equ p1.3 ; tecla Left 0094 48 TeclaEnter equ p1.4 ; tecla Enter 49 00A7 50 AcionaCent equ p2.7 ; acionamento display Cent 00A6 51 AcionaDez equ p2.6 ; acionamento display Dez 00A5 52 AcionaUnid equ p2.5 ; acionamento display Unid 53 00B0 54 MotorCar equ p3.0 ; acionamento do motor de tracionamento do carretel da bobinadeira 00B7 55 Sensor equ p3.7 ; sensor óptico para contagem do número de voltas (espiras) 56 FD44 57 TempoISR equ 64836 ; valor de carregamento do C/T 1 para gerar interrupção 00FF 58 TempoDp equ 0ffh ; tempo de atraso 59 60 ; ------------------------------------------------------------------------------------------------- 61 org 0 0000 02001E 62 jmp Main ; após reset, desvia para código do programa principal 63 ; ................................................................................................. 64 org 1bh ; vetor da interrupção do C/T 1 001B 0201EB 65 jmp ISRVarDp ; desvia para Rotina de Serviço de Interrupção do C/T 1 66 ; ------------------------------------------------------------------------------------------------- 67 68 Main: ; Inicializações 001E C2B0 69 clr MotorCar ; desliga o motor de tracionamento do carretel 0020 752000 70 mov Unid,#0 ; inicializa Cent, Dez e Unid com 000 0023 752100 71 mov Dez,#0 0026 752200 72 mov Cent,#0 73 0029 758910 74 mov tmod,#00010000b ; programa C/T 1 como contador de 16 bits, com recarga 002C 758DFD 75 mov th1,#high(TempoISR); carrega o byte mais significativo no C/T 1 002F 758B44 76 mov tl1,#low(TempoISR) ; carrega o byte menos significativo no C/T 1 0032 75A888 77 mov ie,#10001000b ; habilita interrupção global e interrupção pelo C/T 1 0035 D28E 78 setb tr1 ; dispara contagem do C/T 1 79 ; Fim das inicializações 80 0037 752602 81 mov DpAtivo,#2 ; inicia com display da casa das centenas 003A 12007A 82 call LeEspiras ; lê o número de espiras, só retornando quando a tecla Enter for pr 003D 3094FD 83 jnb TeclaEnter,$ ; aguarda liberar tecla Enter 0040 D294 84 setb TeclaEnter ; configura tecla Enter como entrada, para testá-la posteriormente 0042 120221 85 PiscaEsp: call PiscaDp ; mantém displays piscando 0045 2094FA 86 jb TeclaEnter,PiscaEsp ; aguarda tecla Enter ser pressionada 0048 3094FD 87 jnb TeclaEnter,$ ; aguarda liberar a tecla Enter 88 ; O número de espiras já foi definido 89 90 ; Início da contagem decrescente do número de espiras 004B D2B0 91 setb MotorCar ; liga motor de tracionamento do carretel 004D 852023 92 LoopCnt: mov BufUnid,Unid ; carrega casa das unidades no buffer 0050 852124 93 mov BufDez,Dez ; casa das dezenas 0053 852225 94 mov BufCent,Cent ; casa das centenas 95 ; código para testar se contagem foi concluída (Cent = Dez = Unid = 0) 0056 E520 96 mov a,Unid ; obtém unidades 0058 B4000D 97 cjne a,#0,Contagem ; continua contagem se (Unid != 0) 005B E521 98 mov a,Dez 005D B40008 99 cjne a,#0,Contagem ; continua contagem se (Dez != 0) 0060 E522 100 mov a,Cent 0062 B40003 101 cjne a,#0,Contagem ; continua contagem se (Cent != 0) 0065 02006D 102 jmp FimCont ; aqui, Cent = Dez = Unid = 0, ou seja, fim da contagem de voltas 0068 1201B6 103 Contagem: call LeSensor ; lê sensor óptico 006B 80E0 104 jmp LoopCnt ; mantém contagem 105 006D C2B0 106 FimCont: clr MotorCar ; desliga motor do carretel da bobinadeira 006F 120221 107 PiscaFim: call PiscaDp ; mantém piscando o fim da contagem 0072 2094FA 108 jb TeclaEnter,PiscaFim ; aguarda tecla Enter ser pressionada 0075 3094FD 109 jnb TeclaEnter,$ ; aguarda liberar tecla Enter 0078 80A4 110 jmp Main ; reinicia programa 111 112 ;---------------------------------------------------------------------------------------------------- 113 ; SUBROTINAS 114 ; 115 ;Subrotina: LeEspiras 116 ;Descrição: Efetua a leitura do teclado e ajusta os dígitos das casas das Centenas, Dezenas e Unidade 117 ;Entrada: nada 118 ;Saída: DpAtivo, Cent, Dez, Unid 119 ;Destrói: a, BufUnid, BufDez e BufCent 120 ;Chama: LeTEc 007A 852023 121 LeEspiras: mov BufUnid,Unid ; atualiza buffers com valor da contagem 007D 852124 122 mov BufDez,Dez 0080 852225 123 mov BufCent,Cent 124 125 ;o código a seguir pisca o dígito ativo para informar ao usuário qual casa será ajustada 0083 7801 126 Le: mov r0,#1 ; pisca uma vez 0085 E526 127 mov a,DpAtivo ; obtém display ativo 0087 B4021D 128 cjne a,#2,PiscaDez ; testa display ativo 008A 75250A 129 PiscaCent: mov BufCent,#0ah ; apaga display da casa das Centenas (o índice 0ah na Tabela de códig 008D 752810 130 mov Count,#10h ; contador do número de vezes que a subrotina Atraso será chamada 0090 12025D 131 CentOff: call Atraso ; mantém display apagado 0093 D528FA 132 djnz Count,CentOff ; enquanto ()Count != 0), mantém piscando 0096 852225 133 mov BufCent,Cent ; restabelece casa das centenas 0099 752810 134 mov Count,#10h 009C 12025D 135 CentOn: call Atraso ; mantém display aceso 009F D528FA 136 djnz Count,CentOn 00A2 D8E6 137 djnz r0,PiscaCent 00A4 0200E1 138 jmp InicLer 139 00A7 B4011D 140 PiscaDez: cjne a,#1,PiscaUnid ; display ativo é da casa das Dezenas 00AA 75240A 141 PDez: mov BufDez,#0ah 00AD 752810 142 mov Count,#10h 00B0 12025D 143 DezOff: call Atraso 00B3 D528FA 144 djnz Count,DezOff 00B6 852124 145 mov BufDez,Dez 00B9 752810 146 mov Count,#10h 00BC 12025D 147 DezOn: call Atraso 00BF D528FA 148 djnz Count,DezOn 00C2 D8E6 149 djnz r0,PDez 00C4 0200E1 150 jmp InicLer 151 00C7 75230A 152 PiscaUnid: mov BufUnid,#0ah ; display ativo é da casa da Unidades 00CA 752810 153 mov Count,#10h 00CD 12025D 154 UnidOff: call Atraso 00D0 D528FA 155 djnz Count,UnidOff 00D3 852023 156 mov BufUnid,Unid 00D6 752810 157 mov Count,#10h 00D9 12025D 158 UnidOn: call Atraso 00DC D528FA 159 djnz Count,UnidOn 00DF D8E6 160 djnz r0,PiscaUnid 161 00E1 120179 162 InicLer: call LeTec ; lê o teclado 00E4 E527 163 mov a,Tecla ; move tecla lida para testá-la 00E6 B4002C 164 cjne a,#0,ChkDown ; verifica se a tecla Up foi pressionada. Se não, testa tecla Down 165 166 ;Código para tratar da tecla Up 00E9 E526 167 mov a,DpAtivo ; verifica qual casa deve ser incrementada 00EB B4020C 168 cjne a,#2,DpDez0 ; se não for a casa das Centenas, desvia 00EE E522 169 mov a,Cent 00F0 04 170 inc a ; incrementa Cent, porém ainda não o atualiza 00F1 B40A02 171 cjne a,#0ah,Prox0 ; verifica se ultrapassou o valor 9 00F4 7400 172 mov a,#0 ; se sim, ajusta para 0 (contagem BCD) 00F6 F522 173 Prox0: mov Cent,a ; atualiza casa das Centenas (Cent++) 00F8 8080 174 jmp LeEspiras ; lê nova tecla 00FA B4010C 175 DpDez0: cjne a,#1,DpUnid1 ; se não for a casa das Dezenas, devia 00FD E521 176 mov a,Dez 00FF 04 177 inc a 0100 B40A02 178 cjne a,#0ah,Prox1 0103 7400 179 mov a,#0 0105 F521 180 Prox1: mov Dez,a ; atualiza casa das Dezenas (Dez++) 0107 017A 181 jmp LeEspiras 0109 E520 182 DpUnid1: mov a,Unid 010B 04 183 inc a 010C B40A02 184 cjne a,#0ah,Prox2 010F 7400 185 mov a,#0 0111 F520 186 Prox2: mov Unid,a ; atualiza casa das Unidades (Unid++) 0113 017A 187 jmp LeEspiras 188 189 ;Código para tratar da tecla Down 0115 B4012C 190 ChkDown: cjne a,#1,ChkLeft 0118 E526 191 mov a,DpAtivo 011A B4020C 192 cjne a,#2,DpDez2 011D E522 193 mov a,Cent 011F 14 194 dec a 0120 B4FF02 195 cjne a,#0ffh,Prox3 0123 7409 196 mov a,#9 0125 F522 197 Prox3: mov Cent,a ; atualiza casa das Centenas (Cent--) 0127 017A 198 jmp LeEspiras 0129 B4010C 199 DpDez2: cjne a,#1,DpUnid2 012C E521 200 mov a,Dez 012E 14 201 dec a 012F B4FF02 202 cjne a,#0ffh,Prox4 0132 7409 203 mov a,#9 0134 F521 204 Prox4: mov Dez,a ; atualiza casa das Dezenas (Dez--) 0136 017A 205 jmp LeEspiras 0138 E520 206 DpUnid2: mov a,Unid 013A 14 207 dec a 013B B4FF02 208 cjne a,#0ffh,Prox5 013E 7409 209 mov a,#9 0140 F520 210 Prox5: mov Unid,a ; atualiza casa das Unidades (Unid--) 0142 017A 211 jmp LeEspiras 212 213 ;Código para tratar da tecla Left 0144 B40217 214 ChkLeft: cjne a,#2,ChkRight 0147 E526 215 mov a,DpAtivo 0149 B40205 216 cjne a,#2,DpDez3 014C 752600 217 mov DpAtivo,#0 ; desloca de DpCent para DpUnid 014F 017A 218 jmp LeEspiras 0151 B40105 219 DpDez3: cjne a,#1,DpUnid3 0154 752602 220 mov DpAtivo,#2 ; desloca de DpDez para DpCent 0157 017A 221 jmp LeEspiras 0159 752601 222 DpUnid3: mov DpAtivo,#1 ; desloca de DpUnid para DpDez 015C 017A 223 jmp LeEspiras 224 225 ;Código para tratar da tecla Right 015E B40317 226 ChkRight: cjne a,#3,Enter 0161 E526 227 mov a,DpAtivo 0163 B40205 228 cjne a,#2,DpDez4 0166 752601 229 mov DpAtivo,#1 ; desloca de DpCent para DpDez 0169 017A 230 jmp LeEspiras 016B B40105 231 DpDez4: cjne a,#1,DpUnid4 016E 752600 232 mov DpAtivo,#0 ; desloca de DpDez para DpUni 0171 017A 233 jmp LeEspiras 0173 752602 234 DpUnid4: mov DpAtivo,#2 ; desloca de DpUni para DpCent 0176 017A 235 jmp LeEspiras 236 237 ;Código para tecla Enter 0178 22 238 Enter: ret ; fim da leitura das espiras 239 240 ; ----------------------------------------------------------------------------------------- 241 ;Subrotina: LeTec 242 ; Descrição: Efetuar a leitura do teclado e retorna na variável Tecla os seguintes códigos: 243 ; Tecla = 0 para Up 244 ; Tecla = 1 para Down 245 ; Tecla = 2 para Right 246 ; Tecla = 3 para Left 247 ; Tecla = 4 para Enter 248 ;Entrada: nada 249 ;Saída: Tecla 250 ;Destrói: p1 251 ;Chama: Atraso 252 0179 75901F 253 LeTec: mov p1,#00011111b ; teclas estão ligadas nos pinos p1.0 a p1.4 017C 209009 254 jb TeclaUp,TDown ; se tecla Up não foi acionada, testa tecla Down 017F 12025D 255 call Atraso ; TecUp acionada, chama atraso para eliminar repique 0182 752700 256 mov Tecla,#0 ; retorna o código 0 para tecla Up 0185 0201B5 257 jmp SaiLt 0188 209109 258 TDown: jb TeclaDown,TLeft ; se tecla Down não foi acionada, testa tecla Left 018B 12025D 259 call Atraso 018E 752701 260 mov Tecla,#1 ; retorna o código 1 tecla Down 0191 0201B5 261 jmp SaiLt 0194 209309 262 TLeft: jb TeclaLeft,TRight ; se Tecla Left não foi acionada, testa tecla Rigth 0197 12025D 263 call Atraso 019A 752702 264 mov Tecla,#2 ; retorna o código 2 para tecla Left 019D 0201B5 265 jmp SaiLt 01A0 209209 266 TRight: jb TeclaRight,TEnter ; se tecla Right não foi acionada, testa tecla Enter 01A3 12025D 267 call Atraso 01A6 752703 268 mov Tecla,#3 ; retorna o código 3 para a tecla Right 01A9 0201B5 269 jmp SaiLt 01AC 2094CA 270 TEnter: jb TeclaEnter,LeTec ; se nenhuma tecla foi pressionada, retorna à leitura 01AF 12025D 271 call Atraso 01B2 752704 272 mov Tecla,#4 ; retorna o código 4 para a tecla Enter 01B5 22 273 SaiLt: ret 274 275 ;---------------------------------------------------------------------------------- 276 ;Subrotina: LeSensor 277 ;Descrição: Efetua a leitura do sensor óptico e atualiza a contagem BCD decrescente 278 ;Entrada: Unid, Dez, Cent 279 ;Saída: Unid, Dez, Cent, p3.1 280 ;Destrói: a, b, psw, sensor 281 ;Chama: Atraso 282 01B6 D2B7 283 LeSensor: setb Sensor ; configura bit p3.7 como saída 01B8 20B7FB 284 jb Sensor,LeSensor ; enquanto sensor não for ativado, aguarda 01BB 30B7FD 285 jnb Sensor,$ ; sensor ativado, agora aguarda sensor retornar ao nível "1" 01BE 12025D 286 call Atraso ; atraso para evitar o repique 01C1 12025D 287 call Atraso 01C4 E521 288 mov a,Dez ; compõe um byte com as casas das dezenas e unidades 01C6 C4 289 swap a 01C7 4520 290 orl a,Unid 01C9 F5F0 291 mov b,a ; salva contagem 292 ;o código a seguir efetua uma subtração em BCD, utilizando o complemento de 100 293 ;a técnica define que: oper1 - oper2 = oper1 + (-oper2), onde -oper2 = 99 - oper2 + 1 01CB 75D000 294 mov psw,#0 ; limpa flags 01CE 7499 295 mov a,#99h ; subtração BCD por complemento de 100 01D0 9401 296 subb a,#1 ; faz a = 99 - 1 01D2 04 297 inc a ; faz a = 99 - 1 + 1, ou seja a = -1 01D3 25F0 298 add a,b ; faz a = (-1) + contagem 01D5 D4 299 da a ; ajusta contagem para decimal 300 ; subtração BCD concluída 01D6 F5F0 301 mov b,a ; salva contagem decrescida no reg. B 01D8 54F0 302 anl a,#0f0h ; isola casa das dezenas 01DA C4 303 swap a ; permuta nibbles 01DB F521 304 mov Dez,a ; salva contagem da casa das dezenas 01DD E5F0 305 mov a,b ; recupera contagem 01DF 540F 306 anl a,#0fh ; preserva nibble inferior 01E1 F520 307 mov Unid,a ; salva contagem da casa das unidades 01E3 E5F0 308 mov a,b ; recupera contagem 01E5 B49902 309 cjne a,#99h,Sai ; verifica se houve decréscimo de zero, se não Sai 01E8 1522 310 dec Cent ; se sim, faz Cent-- 01EA 22 311 Sai: ret 312 ;----------------------------------------------------------------------------------------------- 313 ;Subrotina: ISRVarDp 314 ;Descrição: Rotina de Serviço da Interrupção para varredura dos displays multiplexados 315 ;A chamada ocorre por interrupção provocada pelo fim da contagem do temporizador 1 316 ;O temporizador é carregado para efetuar a contagem de 1.000 ciclos, o que corresponde a 1 ms 317 ;O contéudo dos Buffers são enviados ao 4511 para decoficação BCD em 7 segmentos 318 ;O display corresponde a cada casa, será ativido individualmente na sequência: Unid - Dez - Cent 319 ;Entrada: BufUnid, BufDez, BufCent 320 ;Destrói: P2, temporizador 1 321 ;Chama: AtrasoDp 322 01EB C28E 323 ISRVarDp: clr tr1 ; cessa contagem do temporizador 1 01ED C0E0 324 push acc ; preserva a 01EF 900272 325 mov dptr,#Tab7Seg ; apontador para tabela com códigos 7 segmentos 326 01F2 E523 327 MostraDp0:mov a,BufUnid ; recupera valor das unidades 01F4 93 328 movc a,@a+dptr ; obtém código da tabela 01F5 F580 329 mov ULN2803,a ; escreve código 7 segmentos no buffer de corrente 01F7 C2A5 330 clr AcionaUnid ; ativa display das Unidades 01F9 120252 331 call AtrasoDp ; mantém dígito ativado por um tempo 01FC D2A5 332 setb AcionaUnid ; desativa display das Unidades 333 01FE E524 334 MostraDP1:mov a,BufDez ; valor das Dezenas 0200 93 335 movc a,@a+dptr 0201 F580 336 mov ULN2803,a 0203 C2A6 337 clr AcionaDez 0205 120252 338 call AtrasoDp 0208 D2A6 339 setb AcionaDez 340 020A E525 341 MostraDp2:mov a,BufCent ; valor das Centenas 020C 93 342 movc a,@a+dptr 020D F580 343 mov ULN2803,a 020F C2A7 344 clr AcionaCent 0211 120252 345 call AtrasoDp 0214 D2A7 346 setb AcionaCent 347 348 0216 758DFD 349 SaiISR: mov th1,#high(TempoISR) ; recarrega temporizador 0219 758B44 350 mov tl1,#low(TempoISR) 021C D28E 351 setb tr1 ; dispara temporizador 021E D0E0 352 pop acc ; recupera a 0220 32 353 reti ; retorna da ISR 354 ; --------------------------------------------------------------------------------------------------- 355 ;Subrotina: PiscaDP 356 ;Descrição: Efetua a ativação/desativação dos displays. 357 ;Primeiro apresenta a contagem armazenada nas variáveis centenas, dezenas e unidade. seguido do desli 358 ;Entrada: BufUnid, BufDez, BufCent 359 ;Destrói: Count 360 ;Chama: Atraso 361 0221 852023 362 PiscaDp: mov BufUnid,Unid ; atualiza buffer das unidades 0224 852124 363 mov BufDez,Dez ; atualiza buffer das dezenas 0227 852225 364 mov BufCent,Cent ; atualiza buffer das centenas 022A 75280A 365 mov Count,#10 ; tempo da piscada 022D 12025D 366 On: call Atraso ; mantém display ativados por um tempo 0230 D528FA 367 djnz Count,On 0233 C020 368 push Unid ; salva Unid na pilha 0235 C021 369 push Dez ; salva Dez na pilha 0237 C022 370 push Cent ; salva Cent na pilha 0239 75230A 371 mov BufUnid,#0ah ; número não BCD aplicado ao 4511 apaga display 023C 75240A 372 mov BufDez,#0ah 023F 75250A 373 mov BufCent,#0ah 0242 75280A 374 mov Count,#10 0245 12025D 375 Off: call Atraso ; matém displays apagados por um tempo 0248 D528FA 376 djnz Count,Off 024B D022 377 pop Cent ; recupera Cent da pilha 024D D021 378 pop Dez ; recupera Unid da pilha 024F D020 379 pop Unid ; recupera Dez da pilha 0251 22 380 ret 381 382 ; --------------------------------------------------------------------- 383 ;Subrotina: AtrasoDp 384 ;Descrição: Efetua um atraso para manter o display ativado por um tempo 385 ;Entrada: nada 386 ;Destrói: nada 387 ;Chama: nada 388 0252 C029 389 AtrasoDp: push CountAtL ; empilha varável para preservá-la 0254 85FF29 390 mov CountAtL,TempoDp ; tempo de atraso 0257 D529FD 391 djnz CountAtL,$ 025A D029 392 pop CountAtL ; desempilha variável para recuperá-la 025C 22 393 ret 394 ; ----------------------------------------------------------------------- 395 ;Subrotina: Atraso 396 ;Descrição: Efetua um atraso para piscar os displays no final da contagem 397 ;Entrada: nada 398 ;Destrói: nada 399 ;Chama: nada 400 025D C029 401 Atraso: push CountAtL 025F C02A 402 push CountAtH 0261 752A0A 403 mov CountAtH,#10 0264 752940 404 Atraso1: mov CountAtL,#040h 0267 D529FD 405 djnz CountAtL,$ 026A D52AF7 406 djnz CountAtH,Atraso1 026D D02A 407 pop CountAtH 026F D029 408 pop CountAtL 0271 22 409 ret 410 ;---------------------------------------------------------------------------------------------------- 411 ; Tabela com os códigos 7 segmentos 0272 3F065B4F66 412 Tab7Seg: db 3fh,6,5bh,4fh,66h,6dh,7dh,7,7fh,6fh,0; código 7 segmentos: 3fh = 0, 6 = 1, ..., 6fh = 9, 6D7D077F6F 00 413 ;---------------------------------------------------------------------------------------------------- 414 end ASSEMBLY COMPLETE, NO ERRORS FOUND, NO WARNINGS SYMBOL TABLE: ??MCU_8051_IDE . . . . . . . . . . . N NUMB 8051H NOT USED ??VERSION. . . . . . . . . . . . . . N NUMB 0149H NOT USED AC . . . . . . . . . . . . . . . . . B ADDR 00D6H NOT USED ACC. . . . . . . . . . . . . . . . . D ADDR 00E0H ACIONACENT . . . . . . . . . . . . . N NUMB 00A7H ACIONADEZ. . . . . . . . . . . . . . N NUMB 00A6H ACIONAUNID . . . . . . . . . . . . . N NUMB 00A5H ACSR . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED ADCF . . . . . . . . . . . . . . . . D ADDR 00F6H NOT USED ADCLK. . . . . . . . . . . . . . . . D ADDR 00F2H NOT USED ADCON. . . . . . . . . . . . . . . . D ADDR 00F3H NOT USED ADDH . . . . . . . . . . . . . . . . D ADDR 00F5H NOT USED ADDL . . . . . . . . . . . . . . . . D ADDR 00F4H NOT USED ATRASO . . . . . . . . . . . . . . . C ADDR 025DH ATRASO1. . . . . . . . . . . . . . . C ADDR 0264H ATRASODP . . . . . . . . . . . . . . C ADDR 0252H AUXR . . . . . . . . . . . . . . . . D ADDR 008EH NOT USED AUXR1. . . . . . . . . . . . . . . . D ADDR 00A2H NOT USED B. . . . . . . . . . . . . . . . . . D ADDR 00F0H BDRCON . . . . . . . . . . . . . . . D ADDR 009BH NOT USED BDRCON_1 . . . . . . . . . . . . . . D ADDR 009CH NOT USED BRL. . . . . . . . . . . . . . . . . D ADDR 009AH NOT USED BUFCENT. . . . . . . . . . . . . . . N NUMB 0025H BUFDEZ . . . . . . . . . . . . . . . N NUMB 0024H BUFUNID. . . . . . . . . . . . . . . N NUMB 0023H CCAP0H . . . . . . . . . . . . . . . D ADDR 00FAH NOT USED CCAP0L . . . . . . . . . . . . . . . D ADDR 00EAH NOT USED CCAP1H . . . . . . . . . . . . . . . D ADDR 00FBH NOT USED CCAP1L . . . . . . . . . . . . . . . D ADDR 00EBH NOT USED CCAP2H . . . . . . . . . . . . . . . D ADDR 00FCH NOT USED CCAP3H . . . . . . . . . . . . . . . D ADDR 00FDH NOT USED CCAP4H . . . . . . . . . . . . . . . D ADDR 00FEH NOT USED CCAPL2H. . . . . . . . . . . . . . . D ADDR 00FCH NOT USED CCAPL2L. . . . . . . . . . . . . . . D ADDR 00ECH NOT USED CCAPL3H. . . . . . . . . . . . . . . D ADDR 00FDH NOT USED CCAPL3L. . . . . . . . . . . . . . . D ADDR 00EDH NOT USED CCAPL4H. . . . . . . . . . . . . . . D ADDR 00FEH NOT USED CCAPL4L. . . . . . . . . . . . . . . D ADDR 00EEH NOT USED CCAPM0 . . . . . . . . . . . . . . . D ADDR 00DAH NOT USED CCAPM1 . . . . . . . . . . . . . . . D ADDR 00DBH NOT USED CCAPM2 . . . . . . . . . . . . . . . D ADDR 00DCH NOT USED CCAPM3 . . . . . . . . . . . . . . . D ADDR 00DDH NOT USED CCAPM4 . . . . . . . . . . . . . . . D ADDR 00DEH NOT USED CCF0 . . . . . . . . . . . . . . . . B ADDR 00D8H NOT USED CCF1 . . . . . . . . . . . . . . . . B ADDR 00D9H NOT USED CCF2 . . . . . . . . . . . . . . . . B ADDR 00DAH NOT USED CCF3 . . . . . . . . . . . . . . . . B ADDR 00DBH NOT USED CCF4 . . . . . . . . . . . . . . . . B ADDR 00DCH NOT USED CCON . . . . . . . . . . . . . . . . D ADDR 00D8H NOT USED CENT . . . . . . . . . . . . . . . . N NUMB 0022H CENTOFF. . . . . . . . . . . . . . . C ADDR 0090H CENTON . . . . . . . . . . . . . . . C ADDR 009CH CFINT. . . . . . . . . . . . . . . . C ADDR 0033H NOT USED CH . . . . . . . . . . . . . . . . . D ADDR 00F9H NOT USED CHKDOWN. . . . . . . . . . . . . . . C ADDR 0115H CHKLEFT. . . . . . . . . . . . . . . C ADDR 0144H CHKRIGHT . . . . . . . . . . . . . . C ADDR 015EH CKCON. . . . . . . . . . . . . . . . D ADDR 008FH NOT USED CKCON0 . . . . . . . . . . . . . . . D ADDR 008FH NOT USED CKRL . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED CKSEL. . . . . . . . . . . . . . . . D ADDR 0085H NOT USED CL . . . . . . . . . . . . . . . . . D ADDR 00E9H NOT USED CLKREG . . . . . . . . . . . . . . . D ADDR 008FH NOT USED CMOD . . . . . . . . . . . . . . . . D ADDR 00D9H NOT USED CONTAGEM . . . . . . . . . . . . . . C ADDR 0068H COUNT. . . . . . . . . . . . . . . . N NUMB 0028H COUNTATH . . . . . . . . . . . . . . N NUMB 002AH COUNTATL . . . . . . . . . . . . . . N NUMB 0029H CPRL2. . . . . . . . . . . . . . . . B ADDR 00C8H NOT USED CR . . . . . . . . . . . . . . . . . B ADDR 00DEH NOT USED CT2. . . . . . . . . . . . . . . . . B ADDR 00C9H NOT USED CY . . . . . . . . . . . . . . . . . B ADDR 00D7H NOT USED DEZ. . . . . . . . . . . . . . . . . N NUMB 0021H DEZOFF . . . . . . . . . . . . . . . C ADDR 00B0H DEZON. . . . . . . . . . . . . . . . C ADDR 00BCH DP0H . . . . . . . . . . . . . . . . D ADDR 0083H NOT USED DP0L . . . . . . . . . . . . . . . . D ADDR 0082H NOT USED DP1H . . . . . . . . . . . . . . . . D ADDR 0085H NOT USED DP1L . . . . . . . . . . . . . . . . D ADDR 0084H NOT USED DPATIVO. . . . . . . . . . . . . . . N NUMB 0026H DPDEZ0 . . . . . . . . . . . . . . . C ADDR 00FAH DPDEZ2 . . . . . . . . . . . . . . . C ADDR 0129H DPDEZ3 . . . . . . . . . . . . . . . C ADDR 0151H DPDEZ4 . . . . . . . . . . . . . . . C ADDR 016BH DPH. . . . . . . . . . . . . . . . . D ADDR 0083H NOT USED DPL. . . . . . . . . . . . . . . . . D ADDR 0082H NOT USED DPUNID1. . . . . . . . . . . . . . . C ADDR 0109H DPUNID2. . . . . . . . . . . . . . . C ADDR 0138H DPUNID3. . . . . . . . . . . . . . . C ADDR 0159H DPUNID4. . . . . . . . . . . . . . . C ADDR 0173H EA . . . . . . . . . . . . . . . . . B ADDR 00AFH NOT USED EC . . . . . . . . . . . . . . . . . B ADDR 00AEH NOT USED EECON. . . . . . . . . . . . . . . . D ADDR 0096H NOT USED ENTER. . . . . . . . . . . . . . . . C ADDR 0178H ES . . . . . . . . . . . . . . . . . B ADDR 00ACH NOT USED ET0. . . . . . . . . . . . . . . . . B ADDR 00A9H NOT USED ET1. . . . . . . . . . . . . . . . . B ADDR 00ABH NOT USED ET2. . . . . . . . . . . . . . . . . B ADDR 00ADH NOT USED EX0. . . . . . . . . . . . . . . . . B ADDR 00A8H NOT USED EX1. . . . . . . . . . . . . . . . . B ADDR 00AAH NOT USED EXEN2. . . . . . . . . . . . . . . . B ADDR 00CBH NOT USED EXF2 . . . . . . . . . . . . . . . . B ADDR 00CEH NOT USED EXTI0. . . . . . . . . . . . . . . . C ADDR 0003H NOT USED EXTI1. . . . . . . . . . . . . . . . C ADDR 0013H NOT USED F0 . . . . . . . . . . . . . . . . . B ADDR 00D5H NOT USED FE . . . . . . . . . . . . . . . . . B ADDR 009FH NOT USED FIMCONT. . . . . . . . . . . . . . . C ADDR 006DH IE . . . . . . . . . . . . . . . . . D ADDR 00A8H IE0. . . . . . . . . . . . . . . . . B ADDR 0089H NOT USED IE1. . . . . . . . . . . . . . . . . B ADDR 008BH NOT USED INICLER. . . . . . . . . . . . . . . C ADDR 00E1H INT0 . . . . . . . . . . . . . . . . B ADDR 00B2H NOT USED INT1 . . . . . . . . . . . . . . . . B ADDR 00B3H NOT USED IP . . . . . . . . . . . . . . . . . D ADDR 00B8H NOT USED IPH. . . . . . . . . . . . . . . . . D ADDR 00B7H NOT USED IPH0 . . . . . . . . . . . . . . . . D ADDR 00B7H NOT USED IPH1 . . . . . . . . . . . . . . . . D ADDR 00B3H NOT USED IPL0 . . . . . . . . . . . . . . . . D ADDR 00B8H NOT USED IPL1 . . . . . . . . . . . . . . . . D ADDR 00B2H NOT USED ISRVARDP . . . . . . . . . . . . . . C ADDR 01EBH IT0. . . . . . . . . . . . . . . . . B ADDR 0088H NOT USED IT1. . . . . . . . . . . . . . . . . B ADDR 008AH NOT USED KBE. . . . . . . . . . . . . . . . . D ADDR 009DH NOT USED KBF. . . . . . . . . . . . . . . . . D ADDR 009EH NOT USED KBLS . . . . . . . . . . . . . . . . D ADDR 009CH NOT USED LE . . . . . . . . . . . . . . . . . C ADDR 0083H NOT USED LEESPIRAS. . . . . . . . . . . . . . C ADDR 007AH LESENSOR . . . . . . . . . . . . . . C ADDR 01B6H LETEC. . . . . . . . . . . . . . . . C ADDR 0179H LOOPCNT. . . . . . . . . . . . . . . C ADDR 004DH MAIN . . . . . . . . . . . . . . . . C ADDR 001EH MOSTRADP0. . . . . . . . . . . . . . C ADDR 01F2H NOT USED MOSTRADP1. . . . . . . . . . . . . . C ADDR 01FEH NOT USED MOSTRADP2. . . . . . . . . . . . . . C ADDR 020AH NOT USED MOTORCAR . . . . . . . . . . . . . . N NUMB 00B0H OFF. . . . . . . . . . . . . . . . . C ADDR 0245H ON . . . . . . . . . . . . . . . . . C ADDR 022DH OSCCON . . . . . . . . . . . . . . . D ADDR 0086H NOT USED OV . . . . . . . . . . . . . . . . . B ADDR 00D2H NOT USED P. . . . . . . . . . . . . . . . . . B ADDR 00D0H NOT USED P0 . . . . . . . . . . . . . . . . . D ADDR 0080H NOT USED P1 . . . . . . . . . . . . . . . . . D ADDR 0090H P1M1 . . . . . . . . . . . . . . . . D ADDR 00D4H NOT USED P1M2 . . . . . . . . . . . . . . . . D ADDR 00E2H NOT USED P2 . . . . . . . . . . . . . . . . . D ADDR 00A0H NOT USED P3 . . . . . . . . . . . . . . . . . D ADDR 00B0H NOT USED P3M1 . . . . . . . . . . . . . . . . D ADDR 00D5H NOT USED P3M2 . . . . . . . . . . . . . . . . D ADDR 00E3H NOT USED P4 . . . . . . . . . . . . . . . . . D ADDR 00C0H NOT USED P4M1 . . . . . . . . . . . . . . . . D ADDR 00D6H NOT USED P4M2 . . . . . . . . . . . . . . . . D ADDR 00E4H NOT USED P5 . . . . . . . . . . . . . . . . . D ADDR 00E8H NOT USED PC . . . . . . . . . . . . . . . . . B ADDR 00BEH NOT USED PCON . . . . . . . . . . . . . . . . D ADDR 0087H NOT USED PDEZ . . . . . . . . . . . . . . . . C ADDR 00AAH PISCACENT. . . . . . . . . . . . . . C ADDR 008AH PISCADEZ . . . . . . . . . . . . . . C ADDR 00A7H PISCADP. . . . . . . . . . . . . . . C ADDR 0221H PISCAESP . . . . . . . . . . . . . . C ADDR 0042H PISCAFIM . . . . . . . . . . . . . . C ADDR 006FH PISCAUNID. . . . . . . . . . . . . . C ADDR 00C7H PPCL . . . . . . . . . . . . . . . . B ADDR 00BEH NOT USED PROX0. . . . . . . . . . . . . . . . C ADDR 00F6H PROX1. . . . . . . . . . . . . . . . C ADDR 0105H PROX2. . . . . . . . . . . . . . . . C ADDR 0111H PROX3. . . . . . . . . . . . . . . . C ADDR 0125H PROX4. . . . . . . . . . . . . . . . C ADDR 0134H PROX5. . . . . . . . . . . . . . . . C ADDR 0140H PS . . . . . . . . . . . . . . . . . B ADDR 00BCH NOT USED PSL. . . . . . . . . . . . . . . . . B ADDR 00BCH NOT USED PSW. . . . . . . . . . . . . . . . . D ADDR 00D0H PT0. . . . . . . . . . . . . . . . . B ADDR 00B9H NOT USED PT0L . . . . . . . . . . . . . . . . B ADDR 00B9H NOT USED PT1. . . . . . . . . . . . . . . . . B ADDR 00BBH NOT USED PT1L . . . . . . . . . . . . . . . . B ADDR 00BBH NOT USED PT2. . . . . . . . . . . . . . . . . B ADDR 00BDH NOT USED PT2L . . . . . . . . . . . . . . . . B ADDR 00BDH NOT USED PX0. . . . . . . . . . . . . . . . . B ADDR 00B8H NOT USED PX0L . . . . . . . . . . . . . . . . B ADDR 00B8H NOT USED PX1. . . . . . . . . . . . . . . . . B ADDR 00BAH NOT USED PX1L . . . . . . . . . . . . . . . . B ADDR 00BAH NOT USED RB8. . . . . . . . . . . . . . . . . B ADDR 009AH NOT USED RCAP2H . . . . . . . . . . . . . . . D ADDR 00CBH NOT USED RCAP2L . . . . . . . . . . . . . . . D ADDR 00CAH NOT USED RCLK . . . . . . . . . . . . . . . . B ADDR 00CDH NOT USED RD . . . . . . . . . . . . . . . . . B ADDR 00B7H NOT USED REN. . . . . . . . . . . . . . . . . B ADDR 009CH NOT USED RESET. . . . . . . . . . . . . . . . C ADDR 0000H NOT USED RI . . . . . . . . . . . . . . . . . B ADDR 0098H NOT USED RS0. . . . . . . . . . . . . . . . . B ADDR 00D3H NOT USED RS1. . . . . . . . . . . . . . . . . B ADDR 00D4H NOT USED RXD. . . . . . . . . . . . . . . . . B ADDR 00B0H NOT USED SADDR. . . . . . . . . . . . . . . . D ADDR 00A9H NOT USED SADDR_0. . . . . . . . . . . . . . . D ADDR 00A9H NOT USED SADDR_1. . . . . . . . . . . . . . . D ADDR 00AAH NOT USED SADEN. . . . . . . . . . . . . . . . D ADDR 00B9H NOT USED SADEN_0. . . . . . . . . . . . . . . D ADDR 00B9H NOT USED SADEN_1. . . . . . . . . . . . . . . D ADDR 00BAH NOT USED SAI. . . . . . . . . . . . . . . . . C ADDR 01EAH SAIISR . . . . . . . . . . . . . . . C ADDR 0216H NOT USED SAILT. . . . . . . . . . . . . . . . C ADDR 01B5H SBUF . . . . . . . . . . . . . . . . D ADDR 0099H NOT USED SCON . . . . . . . . . . . . . . . . D ADDR 0098H NOT USED SENSOR . . . . . . . . . . . . . . . N NUMB 00B7H SINT . . . . . . . . . . . . . . . . C ADDR 0023H NOT USED SM0. . . . . . . . . . . . . . . . . B ADDR 009FH NOT USED SM1. . . . . . . . . . . . . . . . . B ADDR 009EH NOT USED SM2. . . . . . . . . . . . . . . . . B ADDR 009DH NOT USED SP . . . . . . . . . . . . . . . . . D ADDR 0081H NOT USED SPCON. . . . . . . . . . . . . . . . D ADDR 00C3H NOT USED SPCR . . . . . . . . . . . . . . . . D ADDR 00D5H NOT USED SPDAT. . . . . . . . . . . . . . . . D ADDR 00C5H NOT USED SPDR . . . . . . . . . . . . . . . . D ADDR 0086H NOT USED SPSR . . . . . . . . . . . . . . . . D ADDR 00AAH NOT USED SPSTA. . . . . . . . . . . . . . . . D ADDR 00C4H NOT USED T0 . . . . . . . . . . . . . . . . . B ADDR 00B4H NOT USED T1 . . . . . . . . . . . . . . . . . B ADDR 00B5H NOT USED T2CON. . . . . . . . . . . . . . . . D ADDR 00C8H NOT USED T2MOD. . . . . . . . . . . . . . . . D ADDR 00C9H NOT USED TAB7SEG. . . . . . . . . . . . . . . C ADDR 0272H TB8. . . . . . . . . . . . . . . . . B ADDR 009BH NOT USED TCLK . . . . . . . . . . . . . . . . B ADDR 00CCH NOT USED TCON . . . . . . . . . . . . . . . . D ADDR 0088H NOT USED TDOWN. . . . . . . . . . . . . . . . C ADDR 0188H TECLA. . . . . . . . . . . . . . . . N NUMB 0027H TECLADOWN. . . . . . . . . . . . . . N NUMB 0091H TECLAENTER . . . . . . . . . . . . . N NUMB 0094H TECLALEFT. . . . . . . . . . . . . . N NUMB 0093H TECLARIGHT . . . . . . . . . . . . . N NUMB 0092H TECLAUP. . . . . . . . . . . . . . . N NUMB 0090H TEMPODP. . . . . . . . . . . . . . . N NUMB 00FFH TEMPOISR . . . . . . . . . . . . . . N NUMB FD44H TENTER . . . . . . . . . . . . . . . C ADDR 01ACH TF0. . . . . . . . . . . . . . . . . B ADDR 008DH NOT USED TF1. . . . . . . . . . . . . . . . . B ADDR 008FH NOT USED TF2. . . . . . . . . . . . . . . . . B ADDR 00CFH NOT USED TH0. . . . . . . . . . . . . . . . . D ADDR 008CH NOT USED TH1. . . . . . . . . . . . . . . . . D ADDR 008DH TH2. . . . . . . . . . . . . . . . . D ADDR 00CDH NOT USED TI . . . . . . . . . . . . . . . . . B ADDR 0099H NOT USED TIMER0 . . . . . . . . . . . . . . . C ADDR 000BH NOT USED TIMER1 . . . . . . . . . . . . . . . C ADDR 001BH NOT USED TIMER2 . . . . . . . . . . . . . . . C ADDR 002BH NOT USED TL0. . . . . . . . . . . . . . . . . D ADDR 008AH NOT USED TL1. . . . . . . . . . . . . . . . . D ADDR 008BH TL2. . . . . . . . . . . . . . . . . D ADDR 00CCH NOT USED TLEFT. . . . . . . . . . . . . . . . C ADDR 0194H TMOD . . . . . . . . . . . . . . . . D ADDR 0089H TR0. . . . . . . . . . . . . . . . . B ADDR 008CH NOT USED TR1. . . . . . . . . . . . . . . . . B ADDR 008EH TR2. . . . . . . . . . . . . . . . . B ADDR 00CAH NOT USED TRIGHT . . . . . . . . . . . . . . . C ADDR 01A0H TXD. . . . . . . . . . . . . . . . . B ADDR 00B1H NOT USED ULN2803. . . . . . . . . . . . . . . N NUMB 0080H UNID . . . . . . . . . . . . . . . . N NUMB 0020H UNIDOFF. . . . . . . . . . . . . . . C ADDR 00CDH UNIDON . . . . . . . . . . . . . . . C ADDR 00D9H WDTCON . . . . . . . . . . . . . . . D ADDR 00A7H NOT USED WDTPRG . . . . . . . . . . . . . . . D ADDR 00A7H NOT USED WDTRST . . . . . . . . . . . . . . . D ADDR 00A6H NOT USED WR . . . . . . . . . . . . . . . . . B ADDR 00B6H NOT USED