You are on page 1of 11

SIMULACIN:

PROGRAMA EN BASCOM: $regfile = "m164pdef.dat" $crystal = 8000000 Config Lcdbus = 4 Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 , Rs = Portd.0 , E = Portd.1 Config Lcd = 16 * 2 P1 P2 P3 P4 Alias Alias Alias Alias Portd.4 Portd.5 Portd.6 Portd.7 = = = = Input Input Input Input : : : : P1 P2 P3 P4 = = = = 1 1 1 1

Config Config Config Config

P1 P2 P3 P4

Config Int0 = Falling On Int0 Leer Locate 1 , 6 : Lcd "Epn" Locate 2 , 1 : Lcd "Control Con Micros" Wait 1 Cls Locate 1 , 1 : Lcd "M. LOZA C" Locate 2 , 1 : Lcd "S. CHAGLLA E"

Wait 1 Cls Enable Interrupts Enable Int0 Dim Pulsador As Byte , Valor As Byte Do Cursor Off Locate 1 , 1 : Lcd "Pulsar Tecla" While Pulsador = 1 Locate 1 , 1 : Lcd " DESCENDENTE" : Waitms 50 If Valor = 0 Then Locate 2 , 1 : Lcd Valor Else Decr Valor Cls : Locate 2 , 1 : Lcd Valor : Waitms 50 End If Wend While Pulsador = 2 Locate 1 , 1 : Lcd " If Valor = 255 Then ASCENDENTE" : Waitms 50

Locate 2 , 1 : Lcd Valor Else Incr Valor Cls : Locate 2 , 1 : Lcd Valor : Waitms 50 End If Wend While Pulsador = 3 Locate 1 , 1 : Lcd " DECREMENTAR" : Cls : Locate 2 , 1 : Lcd Valor : Waitms 50 Wend While Pulsador = 4 Locate 1 , 1 : Lcd " INCREMENTAR" : Cls : Locate 2 , 1 : Lcd Valor : Waitms 50 Wend Loop Leer: If Pind.4 = 0 Then Pulsador = 1 End If If Pind.5 = 0 Then Pulsador = 2 End If If Pind.6 = 0 Then Pulsador = 3 If Valor >= 3 Then

Valor = Valor - 3 Else Valor = Valor End If End If If Pind.7 = 0 Then Pulsador = 4 If Valor <= 253 Then Valor = Valor + 3 Else Valor = Valor End If End If Return PROGRAMA EN ASSEMBLER:

.include "m164pdef.inc" ;constantes .equ e=0 .equ rs=1 dato .equ control_lcd=portd .equ bus=portb .equ p_1=4 .equ p_2=5 .equ p_3=6 .equ p_4=7 .equ .equ .equ .equ .equ .equ ;variables .def pulsadores .def .def .def .cseg jmp config .org 0x02 jmp interrupcion config: ;entradas y salidas ldi r16,0b00000011 out ddrd,r16 ser r16 out portd,r16 out ddrb,r16 t_32us=1 t_4_1ms=129 t_100us=4 t_40us=2 t_1_64ms=52 t_8ms=255 ;TIMER2 tiempo ;TIMER2 tiempo ;TIMER2 ;TIMER2 tiempo ;TIMER2 tiempo ;TIMER2

;PIND.0 para hablilitar LCD ;PIND.1 para instruccion o ;cambio el nombre del puerto d ;cambio el nombre del puerto b ;posicion del pulsador ;posicion del pulsador ;posicion del pulsador ;posicion del pulsador aproximado 32us aproximado 4.128ms tiempo aproximado 128us aproximado 64us aproximado 1.664ms tiempo aproximado 8.16ms

pulsadores=r19 unidad=r20 decena=r21 centena=r22

;variable donde se guarda el estado de los ;variable de unidades ;variable de decenas ;variable de centenas

;entradas (pulsadores, int0), salidas(e, rs)

;pull up ;bus de datos 8bits

ldi r16,0b00000001 out ddra,r16 ;Stack pointer ldi r16,low(ramend) out spl,r16 ldi r16,high(ramend) out sph,r16 ;habilitar ldi sts ldi out ldi out interrupcin INT0 r16,(1<<ISC01) EICRA,r16 r16,(1<<INT0) EIMSK,r16 r16,(1<<INTF0) EIFR,r16

;led

;flanco de bajada ;habilita interrupcion INT0 ;limpio bandera de INT0

;inicializacion LCD cbi control_lcd,rs cbi control_lcd,e ldi r16,t_8ms rcall retardo ldi r16,t_8ms rcall retardo ldi r16,0x38 out bus,r16 sbi control_lcd,e ldi r16,t_4_1ms rcall retardo cbi control_lcd,e ldi r16,0x38 out bus,r16 sbi control_lcd,e ldi r16,t_100us rcall retardo cbi control_lcd,e ldi r16,0x38 rcall envio_dato ;=====enviar instrucciones ;function set ldi r16,0b00111000 rcall envio_dato ;Entry mode set ldi r16,0b00000110 rcall envio_dato ;Display ON/OFF control ldi r16,0b00001110 rcall envio_dato ;display clear rcall limpia_lcd ;cargo al lcd 0x38 ;habilitar el lcd ;rs como instruccion ;deshabilitar el lcd

;deshabilitar el lcd

;habilitando el lcd

;deshabilitando

el lcd

; (8bit, 2 lineas, matriz 5x7)

; (incremento uno, no desplaza)

; (display on, cursor on, blink off)

rcall primera_linea ldi zl,low(tabla_1*2) ldi zh,high(tabla_1*2) rcall escribe rcall segunda_linea ldi zl,low(tabla_2*2) ldi zh,high(tabla_2*2) rcall escribe rcall retardo_1s rcall primera_linea ldi zl,low(tabla_3*2) ldi zh,high(tabla_3*2) rcall escribe rcall segunda_linea ldi zl,low(tabla_4*2) ldi zh,high(tabla_4*2) rcall escribe rcall retardo_1s ldi pulsadores, 0b11110000 sei ;habilita interrupciones globales ;programa principal inicio: sbrs pulsadores,p_1 rcall descendente sbrs pulsadores,p_2 rcall ascendente sbrs pulsadores,p_3 rcall decrementa sbrs pulsadores,p_4 rcall incrementa rjmp inicio ;subrurtinas descendente: ;centenas cpi centena,0 breq comp_d ok_num_d: rcall decre fin_d: rcall limpia_lcd ;escribe titulo rcall primera_linea ldi zl,low(tabla_5*2) ldi zh,high(tabla_5*2) rcall escribe ;escribe numero rcall escribe_numero rcall retardo_300ms ret ;decenas comp_d: cpi decena,0 breq comp_u rjmp ok_num_d

;compara si llega a cero

;decrementa el numero

;compara si llega a cero

;unidades comp_u: cpi unidad,0 breq fin_d rjmp ok_num_d ;decrementa el numero decre: dec unidad cpi unidad,0 brmi decre_d ret ;decrementa decenas decre_d: ldi unidad,9 dec decena cpi decena,0 brmi decre_c ret decre_c: ldi decena,9 dec centena ret ascendente: ;centenas cpi centena,2 breq comp_d_a ok_num_a: rcall ascen fin_a: rcall limpia_lcd ;escribe titulo rcall primera_linea ldi zl,low(tabla_6*2) ldi zh,high(tabla_6*2) rcall escribe ;escribe numero rcall escribe_numero rcall retardo_300ms ret ;decenas comp_d_a: cpi decena,5 breq comp_u_a rjmp ok_num_a ;unidades comp_u_a: cpi unidad,5 breq fin_a rjmp ok_num_a ascen: inc unidad cpi unidad,10 breq ascen_d ret ;decrementa decenas

;compara si llega a cero

;compara si llega a cero

;compara si llega a cero

;compara si llega a 2

;decrementa el numero

;compara si llega a 5

;compara si llega a 5

;compara si llega a cero

ascen_d: ldi unidad,0 inc decena cpi decena,10 breq ascen_c ret ascen_c: ldi decena,0 inc centena ret

;compara si llega a cero

decrementa: ldi pulsadores, 0b11110000 ;limpio bandera ;centenas cpi centena,0 ;compara si llega a cero breq decrementa_d ok_num_decrementa: rcall decre_tres ;decrementa el numero fin_decrementa: rcall limpia_lcd ;escribe titulo rcall primera_linea ldi zl,low(tabla_7*2) ldi zh,high(tabla_7*2) rcall escribe ;escribe numero rcall escribe_numero ret ;decenas decrementa_d: cpi decena,0 ;compara si llega a cero breq decrementa_u rjmp ok_num_decrementa ;unidades decrementa_u: cpi unidad,3 ;compara si llega a cero brlo fin_decrementa rjmp ok_num_decrementa ;::::::::::::::::::::::::::::::::::::::: ;decrementa el numero en 3 ;::::::::::::::::::::::::::::::::::::::: decre_tres: ldi r16,3 sub unidad,r16 cpi unidad,0xff ;unidad tiene 2 breq decre_9 cpi unidad,0xfe ;unidad tiene 1 breq decre_8 cpi unidad,0xfd ;unidad tiene 0 breq decre_7 ret ;_______decrementa decena decre_9: ldi unidad,9 rjmp decre_decena decre_8: ldi unidad,8 rjmp decre_decena

decre_7: ldi unidad,7 decre_decena: dec decena cpi decena,0 brmi decre_centena ret decre_centena: ldi decena,9 dec centena ret

;compara si llega a cero

incrementa: ldi pulsadores, 0b11110000 ;limpio bandera ;________centena cpi centena,2 ;compara si llega a 2 breq inc_d ok_num_inc: rcall inc_tres ;decrementa el numero fin_inc: rcall limpia_lcd ;escribe titulo rcall primera_linea ldi zl,low(tabla_8*2) ldi zh,high(tabla_8*2) rcall escribe ;escribe numero rcall escribe_numero ret ;________decena inc_d: cpi decena,5 ;compara si llega a 5 breq inc_u rjmp ok_num_inc ;________unidad inc_u: cpi unidad,3 ;compara si es menor brlo fin_inc rjmp ok_num_inc inc_tres: ldi r16,3 add unidad,r16 cpi unidad,10 breq inc_0 cpi unidad,11 breq inc_1 cpi unidad,12 breq inc_2 ret ;_______decrementa decena inc_0: ldi unidad,0 rjmp inc_decena inc_1: ldi unidad,1 rjmp inc_decena inc_2:

;unidad tiene 7 ;unidad tiene 8 ;unidad tiene 9

ldi unidad,2 inc_decena: inc decena cpi decena,10 breq inc_centena ret inc_centena: ldi decena,0 inc centena ret escribe_numero: cbi control_lcd,rs ldi r16,0xc7 rcall envio_dato sbi control_lcd,rs ;unidades mov r16,centena ori r16,0x30 rcall envio_dato ;decenas mov r16,decena ori r16,0x30 rcall envio_dato ;centenas mov r16,unidad ori r16,0x30 rcall envio_dato ret primera_linea: cbi control_lcd,rs ldi r16,0x80 rcall envio_dato ret segunda_linea: cbi control_lcd,rs ldi r16,0xc0 rcall envio_dato ret escribe: sbi control_lcd,rs sigue_m: lpm r16,z+ cpi r16,'~' breq fin_escribe rcall envio_dato rjmp sigue_m fin_escribe: ret limpia_lcd: cbi control_lcd,rs ldi r16,0b00000001 out bus,r16 sbi control_lcd,e

;compara si llega a cero

;escribir nmero en LCD ;rs como instruccion ;coloca en la mitad al cursor ;rs como dato

;ubicar cursor ;rs como instruccion

;rs como instruccion

;enviar datos a LCD ;rs como dato

;rs como instruccion ; (limpia lcd) ;habilitando el lcd

ldi r16,t_1_64ms rcall retardo cbi control_lcd,e sbi control_lcd,rs ret envio_dato: out bus,r16 sbi control_lcd,e ;espero 40us ldi r16,t_40us rcall retardo cbi control_lcd,e ret ;RETARDOS

;deshabilitando ;rs como dato

el lcd

;habilitando el lcd

;deshabilitando

el lcd

retardo_1s: ldi r17,123 ;valor del contador lazo_1s: ldi r16,255 ;valor del retardo rcall retardo dec r17 breq sigue_1s ;compara si el contador llego a cero rjmp lazo_1s sigue_1s: ret retardo_300ms: ldi r17,40 lazo_300ms: ldi r16,255 rcall retardo dec r17 breq sigue_300ms rjmp lazo_300ms sigue_300ms: ret retardo_5s: ldi r18,5 lazo_5s: rcall retardo_1s dec r18 breq sigue_5s rjmp lazo_5s sigue_5s: ret retardo: sts OCR2A,r16 clr r16 sts TCNT2,r16 ;carga el valor al TCNT2 ;preescalado 256 ldi r16,(1<<CS22)|(1<<CS21) sts TCCR2B,r16 ;limpia la bandera de comparacion del OCR2A del TIMER2 ldi r16,(1<<OCF2A)

;valor del contador ;valor del retardo

;compara si el contador llego a cero

out TIFR2,r16 lazo_t: in r16,TIFR2 sbrs r16,OCF2A rjmp lazo_t clr r16 sts TCCR2B,r16 ret interrupcion: in pulsadores,pind reti tabla_1: .db " EPN ~" tabla_2: .db "CONTROLconMICROS~" tabla_3: .db "M. LOZA ~" tabla_4: .db "S. CHAGLLA ~" tabla_5: .db " DESCENDENTE ~" tabla_6: .db " ASCENDENTE ~" tabla_7: .db " DECREMENTA ~" tabla_8: .db " INCREMENTA ~"

;detiene contador

;lee los datos de los pulsadores

;TABLAS

You might also like