; Ejercicio 01: ; Contador Binario: Por el puerto B mostrar los códigos del 0 al 255 en binario. ; Los leds encendidos deberán de apagarse durante 200 ms antes de mostrar el siguiente ; incremento.
; Solución: (Se utiliza un microcontrolador pic16f877a, pero puede utilizar cualquier otro)
; OBSERVACIÓN: Si utliza otro microcontrolador, los bits de configuración podrian variar. ; Revisar datasheet. Por ejemplo para un pic16f84a, puede utilizar: ; __config _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_OFF ; OJO: _XT_OSC si utiliza un cristal de 4MHZ o menor. Si utiliza uno de mayor valor asegúrese ; que el microcontrolador lo soporte. En ese caso utilizar _HS_OSC. ; Para este programa,en la subrutina de retardo se consideró OSC=20MHZ
list p=16f877a ; Cambie aquí si utiliza otro uC include<p16f877a.inc> ; Cambie aquí si utiliza otro uC cblock 0x20 ; A partir de esta dirección es la memoria RAM del usuario (Banco-0) VDelay0 ; Si utiliza otro uC revise datasheet y verique a partir de que dirección es VDelay1 ; la memoria RAM del usuario. Por ejemplo para un pic16f84a, ésta comienza endc ;en la dirección 0x0C.
ORG 0x00 bcf STATUS,RP1 bsfSTATUS,RP0 ; Acceso banco 1 clrfTRISB; Todo puerto B config como salidas bcf STATUS,RP0 ; Acceso banco 0 Inicio: clrf PORTB Principal: call delay_200ms incf PORTB,f ; OBS: Si PORTB=255 --> PORTB+1 = 0 gotoPrincipal
Si desea armar el circuito en una protoboard, conectar un diodo led a cada uno de los pines RB<0:7> con su respectiva resistencia serie a tierra (330ohm)
; Ejercicio 02: ; Definir un número de 16 bits (Ejem: d'25503') y guardar la parte alta ; de éste en un registro "NumH" y la parte baja en "NumL"
; Solución: (Autor: JeysonJMG) ; Lo normal para almacenar un número de 16bits , seria dar los valores directamente ; a NumH y NumL, sin embargo para variar un poco y facilitar las cosas, he creado ; la siguiente macro que nos permite ingresar cualquier numero entre 0 y 65536 (decimal) ; y guardar la parte alta y baja en los registros que nosotros le indiquemos.
; En cuanto a optimización del código, no se ve afectado ya que se hace uso de las ; directivas if,else,endif que de acuerdo a determinadas situaciones verá que parte del ; codigo deberá ensamblar al momento de compilar. Es decir, como lo dije en un principio ; seria como dar los valores directamente a NumH y NumL. Nos facilita y resulta más ; cómodo la lectura del codigo y el ingreso del número. Jeizon1L ; ********** MACRO ********** CargarNumero16bitsmacroNumero,RegParteAlta,RegParteBaja local j,k; Variables macro locales ;Observación: Numero es constante (cualquier valor entre 0x00y 0xFFFF) if Numero>.255 j=Numero/.256 k=Numero-j*.256 movlw j movwfRegParteAlta movlw k movwfRegParteBaja else clrf RegParteAlta movlw Numero movwf RegParteBaja endif endm , ************************
; Programa:
__config_CP_OFF & _HS_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF RADIXDEC list p=16f877a ; uC utilizado include <p16f877a.inc> ; fichero pregrabado en mplab del uC utilizado CBLOCK 0x20 ; Memoria RAM del usuario (Banco-0) NumH NumL endc