Sei sulla pagina 1di 8

Aplanado, aqui te dejo un programita que te puede dar una idea de lo que quieres:

program Onof
' El programa enciende LED en pin RB0 del PORTB del F84
' cada vez que se presiona un pulsdor colocado en pin RB1 del PORTB.
' La activación es un cambio de 1 a 0 y espera hasta que se libere el pulsante
' es decir un cambio de 0 a 1.
dim a as byte 'esta variable se emplea solo como una condicion del ciclo While

main:
'******************************************************************************
' INICIALIZACIÓN DE PUERTOS Y PERIFÉRICOS
'******************************************************************************
     TRISB.0 = 0       ' Pin 0 del Puerto B salida
     TRISB.1 = 1       ' Pin 0 del Puerto B entrada
     a = 1
'******************************************************************************
' PROGRAMA PRINCIPAL
'******************************************************************************
     while a < 2   'Se cumple condicion siempre que a sea menor que 1
          if Button(PORTB,1,100,0) then ' Espera un pulso de 1 a 0

          'Button(port,pin, time, active_state)


          'El Parametro port especifica el puerto donde esta el boton;
          'el parametro pin es el numero del pin del puerto y va de 0...7;
          ' el parametro time es el periodo del antirebote en milisegundos;
          'el parametro active_state puede ser  0 o 1, y determina si el boton
          'esta en activo logico (1) o activo bajo (0).

             if PORTB.0 = 0 then


                SetBit(PORTB,0)       ' Si el LED estaba apagado lo enciende
             else
                ClearBit(PORTB,0)     ' Si estaba prendido lo apaga
             end if

            while PORTB.1 = 0        ' Espera sin hacer nada hasta que se


                                     ' halla liberado el pulsador
                   a = 1
            wend
          end if
     wend              ' Bucle infinito
end.

dim txt      as char[20]


dim xtx      as char[20]
dim Freq     as word
dim Tmp_Freq as word
dim Freqs     as word
dim Tmp_Freqs as word
dim Voltajebateria, bateria as word
dim Porcentbateria as word
dim Volbateriatest as string[16]
dim Porbateriatest as string[16]
dim T0Count  as byte

sub procedure Voltbateria


     bateria = adc_read(0)
     voltajebateria = (bateria*10/65)
     Porcentbateria = (voltajebateria*100/12)
     WordToStr(voltajebateria, volbateriatest)
     WordToStr(Porcentbateria, Porbateriatest)
     Lcd_Chr(3, 17, volbateriatest[2])
     Lcd_Chr(3, 18, volbateriatest[3])
     Lcd_Chr(3, 19, 46)
     Lcd_Chr(3, 20, volbateriatest[4])
     Lcd_Chr(4, 16, Porbateriatest[2])
     Lcd_Chr(4, 17, Porbateriatest[3])
     Lcd_Chr(4, 18, 46)
     Lcd_Chr(4, 19, Porbateriatest[4])
     Lcd_Chr(4, 20, "%")
end sub

sub procedure albat


  If adc_read(0) > 746 then
      Lcd_out(4,1,"VOLTAJE OPTI.")
  else
      Lcd_out(4,1,"VOLTAJE BAJO  ")
      delay_ms(300)
  end if
end sub

sub procedure Interrupt


      if TestBit(INTCON, T0IF) = 1 then
      inc(T0Count)
        if T0Count = 1 then
          Freq = Tmp_Freq*40
          Freqs = Tmp_Freqs*40/60
          Tmp_Freq = 0
          Tmp_Freqs = 0
          T0Count = 0
          TMR0H     = $0c
          TMR0L     = $0c
        end if
      ClearBit(INTCON, TMR0IF)
    else
       Inc(Tmp_Freq)
       Inc(Tmp_Freqs)
       ClearBit(INTCON, INT0IF)
    end if
end sub

sub procedure iniciolcd


   Lcd_Config(PORTC,2,3,0,1, PORTC,4,6,5)
   Lcd_Cmd(LCD_CURSOR_OFF)
   Lcd_Cmd(LCD_CLEAR)
    LCD_CMD(128)
    LCD_CMD(192)
    LCD_CMD(148)
    LCD_CMD(212)
end sub

sub procedure visualizacion


         Lcd_out(1,1,"TACOMETRO RPM")
         Lcd_out(2,1,"TACOMETRO RPS")
         Lcd_out(3,1,"VOLTAJE BATERIA")
         WordToStr(Freq, txt)
         WordToStr(Freqs, xtx)
         Lcd_Out(1, 16, txt)
         Lcd_Out(2, 16, xtx)
         Voltbateria
         albat
end sub

main:
 T0CON     = $00
 INTCON2.INTEDG0 = 0
 T0CON.TMR0ON = 1
 INTCON       = $01D5
 iniciolcd
 Interrupt

  while true
     Visualizacion
  wend
end.
'DEFINO VARIABLES
 
dim X, BUFFER1 as byte
dim  M as byte
'DIM TMP AS BYTE
DIM TeMP2 AS word
DIM TEXT1  AS CHAR[16]
 
DIM TEMP AS WORD
DIM TEMP_C AS WORD
DIM MAT1,MAT2,MAT3 AS LONGWORD
 
main:
'CONFIGURACION DE PUERTOS
ANSEL = $00
ANSELH = $00
'SSPCON = %00010000
'SSPSTAT = %01000001
WPUA = $00
IOCA = $00
TRISA = $00
PORTA = $00
WPUB = %00000000
IOCB = $00
TRISB = %00010000
PORTB = $00
TRISC = $00
PORTC = $00
LCD_INIT(PORTC)
LCD_CMD(LCD_CURSOR_OFF)
'SOFT_SPI_CONFIG(PORTB, 4,5,6)
PORTB.7 = 1
BUFFER1=$00
TEMP=0
TEMP_C=0
'PROGRAMA
P1:
LCD_CMD(LCD_CLEAR)
LCD_OUT(1,1, "loco por")
LCD_OUT(2,1,"INCORDIAR")
DELAY_MS(1000)
P2:
'aqui la rutina de leer el max manualmente
read2:
TRISB = %00010000  'CONFIG PORT B
portb.6=0 ' es el pin del reloj
'portb.7=1     'pin del cs
'delay_ms(10)
portb.7=0    'activamos leer
delay_ms(25)
portb.6=0
delay_ms(25)
portb.6=1
delay_ms(25)
 
for M = 0 to 15 'step -1
portb.6=1
delay_ms(200)
if portb.4 = 0 then temp.M=0 else temp.M=1 end if
delay_ms(200)
portb.6=0
delay_ms(25)
next M
 
 
'delay_ms(5)
portb.7=1
 'PARA COLOCAR CADA BIT EN SU SITIO DENTRO DE UN WORD
FOR X = 0 TO 15
IF TeMP.X = 0  THEN TEMP2.15-X = 0 ELSE TEMP2.15-X = 1 END IF
NEXT X
 TEMP=temp2
  'PARA VER SI SE HA DESCONECTADO LA TERMOCOUPLA
IF TEMP.2 = 1 THEN
  LCD_CMD(LCD_CLEAR)
  LCD_OUT(1,1, "TERMOPAR")
  LCD_OUT(2,1, "DESCONECTADO")
  GOTO P2
  ELSE GOTO BB
END IF
BB:
'ROTO TRES A LA DERECHA
TEMP= TEMP >>3
'FILTRO
MAT1=0
MAT2=0
'MAT3=0
'TEMP = TEMP AND $0FFF 'sobra
MAT1= TEMP * 1024
MAT2= MAT1 / 4096
'MAT3 = MAT2 /10
TEMP_C = MAT2-28
'TEMP_C = TEMP_C
'CONVIERTO A CADENA Y MUESTRO
WORDTOSTR(TEMP_C, TEXT1)
LCD_CMD(LCD_CLEAR)
LCD_OUT(1,1, "LECTURA:")
LCD_OUT(2,2, TEXT1 )
 LCD_OUT(2,7, " C")
DELAY_MS(200)

 
GOTO P2
END.
Hola Anduri, te recomiendo que utilices la función WordToStr de MikroBasic para convertir un un numero
tipo word o long int a String.

En tu código aparece esto


Código

GeSHi (freebasic):
1. ' adc_rd = ADC_read(0) ' get ADC value from 1st
channel
2. adc_rd = 200 ' valore caricato x debug
3. tlong = adc_rd*5000 ' trasformazione per fondo scala 5
volt
4. adc_rd = tlong >> 10 ' divisione per 1024 (10 bit)
5. ch = adc_rd div 1000 ' prepare value for diplay
6. Lcd_Chr(1, 3, 48+ch) ' write ASCII at 1st row, 9th
column
7. Lcd_Chr(1, 4, ".")
8. ch = (adc_rd div 100) mod 10
9. Lcd_Chr(1, 5, 48+ch)
10. ch = (adc_rd div 10) mod 10
11. Lcd_Chr(1, 6, 48+ch)
12. ch = adc_rd mod 10
13. Lcd_Chr(1, 7, 48+ch)
14. delay_ms(1)
15.  

Te recomiendo que utilices


Código

GeSHi (freebasic):
1. ' adc_rd = ADC_read(0) ' get ADC value from 1st
channel
2. adc_rd = 200 ' valore caricato x debug
3. tlong = adc_rd*5000 ' trasformazione per fondo scala 5
volt
4. adc_rd = tlong >> 10 ' divisione per 1024 (10 bit)
5. WordToStr(adc_rd,txt)
6. if(txt[0]=' ') then      'Si el primer elemento de la
cadena txt es un espacio
7.   txt[0]='0'            'Lo debemos convertir a 0
8. end if
9. Lcd_Chr(1,3,txt[0])    'Imprimimos el primer elemento
de la cadena
10. Lcd_Chr_Cp('.')        'Imprimimos el punto
11. Lcd_Out_Cp(txt[1])     'Imprimimos el resto de la
cadena comenzando del segundo elemento.
12. ........
txt debe ser declarado como una cadena de la siguiente manera
Código

GeSHi (freebasic):
1. dim txt as string[5]

Si utilizas la version pro de MikroBasic puedes utilizar la funcion WordToStrWithZeros, con la cual podrías eliminar
la pregunta si es cero.

main:
  INTCON  = %00000000                    ' Todo deshabilitado
GIE, PEIE, TMR0IE,INT0IE,RBIE
  INTCON2 = 0xF5
  INTCON3 = 0xC0
  RCON.IPEN = 0                          ' Desabilitar la
prioridad de interrupcion
  PIE1 = 0
  PIE2 = 0
  PIR1 = 0
  PIR2 = 0

  ADCON1 = 0x0F                          ' Puertos analogicos


como digitales

  TRISA = 0x00
  TRISB = 0x00
  TRISC = 0x00

  LATA = 0
  LATB = 0
  LATC = 0

  While true
    PORTB=0xFF
    Delay_ms(1000)
    PORTB=0x00
    Delay_ms(1000)
  Wend
end.
dim kp, curX, curY as byte
dim keypadPORT as byte at PORTD ' Esta variable debe estar definida
en todos los proyectos por
' medio de la librería Keypad. Así se define el puerto
utilizado para conectar el teclado

dim LCD_RS as sbit at RB4_bit ' Conexiones del módulo Lcd


LCD_EN as sbit at RB5_bit
LCD_D4 as sbit at RB0_bit
LCD_D5 as sbit at RB1_bit
LCD_D6 as sbit at RB2_bit
LCD_D7 as sbit at RB3_bit
LCD_RS_Direction as sbit at TRISB4_bit
LCD_EN_Direction as sbit at TRISB5_bit
LCD_D4_Direction as sbit at TRISB0_bit
LCD_D5_Direction as sbit at TRISB1_bit
LCD_D6_Direction as sbit at TRISB2_bit
LCD_D7_Direction as sbit at TRISB3_bit ' Final de conexiones del
módulo LCD

main: ' Inicio de programa


curX=1 ' Memorizar de la posición del cursor en el
visualizador LCD 2x16
curY=1
ANSEL = 0 ' Configurar pines analógicos como digitales ed
E/S
ANSELH = 0
TRISB = 0
PORTB = 0xFF
Keypad_Init() ' Inicializar el teclado en el puerto PORTC
Lcd_Init() ' Inicializar el LCD en el puerto PORTB,
Lcd_Cmd(_LCD_CLEAR) ' Borrar el visualizador

while true ' Esperar que alguna tecla se presione y suelte

kp = 0
while kp = 0
kp = Keypad_Key_Click()
Delay_ms(10)
wend

select case kp ' Preparar el valor comoo salida


case 1 kp = "1"
case 2 kp = "2"
case 3 kp = "3"
case 4 kp = "A"
case 5 kp = "4"
case 6 kp = "5"
case 7 kp = "6"
case 8 kp = "B"
case 9 kp = "7"
case 10 kp = "8"
case 11 kp = "9"
case 12 kp = "C"
case 13 kp = "*"
case 14 kp = "0"
case 15 kp = "#"
case 16 kp = "D"
end select

if (curY > 16) then ' Cambiar de posición del cursor


if (curX = 1) then
Lcd_Cmd(_LCD_SECOND_ROW)
curX = 2
curY = 1
else
Lcd_Cmd(_LCD_FIRST_ROW)
curX = 1
curY = 1
end if
end if

Lcd_Chr_CP(kp) ' Visualizar en el LCD


Inc(curY)
wend

end.

Potrebbero piacerti anche