Entrar    Registrar

como expandir portas do 8051 usando shift registers?

Software e Hardware para linha x51

Moderadores: guest2003, 51, Renie, gpenga

  • Autor
    Mensagem

Re: como expandir portas do 8051 usando shift registers?

Mensagempor andre_teprom » 23 Abr 2014 22:32

renan-papaco escreveu:eh mas comigo não é tão simples assim... pois justamente estou usando um compilador com headers pré compiladas... é ai que ferra td... a melhor coisa a fazer mesmo é parar de usa-lo ou usa-lo pra determinadas funções e usar um mais f.... pra funções mais gerais.(i/o mapeada é q é f....


Nesses casos, uma boa providencia é substituir as funções nativas de cada compilador por macros.
Assim, para portar o programa de um compilador pra outro, basta fazer apenas uma única alteração que abrange o código inteiro.

Por exemplo, o arquivo abaixo, que nomeei no projeto como "io.h", faz o mapeamento das entradas e saídas para o padrão utilizado pelo KEIL uVision. Se eu fosse utilizar o SDCC, com certeza o sbit não seria reconhecido - e daria erro de compilação - mas como no meu projeto faço o acesso aos pinos pela marcro _xxxxx ( por exemplo _SDA para o pino de dados do I2C ) em todo o programa, isso significa que para utilizar o meu código de centenas de linhas com o seu compilador SDCC, eu teria de apenas alterar essas poucas linhas abaixo para compatibilizar o acesso ás I/O's :


Código: Selecionar todos
/*--------------------------------------------------------*/
/*  Definicao de Entradas e Saidas do Microprocessador    */
/*  Lembrando que no 8051 as portas tambem sao mapeadas   */
/*  por Bit ( como esta sendo feito com a porta P1  )     */
/*                                                        */
/*--------------------------------------------------------*/
#define  PORTA_TECLADO     P0
#define  PORTA_USO_GERAL   P1
#define  DADOS_DISPLAY     P2
#define  CONTROLE_DISPLAY  P3
/*---------------------------------------------------------*/
sbit  _SDA                    =  P1^0 ; /*  dados do I2C   */
sbit  _HABILITA_SOM_OXIMETRIA =  P1^1 ; /*  Bateria-rede   */
sbit  _SOM_VOL_0              =  P1^2 ; /*  volume do som  */
sbit  _SCL                    =  P1^3 ; /*  clock do I2C   */
sbit  _PISCA_ALARME           =  P1^4 ; /*  saida para LED */
sbit  _SOM_VOL_1              =  P1^5 ; /*  volume do som  */
sbit  _BIP                    =  P1^6 ; /*  bit do bip     */
sbit  _RESET_MODULOS          =  P1^7 ; /*  reset do SpO2  */
/*---------------------------------------------------------*/



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_teprom
Dword
 
Mensagens: 5266
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: como expandir portas do 8051 usando shift registers?

Mensagempor ze2 » 24 Abr 2014 08:11

amigo voce faz tempestade em copo dágua. o protocolo spi é muito simples. tente p.ex. entender como funciona o hw do shift register hc164. pronto! você está quase ou completamente entendendo quase tudo (ou ainda mais perdido kk).
Pra este seu caso, esquece os heades precompilados temporariamente. Nesta sua fase inicial se atente apenas no 8051.h ou algo do gênero pra ter acesso aos registros, portas, etc pra fazer o setup do hw do mc e mais naaaaddddaaa. Eu só não digito aqui online (cara acho que já fiz isso) uma funçãozinha básica do spi porque estou com fome e sem café senão...
Ah e também dê uma olhadela no funcionamento do hc595 pra complementar seu conhecimento. Aliás é uma dica pra sua tão ferozmente perseguida expansão de i/o mapeada
abç
ze2
Byte
 
Mensagens: 193
Registrado em: 09 Fev 2009 13:37

Re: como expandir portas do 8051 usando shift registers?

Mensagempor Aquino » 24 Abr 2014 12:51

Mas assim, qual esta sendo a tua dificuldade, até onde conseguiu chegar? Conseguiste ao menos ler o primeiro bit? A maior dúvida é no armazenamento dos bits serializados ou no funcionamento do 4021?
"...People who are really serious about software should make their own hardware..." Alan Kay
Avatar do usuário
Aquino
Dword
 
Mensagens: 1821
Registrado em: 12 Out 2006 22:24

Re: como expandir portas do 8051 usando shift registers?

Mensagempor renan-papaco » 24 Abr 2014 21:17

duvida no funcionamento dos CIs não tenho, pq ja montei muita coisa com eles. eu até q entendi o truque de armazenar os bits seriais vindos de um 4021 só preciso mesmo de uma explicação mais detalhada, no codigo abaixo e sei que pra ler as entradas devo habilitar o latch, não chega a ser tão difícil e tbm não preciso usar nenhuma header para isso. só preciso apenas treinar e isso vou saber só quando montar o hardware.
Código: Selecionar todos
    #define clk P10
    #define dado P11
    //#define shld P12
    P1=0xff;//me lembro vagamente que tive que fazer isso pra não fica preso em 0. (no século passado)
    unsigned char lebyte(void)
    {
    unsigned char i,d=0;//(a variavel I conta até 8, mas ele deve entrar em looping? e a variavel D serve para receber os bits q vem do 4021 não é?
    for (i=0;i<8;i++) //8 bits
       {
       clk=1;//aciona o shift reg
       asm"nop";//asm"nop";//talvez + de 1. Um tempinho em 1
       clk=0;
       d|=P11; //captura o bit
       d<<=1;//próximo - desloca em sw
       }
    return d;
    }
Editado pela última vez por renan-papaco em 24 Abr 2014 21:44, em um total de 1 vez.
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: como expandir portas do 8051 usando shift registers?

Mensagempor tcpipchip » 24 Abr 2014 21:19

Eu postei o esquema!!!!!! É um projeto que fiz!
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 5761
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: como expandir portas do 8051 usando shift registers?

Mensagempor renan-papaco » 24 Abr 2014 21:46

tcpipchip escreveu:Eu postei o esquema!!!!!! É um projeto que fiz!

sim eu vi...nada mal!
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: como expandir portas do 8051 usando shift registers?

Mensagempor ze2 » 25 Abr 2014 12:02

se ja entendeu o funcionamento do 4021 ótimo! tentemos de novo... a lesma lerda com mais comentários

Código: Selecionar todos
#define CLK P10 //durante a compilação, cada vez que o compilador ver a palavra CLK vai considerar como P10 ou seja Bit0 da porta 1
#define Q8 P11 //Idem. Pino Q8 ligado no port1 bit 1. só 1 saída Q8 que interessa. Pro caso de 8 bits, 8 entradas, as entradas PS e DS podem ficar no gnd
//...
   unsigned char lebyte(void)
    {
    unsigned char i,d=0;//(a variavel I conta até 8, mas ele deve entrar em looping? e a variavel D serve para receber os bits q vem do 4021 não é? É!
    for (i=0;i<8;i++) //8 bits
       {
       d|=Q8; //captura o bit Q8 é o pino P1.1 do mc que pode ser considerado uma variável tipo bit e como tal só atua no bit0 de 'd'. Ou seja faz um OR (OU) "|" entre P1.1 e bit0 de 'd'
       CLK=1;CLK=0;//aciona o shift reg: gera um pulso de clock no pino P1.0
       d<<=1;//próximo - desloca em sw: isso quer dizer: "desloque 1 bit pra esquerda. note o <<". igualzin ao deslocamento do 4021 que vc já entendeu. o bit0 passa a ser zero
       }
    return d;
    }

main()
{
//...
P1=0b11111110;//me lembro vagamente que tive que fazer isso pra não fica preso em 0. (no século passado) Meio que pra garantir o pino P1.1 como entrada. Não é regra. Note P1.0 em zero
//...
for(;;)
{
P2=lebyte();//...autoexplicativo
}
}

Ferramenta bacana MESMO pra esta sua fase é o proteus. Cogite usar. Uso até em circuitos bem mais que semiprofissionais.
A partir daqui voce já pode mostrar (e não só falar) algo que já fez com sucesso. Mesmo que seja um pisca led
abç
ze2
Byte
 
Mensagens: 193
Registrado em: 09 Fev 2009 13:37

Re: como expandir portas do 8051 usando shift registers?

Mensagempor tcpipchip » 30 Mai 2014 19:24

Abaixo o programa que usa o SHIFT REGISTER para expandir I/O...maquina de vender cigarros...
Completo!
Código: Selecionar todos
'-------------------------------------------------------
'              (c) 2012 Miguel
'-------------------------------------------------------
'specify from code which chip we use:
$crystal = 11059620
$regfile = "8052.dat"
'$ramstart = 0
'$ramsize = 128
$large

'When you also have an additional RAM chip you must specify the size
'of this chip instead

'4094
Scl_4094 Alias P0.1
Sda_4094 Alias P0.2
Strobe_4094 Alias P0.0

Rs Alias P0.3
E Alias P0.4

'ESTADO DOS LEDS (COMPARTILHADO POR VARIAS ROTINAS)
Dim Leds As Byte

'4021
Scl_4021 Alias P0.5
Sda_4021_sensor_selecao_produto Alias P0.7
Stb_4021_sensor_selecao_produto Alias P0.6

'i2c DS1307
Config Scl = P1.1
Config Sda = P1.2
'POSICAO RAM
'0,1 = QUANTIDADE DE CREDITOS
'2,3,4,5 = SENHA
'6 = QUANTIDADE DE MOTORES
'7 = INDICE DE TABELA PARA QUANTIDADE DE PULSOS PARA DAR CREDITO COIN1
'8 = INDICE DE TABELA PARA QUANTIDADE DE PULSOS PARA DAR CREDITO COIN2
'9 = PULSOS COIN1
'A = PULSOS COIN2

'MOTORES

Motor_1 Alias P2.1
Motor_2 Alias P2.2
Motor_3 Alias P2.3
Motor_4 Alias P2.4
Motor_5 Alias P2.5
Motor_6 Alias P2.6
Motor_7 Alias P2.7

Dim Qnt_motores As Byte
Dim Mask_motor As Byte
Dim Mask_sensor As Byte

'MOTORES

Dado_sensor_1 Alias Dado_sensor.0
Dado_sensor_2 Alias Dado_sensor.1
Dado_sensor_3 Alias Dado_sensor.2
Dado_sensor_4 Alias Dado_sensor.3
Dado_sensor_5 Alias Dado_sensor.4
Dado_sensor_6 Alias Dado_sensor.5
Dado_sensor_7 Alias Dado_sensor.6

'creditos

Dim Creditos As Word
Dim Pulsos_con1 As Byte
Dim Pulsos_con2 As Byte
Dim Qnt_pls_obt_cred1 As Byte
Dim Qnt_pls_obt_cred2 As Byte
Dim Qnt_soma_em_cred1 As Byte
Dim Qnt_soma_em_cred2 As Byte

'FIM DE CURSO

Motor_1_fim_de_curso Alias P3.0
Motor_2_fim_de_curso Alias P3.1
Motor_3_fim_de_curso Alias P1.7
Motor_4_fim_de_curso Alias P3.7
Motor_5_fim_de_curso Alias P3.4
Motor_6_fim_de_curso Alias P3.5
Motor_7_fim_de_curso Alias P3.6

'TECLAS

Tecla_1 Alias Dado_selecao.0
Tecla_2 Alias Dado_selecao.1
Tecla_3 Alias Dado_selecao.2
Tecla_4 Alias Dado_selecao.3
Tecla_5 Alias Dado_selecao.4
Tecla_enter Alias Dado_selecao.4
Tecla_6 Alias Dado_selecao.5
Tecla_nao Alias Dado_selecao.5
Tecla_7 Alias Dado_selecao.6
Menu Alias Dado_selecao.7

'COIN
Sensor_ficha_1 Alias P1.7
Sensor_ficha_2 Alias P3.7

'Relogio eletro mecanico

Relogio_eletro Alias P1.6

'geral
Dim A_b As Byte
Dim Data_control As Byte
Dim Linha As Byte
Dim Coluna As Byte
Dim S As String * 16
Dim Tam As Byte
Dim Laco As Byte
Dim Loop_o As Byte
Dim Dado As Byte
Dim Dado_sensor As Byte
Dim Dado_selecao As Byte
Dim Dado_selecao_tecla As Byte
Dim Temp As Byte

'rtc/MEMO
Dim Dat As Byte
Dim Position_ram_1307 As Byte
Dim L_memo As Byte

'rtc
Dim Sec As Byte
Dim Hour As Byte
Dim Minute As Byte

'define os passos do programa (maquina estados)

Dim Passo As Byte
Dim Passo_menu As Byte
Dim Passo_menu_senha As Byte

'senha

Dim Senha_1 As Byte
Dim Senha_2 As Byte
Dim Senha_3 As Byte
Dim Senha_4 As Byte

Dim Senha_1_e As Byte
Dim Senha_2_e As Byte
Dim Senha_3_e As Byte
Dim Senha_4_e As Byte

'INDICE COINx_CONFIG

Dim Ind_coin1_cfg As Byte
Dim Ind_coin2_cfg As Byte

Declare Sub Send_byte_lcd(a_b As Byte , Data_control As Byte )
Declare Sub Lcd_pos(linha As Byte , Coluna As Byte)
Declare Sub Imprime_byte_lcd(a_b As Byte)
Declare Sub Write_mem_ds(position_ram_1307 As Byte , Dat As Byte)
Declare Sub Read_mem_ds(position_ram_1307 As Byte)
Declare Sub Write_mem(position_ram_1307 As Byte , Dat As Byte)
Declare Sub Imprime_string_lcd(s As String * 16)
Declare Sub Grava_ram_ds1307(position_ram_1307 As Byte , Dat As Byte)
Declare Sub Desliga_motor(a_b As Byte)
Declare Sub Liga_motor(a_b As Byte)
Declare Sub Read_ram_ds1307(position_ram_1307 As Byte)
Declare Sub Acerta_hora_ds1307(hour As Byte , Minute As Byte , Sec As Byte)
Declare Sub Read_mem_ds_1307(position_ram_1307 As Byte)
Declare Sub Soma_creditos_colocados(a_b As Byte)


 '*****************************************************************

'INICIALIZAÇÕES PORTAS
 P0 = 255
 P1 = 255
 P2 = 255
 P3 = 255
'RELOGIO ELETRO
 Relogio_eletro = 0
 Sda_4021_sensor_selecao_produto = 1                          'configura como entradas
 Motor_1_fim_de_curso = 1                                     'configura como entradas
 Motor_2_fim_de_curso = 1                                     'configura como entradas
 Motor_3_fim_de_curso = 1                                     'configura como entradas
 Motor_4_fim_de_curso = 1                                     'configura como entradas
 Motor_5_fim_de_curso = 1                                     'configura como entradas
 Motor_6_fim_de_curso = 1                                     'configura como entradas
 Motor_7_fim_de_curso = 1                                     'configura como entradas

 'aguarda display inicializar
 Wait 1
 Call Lcd_init()
 Wait 1

 'APRESENTACAO
 Call Apresentacao()

'CREDITS INTERRUPTS

Set Tcon.0                                                    ' trigger INT0 by falling edge.
Set Tcon.2                                                    ' Trigger Int1 By Falling Edge.
Enable Interrupts
Enable Int0                                                   'enable the interrupt
Enable Int1                                                   'enable the interrupt
On Int0 Credit_1                                              'jump to label2 on INT0
On Int1 Credit_2                                              'jump to label2 on INT0

 'A CADA N PULSOS, X CREDITOS
 Call Qnt_puls_cred1()
 Call Qnt_puls_cred2()

 'zera memo ds1307
 Call Zera_se_menu_pressionado()

 'passos (maquina de estados)

 Call Desliga_motores()

 Passo = 1

 While 1 = 1
   If Passo = 1 Then
      Call Exibe_creditos_hora()
      Leds = Dado_sensor
      Call Filtra_motores_nao_usados()
      Leds = Leds And Mask_motor
      Leds = Not Leds
      Call Send_byte_uln2803()
      Waitms 200
      Leds = 0
      Call Send_byte_uln2803()
      Waitms 200
      Call Creditos_colocados()
      If Creditos > 0 Then                                    'DS1307 (ENDEREÇO 8 E 9)
         Call Apaga_lcd()
         Call Lcd_pos(1 , 5)
         Call Imprime_string_lcd( "OBRIGADO")
         Wait 1
         Passo = 2
      End If

      Call Rec_4021_sensor_selecao_produto()
      If Menu = 0 Then
         Call Espera_soltar_tecla_menu()
         Call Menu_config()
      End If

      Wait 1
   End If

   If Passo = 2 Then
      Call Agradecimentos()
      Passo = 3
    End If

   If Passo = 3 Then
      Call Verifica_se_produto_disponivel()
   End If

   If Passo = 4 Then
      Call Libera_produto()
      Call Aguarda_fim_de_curso()
      Call Manda_pulso_relogio()
      Passo = 1
   End If
 Wend

Rem *************************************
Rem * MENU CONFIG
Rem * PARAMETRO: NENHUM
Rem * RETORNO: NENHUM
Sub Menu_config()
    Call Apaga_lcd()
    Passo_menu = 1
    While 1 = 1

    Passos:

      If Passo_menu = 1 Then
             Passo_menu_senha = 1
             Senha_1_e = "A"
             Senha_2_e = "A"
             Senha_3_e = "A"
             Senha_4_e = "A"
             Call Le_senha_memo()
          While 1 = 1
             If Passo_menu_senha = 1 Then
                Call Apaga_lcd()
                Call Imprime_string_lcd( "ENTRE COM SENHA")
                Call Lcd_pos(2 , 1)
                Call Imprime_string_lcd( "? ")
                Call Mostra_senha()

                Call Espera_teclar()
                Call Muda_coluna_senha()

                If Tecla_enter = 0 Then
                   Call Espera_soltar_tecla_enter()
                   Call Le_senha_memo()
                   Call Apaga_lcd()
                   Call Imprime_string_lcd( "SENHA")
                   Call Lcd_pos(2 , 1)

                   If Senha_1 = Senha_1_e And Senha_2 = Senha_2_e Then
                      If Senha_3 = Senha_3_e And Senha_4 = Senha_4_e Then
                         Call Lcd_pos(2 , 1)
                         Call Imprime_string_lcd( "VALIDA")
                         Passo_menu_senha = 2
                      Else
                         Call Imprime_string_lcd( "INVALIDA")
                      End If
                   Else
                      Call Imprime_string_lcd( "INVALIDA")
                   End If
                   Wait 1
               End If

               If Menu = 0 Then
                   Call Espera_soltar_tecla_menu()
                   Return
               End If
             End If

             If Passo_menu_senha = 2 Then
                Call Apaga_lcd()
                Call Imprime_string_lcd( "ALTERANDO")
                Call Lcd_pos(2 , 1)
                Call Imprime_string_lcd( "SENHA ")
                Call Le_senha_memo()
                Call Mostra_senha()
                Call Espera_teclar()
                Call Muda_coluna_senha()

               If Tecla_enter = 0 Then
                  Call Espera_soltar_tecla_enter()
                  Call Apaga_lcd()
                  Call Imprime_string_lcd( "GRAVAR")
                  Call Lcd_pos(2 , 1)
                  Call Imprime_string_lcd( "SENHA ?")
                  Call Espera_teclar()

                  If Tecla_enter = 0 Then
                     Call Espera_soltar_tecla_enter()
                     Call Apaga_lcd()
                     Call Imprime_string_lcd( "DADOS")
                     Call Lcd_pos(2 , 1)
                     Call Imprime_string_lcd( "GRAVADOS")
                     Call Grava_ram_ds1307(2 , Senha_1_e)
                     Call Grava_ram_ds1307(3 , Senha_2_e)
                     Call Grava_ram_ds1307(4 , Senha_3_e)
                     Call Grava_ram_ds1307(5 , Senha_4_e)
                     Wait 1
                     Passo_menu = 2
                     Goto Passos
                  End If

                  If Tecla_nao = 0 Then
                     Call Espera_soltar_tecla_nao()
                     Call Apaga_lcd()
                     Call Imprime_string_lcd( "DADOS")
                     Call Lcd_pos(2 , 1)
                     Call Imprime_string_lcd( "NAO GRAVADOS")
                     Call Grava_ram_ds1307(2 , Senha_1_e)
                     Call Grava_ram_ds1307(3 , Senha_2_e)
                     Call Grava_ram_ds1307(4 , Senha_3_e)
                     Call Grava_ram_ds1307(5 , Senha_4_e)
                     Wait 1
                     'VE QUANTIDADES MOTORES
                     Call Read_ram_ds1307(6)
                     Qnt_motores = Dat
                     Passo_menu = 2
                     Goto Passos
                  End If
               End If

               If Tecla_nao = 0 Then
                     Call Espera_soltar_tecla_nao()
                     'VE QUANTIDADES MOTORES
                     Call Read_ram_ds1307(6)
                     Qnt_motores = Dat
                     Passo_menu = 2
                     Goto Passos
                  End If

               If Menu = 0 Then
                   Call Espera_soltar_tecla_menu()
                   Return
               End If
             End If
          Wend
      End If

      If Passo_menu = 2 Then
          Call Apaga_lcd()
          Call Imprime_string_lcd( "QUANTOS MOTORES")
          Call Lcd_pos(2 , 1)
          Call Imprime_string_lcd( "? ")
          Call Imprime_byte_lcd(qnt_motores)
          Call Espera_teclar()
          If Tecla_1 = 0 Then
             Call Espera_soltar_tecla_1()
             Qnt_motores = Qnt_motores + 1
             If Qnt_motores > 7 Then
                Qnt_motores = 1
             End If
          End If

          If Tecla_enter = 0 Then
             Call Espera_soltar_tecla_enter()
             Call Grava_ram_ds1307(6 , Qnt_motores)
             Call Apaga_lcd()
             Call Imprime_string_lcd( "QUANTIDADE")
             Call Lcd_pos(2 , 1)
             Call Imprime_string_lcd( "ATUALIZADA")
             Wait 2
             Passo_menu = 3
          End If

          If Tecla_nao = 0 Then
             Call Espera_soltar_tecla_nao()
             Call Apaga_lcd()
             Call Imprime_string_lcd( "QUANTIDADE")
             Call Lcd_pos(2 , 1)
             Call Imprime_string_lcd( "NAO ATUALIZADA")
             Wait 2
             Call Collect_hora_ds1307()
             Passo_menu = 3
          End If

          If Menu = 0 Then
             Call Espera_soltar_tecla_menu()
             Return
          End If
      End If

      If Passo_menu = 3 Then
          Call Apaga_lcd()
          Call Imprime_string_lcd( "ACERTAR HORA")
          Call Lcd_pos(2 , 1)
          Call Imprime_string_lcd( "? ")
          Call Collect_hora_string()
          Call Imprime_string_lcd()
          Call Espera_teclar()

          If Tecla_1 = 0 Then
             Call Espera_soltar_tecla_1()
             Hour = Hour + 1
             If Hour > 23 Then
                Hour = 00
             End If
          End If

          If Tecla_2 = 0 Then
             Call Espera_soltar_tecla_2()
             Minute = Minute + 1
             If Minute > 59 Then
                Minute = 0
             End If
          End If

          If Tecla_3 = 0 Then
             Call Espera_soltar_tecla_3()
             Sec = Sec + 1
             If Sec > 59 Then
                Sec = 0
             End If
          End If

          If Tecla_enter = 0 Then
             Call Espera_soltar_tecla_enter()
             Call Acerta_hora_ds1307(hour , Minute , Sec)
             Call Apaga_lcd()
             Call Imprime_string_lcd( "HORA")
             Call Lcd_pos(2 , 1)
             Call Imprime_string_lcd( "CORRIGIDA")
             Wait 2
             Passo_menu = 4
          End If

          If Tecla_nao = 0 Then
             Call Espera_soltar_tecla_nao()
             Call Apaga_lcd()
             Call Imprime_string_lcd( "HORA")
             Call Lcd_pos(2 , 1)
             Call Imprime_string_lcd( "NAO CORRIGIDA")
             Wait 2
             Passo_menu = 4
          End If

          If Menu = 0 Then
             Call Espera_soltar_tecla_menu()
             Return
          End If

      End If

      If Passo_menu = 4 Then
          Call Apaga_lcd()
          Call Imprime_string_lcd( "APAGA CREDITOS")
          Call Lcd_pos(2 , 1)
          Call Imprime_string_lcd( "? ")
          Call Creditos_colocados()
          Call Imprime_byte_lcd(creditos)
          Call Espera_teclar()

          If Tecla_enter = 0 Then
             Call Espera_soltar_tecla_enter()
             Call Grava_ram_ds1307(0 , 0)
             Call Grava_ram_ds1307(1 , 0)
             Call Apaga_lcd()
             Call Imprime_string_lcd( "CREDITOS")
             Call Lcd_pos(2 , 1)
             Call Imprime_string_lcd( "APAGADOS")
             Wait 2
             Passo_menu = 5
             'PEGA INDICE TABELA CREDITOS
             Call Read_ram_ds1307(7)
             Ind_coin1_cfg = Dat
             Call Read_ram_ds1307(8)
             Ind_coin2_cfg = Dat
          End If

          If Tecla_nao = 0 Then
             Call Espera_soltar_tecla_nao()
             Call Apaga_lcd()
             Call Imprime_string_lcd( "CREDITOS")
             Call Lcd_pos(2 , 1)
             Call Imprime_string_lcd( "NAO APAGADOS")
             Wait 2
             Passo_menu = 5
             'PEGA INDICE TABELA CREDITOS
             Call Read_ram_ds1307(7)
             Ind_coin1_cfg = Dat
             Call Read_ram_ds1307(8)
             Ind_coin2_cfg = Dat
          End If                                              '

          If Menu = 0 Then
            Call Espera_soltar_tecla_menu()
            Return
          End If
      End If

      If Passo_menu = 5 Then
          Call Apaga_lcd()
          Call Imprime_string_lcd( "COIN1 CONFIG")
          Call Lcd_pos(2 , 1)
          Call Imprime_string_lcd( "PLS ")
          Dat = Lookup(ind_coin1_cfg , Table_pulsos_con1)
          Call Imprime_byte_lcd(dat)
          Call Imprime_string_lcd( " CRED ")
          Temp = Ind_coin1_cfg + 1
          Dat = Lookup(temp , Table_pulsos_con1)
          Call Imprime_byte_lcd(dat)
          Call Espera_teclar()
          If Tecla_1 = 0 Then
             Call Espera_soltar_tecla_1()
             Ind_coin1_cfg = Ind_coin1_cfg + 2
             If Ind_coin1_cfg > 19 Then
                Ind_coin1_cfg = 0
             End If
          End If

          If Tecla_enter = 0 Then
             Call Espera_soltar_tecla_enter()
             Call Grava_ram_ds1307(7 , Ind_coin1_cfg)
             Call Apaga_lcd()
             Call Imprime_string_lcd( "QNT PLS COIN1")
             Call Lcd_pos(2 , 1)
             Call Imprime_string_lcd( "ATUALIZADA")
             Wait 2
             Passo_menu = 6
          End If

          If Tecla_nao = 0 Then
             Call Espera_soltar_tecla_nao()
             Call Apaga_lcd()
             Call Imprime_string_lcd( "QNT PLS COIN1")
             Call Lcd_pos(2 , 1)
             Call Imprime_string_lcd( "NAO ATUALIZADA")
             Wait 2
             Passo_menu = 6
          End If

          If Menu = 0 Then
             Call Espera_soltar_tecla_menu()
             Return
          End If

      End If

      If Passo_menu = 6 Then
          Call Apaga_lcd()
          Call Imprime_string_lcd( "COIN2 CONFIG")
          Call Lcd_pos(2 , 1)
          Call Imprime_string_lcd( "PLS ")
          Dat = Lookup(ind_coin2_cfg , Table_pulsos_con2)
          Call Imprime_byte_lcd(dat)
          Call Imprime_string_lcd( " CRED ")
          Temp = Ind_coin2_cfg + 1
          Dat = Lookup(temp , Table_pulsos_con2)
          Call Imprime_byte_lcd(dat)
          Call Espera_teclar()
          If Tecla_1 = 0 Then
             Call Espera_soltar_tecla_1()
             Ind_coin2_cfg = Ind_coin2_cfg + 2
             If Ind_coin2_cfg > 11 Then
                Ind_coin2_cfg = 0
             End If
          End If

          If Tecla_enter = 0 Then
             Call Espera_soltar_tecla_enter()
             Call Grava_ram_ds1307(8 , Ind_coin2_cfg)
             Call Apaga_lcd()
             Call Imprime_string_lcd( "QNT PLS COIN2")
             Call Lcd_pos(2 , 1)
             Call Imprime_string_lcd( "ATUALIZADA")
             Wait 2
             Passo_menu = 1
          End If

          If Tecla_nao = 0 Then
             Call Espera_soltar_tecla_nao()
             Call Apaga_lcd()
             Call Imprime_string_lcd( "QNT PLS COIN2")
             Call Lcd_pos(2 , 1)
             Call Imprime_string_lcd( "NAO ATUALIZADA")
             Wait 2
             Passo_menu = 1
          End If

           If Menu = 0 Then
             Call Espera_soltar_tecla_menu()
             Return
          End If
      End If
    Wend
End Sub

Rem *************************************
Rem * MANDA PULSO RELOGIO ELETRO MECANICO
Rem * PARAMETRO: NENHUM
Rem * RETORNO: NENHUM
Sub Manda_pulso_relogio()
   Relogio_eletro = 1
   Waitms 30
   Relogio_eletro = 0
   Call Remove_creditos_colocados()
End Sub

Rem *************************************
Rem * AGUARDA FIM DE CURSO DO MOTOR
Rem * PARAMETRO: NENHUM
Rem " RETORNO: nenhum
Rem ************************************
Sub Aguarda_fim_de_curso()
    If Dado_selecao_tecla.0 = 0 Then
       While Motor_1_fim_de_curso = 1
       Wend
       Call Desliga_motor(1)
    End If
    If Dado_selecao_tecla.1 = 0 Then
       While Motor_2_fim_de_curso = 1
       Wend
       Call Desliga_motor(2)
    End If
    If Dado_selecao_tecla.2 = 0 Then
       While Motor_3_fim_de_curso = 1
       Wend
       Call Desliga_motor(3)
    End If
    If Dado_selecao_tecla.3 = 0 Then
       While Motor_4_fim_de_curso = 1
       Wend
       Call Desliga_motor(4)
    End If
    If Dado_selecao_tecla.4 = 0 Then
       While Motor_5_fim_de_curso = 1
       Wend
       Call Desliga_motor(5)
    End If

    If Dado_selecao_tecla.5 = 0 Then
       While Motor_6_fim_de_curso = 1
       Wend
       Call Desliga_motor(6)
    End If
    If Dado_selecao_tecla.6 = 0 Then
       While Motor_7_fim_de_curso = 1
       Wend
       Call Desliga_motor(7)
    End If
End Sub

Rem ************************************
Rem * Libera produto
Rem * PARAMETRO: NENHUM
Rem " RETORNO: nenhum
Rem ************************************
Sub Libera_produto()
    If Dado_selecao_tecla.0 = 0 Then
       Call Liga_motor(1)
       'aguarda chave fim de curso desacionar
       While Motor_1_fim_de_curso = 0
       Wend
    End If

    If Dado_selecao_tecla.1 = 0 Then
       Call Liga_motor(2)
       While Motor_2_fim_de_curso = 0
       Wend
    End If

    If Dado_selecao_tecla.2 = 0 Then
       Call Liga_motor(3)
       While Motor_3_fim_de_curso = 0
       Wend
    End If

    If Dado_selecao_tecla.3 = 0 Then
       Call Liga_motor(4)
       While Motor_4_fim_de_curso = 0
       Wend
    End If

    If Dado_selecao_tecla.4 = 0 Then
       Call Liga_motor(5)
       While Motor_5_fim_de_curso = 0
       Wend
    End If

    If Dado_selecao_tecla.5 = 0 Then
       Call Liga_motor(6)
       While Motor_6_fim_de_curso = 0
       Wend
    End If

    If Dado_selecao_tecla.6 = 0 Then
       Call Liga_motor(7)
       While Motor_7_fim_de_curso = 0
       Wend
    End If
End Sub


Rem ********************************
Rem * Pede entrar com produto
Rem ********************************
Sub Agradecimentos()
   Call Apaga_lcd()
   Call Imprime_string_lcd( "POR FAVOR")
   Call Lcd_pos(2 , 2)
   Call Imprime_string_lcd( "ESCOLHA PRODUTO")
End Sub


'BASIC4EVER
Rem ***********************************************************
Rem * AGUARDA PRESSIONAR TECLA - CHAMADA POR SELECAO DE PRODUTO
Rem * PARAMETRO: NENHUM
Rem " RETORNA: em "dado selecao" a tecla
Rem ***********************************************************
Sub Aguarda_pressionar_tecla()
      Call Rec_4021_sensor_selecao_produto()
      While Dado_selecao = 255
         Leds = Dado_sensor
         'sensor_motor_x = 1 tem produto
         'filtra quantidades motores
         Call Filtra_motores_nao_usados()
         Leds = Leds And Mask_motor
         Leds = Not Leds
         Call Send_byte_uln2803()
         Call Rec_4021_sensor_selecao_produto()
         Call Creditos_colocados()
         'BASIC4EVER
         Call Lcd_pos(1 , 12)
         Call Imprime_string_lcd( "    ")
         Call Lcd_pos(1 , 12)
         Call Imprime_byte_lcd(creditos)
      Wend
End Sub

Rem ************************************
Rem * AGUARDA PRESSIONAR TECLA
Rem * PARAMETRO: NENHUM
Rem " RETORNA: em "dado selecao" a tecla
Rem ************************************
Sub Verifica_se_produto_disponivel()

      Call Aguarda_pressionar_tecla()

      Dado_selecao_tecla = Dado_selecao

      'QNT DE MOTORES ATIVOS
      Call Read_ram_ds1307(6)

      If Tecla_1 = 0 Then
          Call Espera_soltar_tecla_1()
          Call Apaga_lcd()
          If Dado_sensor_1 = 0 And Dat >= 1 Then
             Call Imprime_string_lcd( "DISPONIVEL 1")
             Passo = 4
          Else
             Call Imprime_string_lcd( "INDISPONIVEL 1")
             Passo = 2
          End If
       End If


       If Tecla_2 = 0 Then
          Call Espera_soltar_tecla_2()
          Call Apaga_lcd()
          If Dado_sensor_2 = 0 And Dat >= 2 Then
             Call Imprime_string_lcd( "DISPONIVEL 2")
             Passo = 4
          Else
             Call Imprime_string_lcd( "INDISPONIVEL 2")
             Passo = 2
          End If
       End If

       If Tecla_3 = 0 Then
          Call Espera_soltar_tecla_3()
          Call Apaga_lcd()
          If Dado_sensor_3 = 0 And Dat >= 3 Then
             Call Imprime_string_lcd( "DISPONIVEL 3")
             Passo = 4
          Else
             Call Imprime_string_lcd( "INDISPONIVEL 3")
             Passo = 2
          End If
       End If

       If Tecla_4 = 0 Then
          Call Espera_soltar_tecla_4()
          Call Apaga_lcd()
          If Dado_sensor_4 = 0 And Dat >= 4 Then
             Call Imprime_string_lcd( "DISPONIVEL 4")
             Passo = 4
          Else
             Call Imprime_string_lcd( "INDISPONIVEL 4")
             Passo = 2
          End If
       End If

       If Tecla_5 = 0 Then
          Call Espera_soltar_tecla_5()
          Call Apaga_lcd()
          If Dado_sensor_5 = 0 And Dat >= 5 Then
             Call Imprime_string_lcd( "DISPONIVEL 5")
             Passo = 4
          Else
             Call Imprime_string_lcd( "INDISPONIVEL 5")
             Passo = 2
          End If
       End If

       If Tecla_6 = 0 Then
          Call Espera_soltar_tecla_6()
          Call Apaga_lcd()
          If Dado_sensor_6 = 0 And Dat >= 6 Then
             Call Imprime_string_lcd( "DISPONIVEL 6")
             Passo = 4
          Else
             Call Imprime_string_lcd( "INDISPONIVEL 6")
             Passo = 2
          End If
       End If

       If Tecla_7 = 0 Then
          Call Espera_soltar_tecla_7()
          Call Apaga_lcd()
          If Dado_sensor_7 = 0 And Dat >= 7 Then
             Call Imprime_string_lcd( "DISPONIVEL 7")
             Passo = 4
          Else
             Call Imprime_string_lcd( "INDISPONIVEL 7")
             Passo = 2
          End If
       End If

       If Menu = 0 Then
          Call Espera_soltar_tecla_menu()
          Call Apaga_lcd()
          Call Imprime_string_lcd( "TECLA INVALIDA")
          Passo = 2
       End If

       Call Lcd_pos(2 , 3)
       Call Imprime_string_lcd( "STATUS PRODUTO")

    Wait 1

End Sub

Rem ********************************
Rem * Desliga todos motores
Rem * Parametros: nenhum
Rem * Retorno: nenhum
Rem ********************************
Sub Desliga_motores()
   Call Desliga_motor(1)
   Call Desliga_motor(2)
   Call Desliga_motor(3)
   Call Desliga_motor(4)
   Call Desliga_motor(5)
   Call Desliga_motor(6)
   Call Desliga_motor(7)
End Sub


Rem ********************************
Rem * Desliga motor
Rem * Parametros: numero do motor
Rem * Retorno: nenhum
Rem ********************************
Sub Desliga_motor(a_b As Byte)
    If A_b = 1 Then
       Motor_1 = 1
    End If
    If A_b = 2 Then
       Motor_2 = 1
    End If
    If A_b = 3 Then
       Motor_3 = 1
    End If
    If A_b = 4 Then
       Motor_4 = 1
    End If
    If A_b = 5 Then
       Motor_5 = 1
    End If
    If A_b = 6 Then
       Motor_6 = 1
    End If
    If A_b = 7 Then
       Motor_7 = 1
    End If
End Sub

Rem ********************************
Rem * Liga motor
Rem * Parametros: numero do motor
Rem * Retorno: nenhum
Rem ********************************
Sub Liga_motor(a_b As Byte)
    If A_b = 1 Then
       Motor_1 = 0
    End If
    If A_b = 2 Then
       Motor_2 = 0
    End If
    If A_b = 3 Then
       Motor_3 = 0
    End If
    If A_b = 4 Then
       Motor_4 = 0
    End If
    If A_b = 5 Then
       Motor_5 = 0
    End If
    If A_b = 6 Then
       Motor_6 = 0
    End If
    If A_b = 7 Then
       Motor_7 = 0
    End If
End Sub

Rem ********************************
Rem * Desliga LED
Rem * Parametros: numero do LED
Rem * Retorno: nenhum
Rem ********************************
Sub Desliga_led(a_b As Byte)
    If A_b = 1 Then
       Leds.0 = 0
    End If
    If A_b = 2 Then
       Leds.1 = 0
    End If
    If A_b = 3 Then
       Leds.2 = 0
    End If
    If A_b = 4 Then
       Leds.3 = 0
    End If
    If A_b = 5 Then
       Leds.4 = 0
    End If
    If A_b = 6 Then
       Leds.5 = 0
    End If
    If A_b = 7 Then
       Leds.6 = 0
    End If
End Sub

Rem ********************************
Rem * Liga LED
Rem * Parametros: numero do LED
Rem * Retorno: nenhum
Rem ********************************
Sub Liga_led(a_b As Byte)
    If A_b = 1 Then
       Leds.0 = 1
    End If
    If A_b = 2 Then
       Leds.1 = 1
    End If
    If A_b = 3 Then
       Leds.2 = 1
    End If
    If A_b = 4 Then
       Leds.3 = 1
    End If
    If A_b = 5 Then
       Leds.4 = 1
    End If
    If A_b = 6 Then
       Leds.5 = 1
    End If
    If A_b = 7 Then
       Leds.6 = 1
    End If
End Sub

Rem ********************************
Rem * Acende todos LEDS
Rem * Parametros: nunhum
Rem * Retorno: nenhum
Rem ********************************
Sub Acende_todos_leds()
   Leds = 255
   Call Send_byte_uln2803()
End Sub

Rem ********************************
Rem * Apaga todos LEDS
Rem * Parametros: nunhum
Rem * Retorno: nenhum
Rem ********************************
Sub Apaga_todos_leds()
   Leds = 0
   Call Send_byte_uln2803()
End Sub

Rem ********************************
Rem * Exibe Insira creditos/hora
Rem ********************************
Sub Exibe_creditos_hora
   Call Apaga_lcd()
   Call Lcd_pos(1 , 1)
   Call Imprime_string_lcd( "INSIRA CREDITOS")
   Call Collect_hora_ds1307()
   Call Lcd_pos(2 , 5)
   Call Imprime_string_lcd(s)
End Sub

Rem ******************************************************
Rem * Esta rotina escreve no RELOGIO
Rem * Parametros: posicao, endereço device e dado
Rem * Retorno: nenhum
Rem ******************************************************
Sub Write_mem_ds_1307(position_ram_1307 As Byte , Dat As Byte)
      I2cstart
      I2cwbyte &HD0
      I2cwbyte Position_ram_1307
      I2cwbyte Dat
      I2cstop
      Waitms 10
End Sub

Rem ******************************************************
Rem * Esta rotina le o RELOGIO
Rem * Parametros: posicao e endereço device
Rem * Retorna: em dat
Rem ******************************************************
Sub Read_mem_ds_1307(position_ram_1307 As Byte)
     I2cstart
     I2cwbyte &HD0
     I2cwbyte Position_ram_1307
     I2cstop
     I2cstart
     I2cwbyte &HD1
     I2crbyte Dat , 9
     I2cstop
     Waitms 10
End Sub

Rem ********************************************
Rem * Acerta hora
Rem * Parametros: hora, minuto, segundo
Rem ********************************************
Sub Acerta_hora_ds1307(hour As Byte , Minute As Byte , Sec As Byte)
   Call Write_mem_ds_1307(&H0 , Makebcd(sec))
   Call Write_mem_ds_1307(&H1 , Makebcd(minute))
   Call Write_mem_ds_1307(&H2 , Makebcd(hour))
End Sub


Rem ********************************************
Rem * le memo
Rem * Parametros: Endereço
Rem * Retorno: dado
Rem ********************************************
Sub Read_ram_ds1307(position_ram_1307 As Byte)
    Position_ram_1307 = Position_ram_1307 + 8                 'dallas ram
    L_memo = Low(position_ram_1307 )
    I2cstart
    I2cwbyte &HD0
    I2cwbyte L_memo
    I2cstart
    I2cwbyte &HD1
    I2crbyte Dat , 9
    I2cstop
    Waitms 10
End Sub

Rem ********************************************
Rem * Grava memo
Rem * Parametros: Endereço, dado
Rem ********************************************
Sub Grava_ram_ds1307(position_ram_1307 As Byte , Dat As Byte)
    nop
    Position_ram_1307 = Position_ram_1307 + 8
    L_memo = Low(position_ram_1307)
    I2cstart
    I2cwbyte &HD0
    I2cwbyte L_memo
    I2cwbyte Dat
    I2cstop
End Sub


Rem ********************************************
Rem * coleta hora  - Retorna string S
Rem * Parametros: nenhum
Rem * Retorna: sec, minute, hour e string s
Rem ********************************************
Sub Collect_hora_ds1307
   Call Read_mem_ds_1307(&H0)
   Sec = Makedec(dat)
   Call Read_mem_ds_1307(&H1)
   Minute = Makedec(dat)
   Call Read_mem_ds_1307(&H2)
   Hour = Makedec(dat)
   Call Collect_hora_string()
End Sub


Rem **************************************
Rem * GERA STRING HORA
Rem * PARAMETRO: NENHUM
Rem * RETORNO: NENHUM
Rem **************************************

Sub Collect_hora_string()
   If Hour < 10 Then
      S = "0" + Str(hour) + ":"
   Else
      S = Str(hour) + ":"
   End If

   If Minute < 10 Then
      S = S + "0" + Str(minute) + ":"
   Else
      S = S + Str(minute) + ":"
   End If

   If Sec < 10 Then
      S = S + "0" + Str(sec)
   Else
      S = S + Str(sec)
   End If
End Sub

Rem ***********************************************************************
Rem * Esta rotina le os 4021, RETORNA EM dado_sensor e dado_selecao
Rem * Parametros: nenhum
Rem * Retorna: dado_sensor, dado_selecao
Rem ***********************************************************************
Sub Rec_4021_sensor_selecao_produto()
   Set Stb_4021_sensor_selecao_produto
   nop
   nop
   nop
   nop
   nop
   Reset Stb_4021_sensor_selecao_produto
   nop
   nop
   nop
   nop
   nop
   nop
   For Loop_o = 1 To 8
      MOV A , {Dado_SELECAO}
      MoV C , Sda_4021_sensor_selecao_produto
      RLC A
      MOV {dado_SELECAO} , A
      Reset Scl_4021
      NOP
      nop
      nop
      nop
      nop
      nop
      Set Scl_4021
      NOP
      nop
      nop
      nop
      nop
      nop
   Next

   For Loop_o = 1 To 8
      MOV A , {Dado_SENSOR}
      MoV C , Sda_4021_sensor_selecao_produto
      RLC A
      MOV {Dado_SENSOR} , A
      Reset Scl_4021
      nop
      nop
      nop
      nop
      nop
      nop
      Set Scl_4021
      NOP
      nop
      nop
      nop
      nop
      nop
   Next
   Waitms 100
End Sub

Rem *************************************************************
Rem * Le sensor de fim de curso do motor - retorna em dado
Rem * Parametros: nenhum
Rem * Retorna: dado
Rem *************************************************************
Sub Le_sensor_fim_de_curso()
    Dado = P3 And 127
    Dado.2 = P1.7
    Dado.3 = P3.7
End Sub

Rem *************************************************************
Rem * Imprime um byte no lcd
Rem * Parametros: byte a ser impresso
Rem * Retorna: nenhum
Rem *************************************************************
Sub Imprime_byte_lcd(a_b As Byte)
    S = Str(a_b)
    Tam = Len(s)
    For Laco = 1 To Tam
       Dado = Mid(s , Laco , 1)
       Call Send_byte_lcd(dado , 0)
    Next
End Sub

Rem *************************************************************
Rem * Imprime uma string no lcd
Rem * Parametros: s com a string
Rem * Retorna: nenhum
Rem *************************************************************
Sub Imprime_string_lcd(s As String * 16)
    Tam = Len(s)
    For Laco = 1 To Tam
       Dado = Mid(s , Laco , 1)
       Call Send_byte_lcd(dado , 0)
    Next
End Sub

Rem *************************************************************
Rem * Envia 8 bits de dados ou controle para o lcd
Rem * Parametros: byte e se é controle (1) ou dados (0)
Rem * Retorna: nenhum
Rem *************************************************************
Sub Send_byte_lcd(a_b As Byte , Data_control As Byte )

   Temp = Leds

   Reset E

   Strobe_4094 = 0
   nop

   For Loop_o = 1 To 8
      Set Scl_4094
      nop
      MOV A , {a_b}
      RLC A
      JC .ONE_l
      Reset Sda_4094
      nop
      LJMP .OUTER_OUTER_l
One_l:
      Set Sda_4094
      nop
Outer_outer_l:
      MOV {a_b} , A
      Reset Scl_4094
      nop
   Next

   For Loop_o = 1 To 8
      Set Scl_4094
      nop
      MOV A , {temp}
      RLC A
      JC .ONE_2
      Reset Sda_4094
      nop
      LJMP .OUTER_OUTER_2
One_2:
      Set Sda_4094
      nop
Outer_outer_2:
      MOV {temp} , A
      Reset Scl_4094
      nop
   Next
      Set Scl_4094
      nop
   Strobe_4094 = 1
      nop

   If Data_control = 1 Then
      Reset Rs
      nop
   Else
      Set Rs
      nop
   End If
   'enable lcd
   Set E
   Waitms 1
   Reset E
   nop

End Sub

Rem *****************************************************
Rem * Envia 8 bits para o uln2803 - indicador de motores
Rem * Parametros: dado
Rem * Retorna: nenhum
Rem *****************************************************
Sub Send_byte_uln2803()

   Temp = Leds

   Strobe_4094 = 0
   nop

   'sem efeito para lcd (16 bits superiores)
   For Loop_o = 1 To 8
      Set Scl_4094
      nop
      Reset Scl_4094
      NOP
   Next
      Set Scl_4094
      NOP

   For Loop_o = 1 To 8
      Set Scl_4094
      NOP
      MOV A , {temp}
      RLC A
      JC .ONE_4
      Reset Sda_4094
      LJMP .OUTER_OUTER_4
One_4:
      Set Sda_4094
      NOP
Outer_outer_4:
      MOV {temp} , A
      Reset Scl_4094
      NOP
   Next
      Set Scl_4094
      NOP

   Strobe_4094 = 1
   nop

End Sub

Rem *************************************************************
Rem * Inicializa LCD
Rem * Parametros: nenhum
Rem * Retorna: nenhum
Rem *************************************************************
Sub Lcd_init()
     Call Send_byte_lcd(&H38 , 1)
     Call Send_byte_lcd(&H38 , 1)
     Call Send_byte_lcd(&H06 , 1)
     Call Send_byte_lcd(&H0e , 1)
     Call Send_byte_lcd(&H01 , 1)
     Call Send_byte_lcd(&H0c , 1)

 'CARACTERES GRAFICOS LCD
 'CEDILHA
     Call Send_byte_lcd(&H40 , 1)

     Call Send_byte_lcd(32 , 0)
     Call Send_byte_lcd(7 , 0)
     Call Send_byte_lcd(8 , 0)
     Call Send_byte_lcd(16 , 0)
     Call Send_byte_lcd(16 , 0)
     Call Send_byte_lcd(8 , 0)
     Call Send_byte_lcd(7 , 0)
     Call Send_byte_lcd(2 , 0)
 'A COM TIL
     Call Send_byte_lcd(12 , 0)
     Call Send_byte_lcd(23 , 0)
     Call Send_byte_lcd(32 , 0)
     Call Send_byte_lcd(31 , 0)
     Call Send_byte_lcd(17 , 0)
     Call Send_byte_lcd(31 , 0)
     Call Send_byte_lcd(17 , 0)
     Call Send_byte_lcd(17 , 0)

     Call Send_byte_lcd(&H80 , 1)
End Sub

Rem *************************************************************
Rem * Posiciona cursor (começa na linha 1, coluna 1)
Rem * Parametros: linha e coluna
Rem * Retorna: nenhum
Rem *************************************************************
Sub Lcd_pos(linha As Byte , Coluna As Byte)
    Coluna = Coluna - 1
    If Linha = 1 Then
       Linha = &H80 + Coluna
       Call Send_byte_lcd(linha , 1)
    End If
    If Linha = 2 Then
       Linha = &HC0 + Coluna
       Call Send_byte_lcd(linha , 1)
    End If
End Sub

Rem ******************************************************************
Rem * apaga lcd
Rem * Parametros: nenhum
Rem * Retorna: nenhum
Rem ******************************************************************
Sub Apaga_lcd()
    Call Send_byte_lcd(1 , 1)
End Sub

Rem ******************************************************************
Rem * Aguarda presssionar algo
Rem * Parametros: nenhum
Rem * Retorna: em "dado_selecao" "dado_sensor"
Rem ******************************************************************
Sub Espera_teclar()
      Call Rec_4021_sensor_selecao_produto()
      While Dado_selecao = 255
            Call Rec_4021_sensor_selecao_produto()
      Wend
End Sub

Rem ******************************************************************
Rem * LE SENHA memo
Rem * Parametros: nenhum
Rem * Retorna:EM SENHA_1, SENHA_2, SENHA_3, SENHA_4
Rem ******************************************************************
Sub Le_senha_memo()
             Call Read_ram_ds1307(2)
             Senha_1 = Dat
             Call Read_ram_ds1307(3)
             Senha_2 = Dat
             Call Read_ram_ds1307(4)
             Senha_3 = Dat
             Call Read_ram_ds1307(5)
             Senha_4 = Dat
End Sub

Rem ******************************************************************
Rem * MUDA COLUNA SENHA
Rem * Parametros: nenhum
Rem * Retorna:NENHUM
Rem ******************************************************************
Sub Muda_coluna_senha()
               If Tecla_1 = 0 Then
                  Call Espera_soltar_tecla_1()
                  Senha_1_e = Senha_1_e + 1
                  If Senha_1_e > "Z" Then
                      Senha_1_e = "A"
                  End If
               End If

               If Tecla_2 = 0 Then
                  Call Espera_soltar_tecla_2()
                  Senha_2_e = Senha_2_e + 1
                  If Senha_2_e > "Z" Then
                      Senha_2_e = "A"
                  End If
               End If

               If Tecla_3 = 0 Then
                  Call Espera_soltar_tecla_3()
                  Senha_3_e = Senha_3_e + 1
                  If Senha_3_e > "Z" Then
                    Senha_3_e = "A"
                  End If
               End If

               If Tecla_4 = 0 Then
                  Call Espera_soltar_tecla_4()
                  Senha_4_e = Senha_4_e + 1
                  If Senha_4_e > "Z" Then
                    Senha_4_e = "A"
                  End If
               End If

End Sub

Rem ******************************************************************
Rem * ve quantidades de creditos
Rem * Parametros: nenhum
Rem * Retorna:em "creditos"
Rem ******************************************************************
Sub Creditos_colocados()
          Call Read_ram_ds1307(0)
          Creditos = Dat * 256
          Call Read_ram_ds1307(1)
          Creditos = Creditos + Dat
End Sub

Rem ******************************************************************
Rem * MUDA COLUNA SENHA
Rem * Parametros: nenhum
Rem * Retorna:NENHUM
Rem ******************************************************************
Sub Mostra_senha()
                Call Send_byte_lcd(senha_1_e)
                Call Send_byte_lcd(senha_2_e)
                Call Send_byte_lcd(senha_3_e)
                Call Send_byte_lcd(senha_4_e)
End Sub

Rem ******************************************************************
Rem * AGUARDA SOLTAR TECLA
Rem * Parametros: nenhum
Rem * Retorna:NENHUM
Rem ******************************************************************
Sub Espera_soltar_tecla_1()
             While Tecla_1 = 0
                Call Rec_4021_sensor_selecao_produto()
             Wend
             Waitms 1
End Sub
Sub Espera_soltar_tecla_2()
             While Tecla_2 = 0
                Call Rec_4021_sensor_selecao_produto()
             Wend
             Waitms 1
End Sub
Sub Espera_soltar_tecla_3()
             While Tecla_3 = 0
                Call Rec_4021_sensor_selecao_produto()
             Wend
             Waitms 1
End Sub
Sub Espera_soltar_tecla_4()
             While Tecla_4 = 0
                Call Rec_4021_sensor_selecao_produto()
             Wend
             Waitms 1
End Sub
Sub Espera_soltar_tecla_5()
             While Tecla_5 = 0
                Call Rec_4021_sensor_selecao_produto()
             Wend
             Waitms 1
End Sub
Sub Espera_soltar_tecla_6()
             While Tecla_6 = 0
                Call Rec_4021_sensor_selecao_produto()
             Wend
             Waitms 1
End Sub
Sub Espera_soltar_tecla_7()
             While Tecla_7 = 0
                Call Rec_4021_sensor_selecao_produto()
             Wend
             Waitms 1
End Sub

Sub Espera_soltar_tecla_enter()
             While Tecla_5 = 0
                Call Rec_4021_sensor_selecao_produto()
             Wend
End Sub

Sub Espera_soltar_tecla_menu()
             While Menu = 0
                Call Rec_4021_sensor_selecao_produto()
             Wend
End Sub

Sub Espera_soltar_tecla_nao()
             While Tecla_nao = 0
                Call Rec_4021_sensor_selecao_produto()
             Wend
End Sub


Rem ******************************************************************
Rem * FILTRA MOTOR NAO UTILIZADO
Rem * Parametros: nenhum
Rem * Retorna:NENHUM
Rem ******************************************************************
Sub Filtra_motores_nao_usados()
    Call Read_ram_ds1307(6)
    If Dat = 1 Then
       Mask_motor = 1
    End If

    If Dat = 2 Then
       Mask_motor = 3
    End If

    If Dat = 3 Then
       Mask_motor = 7
    End If

    If Dat = 4 Then
       Mask_motor = 15
    End If

    If Dat = 5 Then
       Mask_motor = 31
    End If

    If Dat = 6 Then
       Mask_motor = 63
    End If

    If Dat = 7 Then
       Mask_motor = 127
    End If

End Sub

Rem *******************************
Rem Zera memo se menu pressionado
Rem parametros: nenhum
Rem retorno: nenhum
Rem *******************************
Sub Zera_se_menu_pressionado()
   Call Rec_4021_sensor_selecao_produto()
   If Menu = 0 Then
         'acerta hora
         Call Acerta_hora_ds1307(00 , 00 , 00)
         Call Grava_ram_ds1307(0 , 0)
         Call Grava_ram_ds1307(1 , 0)
         Call Grava_ram_ds1307(2 , "A")
         Call Grava_ram_ds1307(3 , "A")
         Call Grava_ram_ds1307(4 , "A")
         Call Grava_ram_ds1307(5 , "A")
         Call Grava_ram_ds1307(6 , 1)
         'Call Grava_ram_ds1307(7 , 0)
         'Call Grava_ram_ds1307(8 , 0)
         'Call Grava_ram_ds1307(9 , 0)
         'Call Grava_ram_ds1307(&Ha , 0)

         Call Apaga_lcd()
         Call Lcd_pos(1 , 1)
         Call Imprime_string_lcd( "MEMORIA")
         Call Lcd_pos(2 , 1)
         Call Imprime_string_lcd( "INICIALIZADA")
         Wait 1
         While 1 = 1
            '**************************************
            'DEBUG
            Call Rec_4021_sensor_selecao_produto()
            If Tecla_enter = 0 Then
               Call Espera_soltar_tecla_enter()
               Return
            End If
            Call Apaga_lcd()
            Call Collect_hora_ds1307()
            Call Imprime_string_lcd()
            Wait 1
            Call Apaga_lcd()
            Call Imprime_string_lcd( "SW")
            Call Imprime_byte_lcd(dado_selecao)
            Call Imprime_string_lcd( "SP")
            Dado_sensor = Dado_sensor And 127
            Call Imprime_byte_lcd(dado_sensor)
            Call Imprime_string_lcd( "MT")
            Call Read_ram_ds1307(6)
            Call Imprime_byte_lcd(dat)
            Call Lcd_pos(2 , 1)
            Call Imprime_string_lcd( "CR")
            Call Imprime_byte_lcd(creditos)
            Call Imprime_string_lcd( "FC")
            Temp = P3 And 127
     '      LIBERANDO INT0 E INT1
            Temp.2 = P1.7
            Temp.3 = P3.7
            Call Imprime_byte_lcd(temp)
            Wait 3
         Wend
    '**************************************         Wend
   End If
End Sub

Rem ******************************************************
Rem CREDITS INTERRUPTS
Rem parametros: nenhum
Rem retorno: nenhum
Rem ******************************************************
Credit_1:
   Pulsos_con1 = Pulsos_con1 + 1
   If Pulsos_con1 = Qnt_pls_obt_cred1 Then
      Call Soma_creditos_colocados(qnt_soma_em_cred1)
      Pulsos_con1 = 0
   End If
   Call Grava_ram_ds1307(9 , Pulsos_con1)
   Return

Credit_2:
   Pulsos_con2 = Pulsos_con2 + 1
   If Pulsos_con2 = Qnt_pls_obt_cred2 Then
      Call Soma_creditos_colocados(qnt_soma_em_cred2)
      Pulsos_con2 = 0
   End If
   Call Grava_ram_ds1307(&Ha , Pulsos_con2)
   Return

Rem ******************************************************************
Rem * ADICIONA CREDITOS
Rem * Parametros: nenhum
Rem * Retorna:em "creditos"
Rem ******************************************************************
Sub Soma_creditos_colocados(a_b As Byte)
    Call Read_ram_ds1307(0)
    Creditos = Dat * 256
    Call Read_ram_ds1307(1)
    Creditos = Creditos + Dat
    Creditos = Creditos + A_b
    Call Grava_ram_ds1307(0 , High(creditos))
    Call Grava_ram_ds1307(1 , Low(creditos))
End Sub

Rem *********************************************
Rem PEGA QUANTIDADE DE PULSOS PARA OBTER CREDITO
Rem parametros: nenhum
Rem retorno: nenhum
Rem *********************************************
Sub Qnt_puls_cred1()
    Call Read_ram_ds1307(7)
    Qnt_pls_obt_cred1 = Lookup(dat , Table_pulsos_con1)
    Dat = Dat + 1
    Qnt_soma_em_cred1 = Lookup(dat , Table_pulsos_con1)
    Call Read_ram_ds1307(9)
    Pulsos_con1 = Dat
End Sub

Sub Qnt_puls_cred2()
    Call Read_ram_ds1307(8)
    Qnt_pls_obt_cred2 = Lookup(dat , Table_pulsos_con2)
    Dat = Dat + 1
    qnt_soma_em_cred2 = Lookup(dat , Table_pulsos_con2)
    Call Read_ram_ds1307(&Ha)
    Pulsos_con2 = Dat
End Sub

Rem ******************************************************************
Rem * ve quantidades de creditos
Rem * Parametros: nenhum
Rem * Retorna:em "creditos"
Rem ******************************************************************
Sub Remove_creditos_colocados()
    Call Read_ram_ds1307(0)
    Creditos = Dat * 256
    Call Read_ram_ds1307(1)
    Creditos = Creditos + Dat
    If Creditos > 0 Then
       Creditos = Creditos - 1
    End If
    Call Grava_ram_ds1307(0 , High(creditos))
    Call Grava_ram_ds1307(1 , Low(creditos))
End Sub

Rem *********************************************
Rem APRESENTACAO
Rem parametros: nenhum
Rem retorno: nenhum
Rem *********************************************
Sub Apresentacao()
    Call Apaga_lcd()
    Call Lcd_pos(1 , 4)
    Call Imprime_string_lcd( "xxxxxxxx")
    Call Lcd_pos(2 , 5)
    Call Imprime_string_lcd( "AUTOMA")
    Call Send_byte_lcd(0 , 0)
    Call Send_byte_lcd(1 , 0)
    Call Imprime_string_lcd( "O")
    Wait 5
    Call Apaga_lcd()
End Sub

Table_pulsos_con1:
Data 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 , 5 , 5 , 6 , 6 , 7 , 7 , 8 , 8 , 9 , 9 , 10 , 10
Table_pulsos_con2:
Data 1 , 2 , 2 , 3 , 3 , 4 , 4 , 5 , 5 , 6 , 6 , 7
End
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 5761
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: como expandir portas do 8051 usando shift registers?

Mensagempor tcpipchip » 30 Mai 2014 19:25

------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 5761
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: como expandir portas do 8051 usando shift registers?

Mensagempor tcpipchip » 30 Mai 2014 19:31

Se quiserem, fiz tambem no PROTEUS tambem...para simularem....
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 5761
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: como expandir portas do 8051 usando shift registers?

Mensagempor renan-papaco » 08 Jul 2014 19:47

Gente...agradeço pelas respostas mas é o seguinte:

se eu fiz ou não algo aqui não interessa muito. não preciso nem fazer nada pois não disponho de tempo e paciência para testar...estou aqui para aprender e tudo que é posto aqui eu estudo posteriormente quando eu sinto vontade de montar e experimentar.


sobre o proteus, é o seguinte: não gosto dele. não acho necessário usa-lo, gosto de ver meu projeto funcionando das minhas mãos, me surpreendendo com ele e é assim q gosto... só porque a maioria usa este programa não significa q eu tenha que aderir a ele também.

e por último...sou uma lesma com mais comentários? e daí? eu não nasci sabendo...

estarei investindo meu tempo á eletrônica em circuitos lógicos e outros seguimentos como áudio e outros projetinhos mais simples e estou dando um tempo com programação...pelo menos por enquanto.

obrigado aí a quem me ajudou ou tentou...vlw falou!
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: como expandir portas do 8051 usando shift registers?

Mensagempor ze » 09 Jul 2014 08:21

ah.. thá.. com relação a lesma não foi referência a vc meu jovem. foi com relação ao fonte anterior que lhe passei. a tradução seria "a mesma mrd do post anterior mas com mais explicações". desculpe meu estilo literário criptografoso. Falando nisso...

Foi mal
Orientei-te como pude
Desculpa, não fui melhor
Agora não posso mais
-
Sou incapaz
Enfim boa sorte!

(brinc. hein.rs)

de toda forma, eu é que agradeço. aprendemos juntos! obs: também sou fã do apenas um show (e hora da aventura e gumball)
Avatar do usuário
ze
Dword
 
Mensagens: 1547
Registrado em: 05 Jun 2007 14:32

Anterior

Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes