Buscar en este blog

sábado, 8 de febrero de 2020

Kotlin - Abrir Activity desde un Fragment

Para los que están empezando en la programación para móviles Android en Kotlin, tal vez ya sepan como abrir un Activity desde otro, esto es fácil, pero al intentarlo desde un fragment se encontraron con que no pueden hacerlo de la misma forma, también es fácil, ahora les muestro.

Para abrir un Activity desde otro Activity sabemos que se hace con el siguiente código.

var intent = Intent(this, MyTargetActivity::class.java) startActivity(intent)

Donde...
  • MyTargetActivity es el Activity que queremos abrir.
  • this es la referencia a nuestro activity en el que nos encontramos.

Cuando lo intentamos desde un Fragment, esto cambia, y se debe a que nuestro Fragment hereda de la superclase Fragment y no de la superclase AppCompatActivity, debido a esto se tiene que hacer de la siguiente forma.

var intent = Intent(activity, MyTargetActivity::class.java)
activity!!.startActivity(intent)

Donde...
  • MyTargetActivity es el Activity que queremos abrir.
  • activity es una propiedad de la superclase Fragment que hace referencia al Activity donde se encuentra nuestro Fragment, es decir, hace referencia al Activity contenedor.
Como verán, no podemos llamar directamente al método startActivity, debido a que ese método no se encuentra en la superclase Fragment de la cual heredamos, para esto tenemos que invocarla desde el Activity contenedor del fragment y por esto es que lo hacemos llamando a la propiedad activity.
Esto tambien lo pueden hacer usando el getter correspondiente, quedando de la siguiente manera.

var intent = Intent(getActivity(), MyTargetActivity::class.java) getActivity()!!.startActivity(intent)

Y eso seria todo.
Espero les sea útil.

Leer post completo...

viernes, 23 de agosto de 2013

C Sharp NET - Agregando Evento Click a un Label

Tal vez algunos de ustedes hallan tenido la curiosidad de agregar un evento a un tipico Label.

Bien pues esto no es tan complicado, aqui les enseñare el codigo necesario para hacerlo. Y posteriormente les explicare cada funcion de los metodos y/o lineas en el codigo.

El codigo es el siguiente:

using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ControlesWeb
{

    public class CWLabel:Label, IPostBackEventHandler
    {
        public event EventHandler Click;

        public bool AutoPostBack
        {
            get
            {
                if (ViewState["autoPostBack"] != null) return (bool)ViewState["autoPostBack"];
                else return true;
            }
            set { ViewState.Add("autoPostBack", value); }
        }

        public CWLabel(){      }

        protected void OnClick(EventArgs e)
        {
            if (this.Click != null)
                this.Click(this, e);
        }

        protected override void Render(HtmlTextWriter writer)
        {
            if (this.AutoPostBack)
            {
                this.Attributes.Add("onclick", this.Page.ClientScript.GetPostBackEventReference(this, ""));
                this.Style.Add("cursor","pointer");
            }
            base.Render(writer);
        }

        #region Miembros de IPostBackEventHandler

        public void RaisePostBackEvent(string eventArgument)
        {
            this.OnClick(new EventArgs());
        }

        #endregion
    }
}



Comencemos a analizarlo...

Primero, tenemos la linea donde declaramos la clase, la cual es

public class CWLabel:Label, IPostBackEventHandler

Se preguntaran, porque despues del nombre de la clase tiene dos puntos y otros objetos o nombres de objetos.
La respuesta es sencilla. Porque los necesitamos para que nuestra clase tenga propiedades heredadas y no estemos partiendo de cero.
El primer nombre despues de los puntos es la clase de donde extenderemos tanto metodos como propiedades "Label", en este caso estamos creando un objeto o control a partir de otro, y como veran, estamos creando nuestro propio Label pero mejorado porque le agregaremos el evento Click.

El segundo nombre de objeto es una referencia a una interfaz, lo que nos indica que utlizaremos metodos establecidos de una interfaz. Este objeto es importante ya que nos brindara la posibilidad de detectar el evento evento.

Bien, la siguiente linea que nos interesa es esta:

public event EventHandler Click;

En esta linea se crea un evento publico y aunque no les diga cual es, ustedes ya lo saben.

La linea siguiente es una propiedad que nos ayudara a determinar si debe hacer postback o no, esta es opcional.

public bool AutoPostBack
{
get
{
if (ViewState["autoPostBack"] != null) return (bool)ViewState["autoPostBack"];
else return true;
}
set { ViewState.Add("autoPostBack", value); }
}

Con esta propiedad, almacenamos un valor boleano que nos indicara si el objeto hara o no un llamado sincrono al servidor (PostBack). El nombre con el que se almacenara este valor ustedes pueden decidirlo.

El siguiente segmento importante es

protected void OnClick(EventArgs e)
{
if (this.Click != null)
this.Click(this, e);
}

Este metodo es importante, ya que es el intermediario entre el evento capturado y el despliegue o llamada al metodo de la pagina al que sera asignado el evento Click del objeto en cuestion.

Supongamos que en nuestra pagina tenemos un Label (pero de los nuestros) de nombre "Prueba" que en el evento Click lo atiende el metodo "Prueba_Click", bueno pues para que este metodo pueda funcionar o activarse ante el evento Click, es necesario este metodo.

protected override void Render(HtmlTextWriter writer)
{
if (this.AutoPostBack)
{
this.Attributes.Add("onclick", this.Page.ClientScript.GetPostBackEventReference(this, "s"));
this.Style.Add("cursor","pointer");
}
base.Render(writer);
}

Sobreescribimos este metodo para poder agregar la propiedad (evento a nivel dom) que nos disparara el Click. Si se dan cuenta hay un metodo curioso dentro que proviene del script de la pagina que contiene a nuestro objeto ("GetPostBackEventReference"); bien, pues este metodo nos ayuda a llamar al famoso metodo javascript __doPostBack que genera nuestro querido .NET;. GetPostBackEventRefence no solo coloca la funcion __doPostBack en el evento a nivel dom que le indicamos, sino que tambien genera el script de esta misma funcion y la coloca en el cuerpo de la pagina; o sea que con esto no necesitaran probar si está o no esta funcion creada. Como se daran cuenta tambien, aqui hacemos uso de la propiedad AutoPostBack para asignar o no la funcion javascript al evento a nivel dom.

El siguiente metodo es

public void RaisePostBackEvent(string eventArgument)
{
this.OnClick(new EventArgs());
}

Este metodo es el que nos es proporcionado por la interfaz IPostBackEventHandler. Y dentro debe de mandar a llamar a nuestro metodo que respondera al evento Click.

Cuando se de un Click sobre este objeto, la ejecucion sera la siguiente:

Primero, se disparara el metodo proporcioando por IPostBackEventHandler.
Segundo, el metodo OnClick sera llamado desde el metodo de IPostBackEventHandler
Y por ultimo, se mandara a llamar al metodo de la pagina que atendera al evento Click de este objeto.



Ahora ya podemos llamarlo o crearlo desde nuestro codigo ASP. Para esto debemos hacer lo siguiente.

Agregar la referencia del espacio de nombres de la siguiente manera:

<%@ Register Namespace="ControlesWeb" Assembly="ControlesWeb" TagPrefix="CW" %>

Y una vez agregado, lo podemos llamar de la siguiente manera:

<CW:CWLabel runat="server" ID="lblPrueba" Text="Mi texto" OnClick="prueba_Click"> </CW:CWLabel>

Y en el codigo C# de la pagina pueden escribir una funcion como la siguiente.

protected void prueba_Click(object sender, EventArgs e)
{
ControlesWeb.CWLabel ct = sender as ControlesWeb.CWLabel;
this.ClientScript.RegisterClientScriptBlock(typeof(System.String),
"alerta", "<script>alert('"+ct.Text+"');</script>");
}

En esta funcion solo estoy mostrando en un alert de Javascript, el valor que tiene nuestro Label al cual se le hizo Click.

Y esto es todo. Espero les sea de utilidad y tambien que me halla sabido explicar.

Saludos desde Mexico!

Leer post completo...

miércoles, 15 de agosto de 2012

Delphi 7, Listar Carpetas y Archivos

¿Cuantas veces han buscado como conocer o extraer informacion de que subdirectorios y archivos estan en un directorio especifico? ¿Cuantas veces han encontrado informacion que les facilite el manejo de archivos de un directorio?

Buscando encontre el uso del objeto TSearchRec. Pero si eres nuevo y estas comenzando, se te hace dificil encontrar la forma de usar Objetos como este.

Casi nadie se preocupa por brindar herramientas que hagan la vida mas facil en programacion. Asi que desarrolle una unidad que utiliza el objeto TSearchRec, facilitando la obtencion de informacion de los directorios.

Bueno pues ahora les traigo unos archivos *.pas, para que los agreguen a sus proyectos en Delphi7 y puedan obtener los subdirectorios de un directorio y una lista de todos los archivos contenidos en ese directorio y los subdirectorios.

Los archivos tienen los nombres de:FDirectory, FStrUtiles y EntSal.
  • FDirectory Contiene las clases TDirectory,TDirecyories,TFile y TFiles.
    • TDirectory representa un directorio
      Propiedades: Name, FullName, Exists
      Funciones:
      • getDirectories(). Devuelve un objeto de tipo TDirectories.
      • getFiles(extensiones:String). Devuelve un objeto de tipo TFiles.
      • getAllFiles(extensiones:String). Devuelve un objeto de tipo TFiles.
    • TDirectories Representa un Array de directorios
    • TFile Representa un archivo
      Constructores: Create(), Create(path:String)
      Propiedades: Name, FullName, Size, isHidden, isSystemFile, isReadOnly, Exists
    • TFiles Representa una lista de Archivos
  • FStrUtiles Contiene funciones que ayudan al las clases del archivo FDirectory, y que tambien se pueden implementar o usar en el proyecto.
    • StrLeft. Funcion que devuelve la subcadena de la parte izquierda de una cadena, especificando la cantidad de caracteres que se quieren. Ej. StrLeft('Hola Mundo',4) nos devolvera 'Hola'
    • StrRight. Funcion que devuelve la subcadena de la parte derecha de una cadena, especificando la cantidad de caracteres que se quieren. Ej. StrRight('Hola Mundo',5) nos devolvera 'Mundo'
    • GetIndexPosFromStr. Devuelve un entero que representa la posicion de un caracter especifico dentro de una cadena, y se puede buscar de izquierda derecha o de derecha a izquierda, empezando en 'x' posicion. Ej. GetIndexPosFromStr('Hola Mundo','o',10,True) nos devolvera 10 y GetIndexPosFromStr('Hola Mundo','o',1,False) nos devolvera 2
    • SplitStr. Devuelve un objeto TStringList que contiene una lista de palabras que surgieron despues de delimitar una cadena por un caracter especifico. Ej. SplitStr('Hola Mundo',' ') no devuelve un TStringList que contiene 'Hola' y
    • ExistsIn
    • UC. (UpperCase) devuelve la cadena en Mayusculas.
    • LC. (LowerCase) devuelve la cadena en Minusculas.
  • EntSal Contiene funciones de I/O (Entrada y Salida) o de Archivo, que ayudan al la unidad FDirectory.
    • TamanoArchivo. Devuelve un entero que representa el tamaño de un archivo especifico en bytes.


Ejemplo de uso: 1.- Agregar El archivo al proyecto en Project/Add To Project.
2.- En uses agregar la unidad FDirectoy
3.- Explore el directorio con una rutina como la siguiente.

procedure TForm1.LeerDirectorio(path:String);
var
  carpeta:TDirectory;
  subcar:TDirectories;
  archivos:TFiles;
  i:Integer;
begin
  carpeta := TDirectory.Create;
  carpeta.setPath(path);
  subcar := carpeta.getDirectories;
  archivos := carpeta.getAllFiles('txt,xls,xlsx'); //Obtiene solo los archivos que de texto y de excel.
  for i:=0 to (Length(subcar)-1) do begin
    //Codigo para hacer algo con las rutas de carpetas.
  end;
  for i:=0 to (Length(archivos)-1 do begin
     //Codigo para hacer algo con las rutas d los archivos
     if not archivos[i].isHidden then //Valida que los archivos no esten ocultos
      memo1.lines.add(archivos[i].FullName);
      archivos[i].free; //Libera el objeto TFile.
  end;
end;

4.- Y la llamada de la rutina seria algo como (suponiendo que un objeto TEdit (edit1) contiene la ruta del directorio que queremos explorar):
self.LeerDirectorio(self.edit1.text);


Pueden encontrar estas Unidades aqui:
EntSal.pas
FDirectory.pas
FStrUtiles.pas


Leer post completo...

sábado, 2 de octubre de 2010

Procedimientos almacenados

Los Stored procedures o procedimientos almacenados son un conjunto de operaciones, instrucciones o como su nombre lo dice procedimientos que estan almacenados en una base de datos.

Un solo stored procedure puede contener desde una hasta varias instrucciones.


Estos se ejecutan directamente en el motor de la base de datos. La ventaja de estos, es cuando con unos parametros se ejecuta multiples operaciones, de las cuales el servidor se encargaria y a nosotros solo nos retorna los resultados finales. En estos casos en vez de nosotros hacer multiples cnosultas y transacciones al servidor generando trafico en la red, solo le mandamos los parametros necesarios y nos devuelve una respuesta final (ya sea unica o en forma de tabla).




La estructura para crear un SP (Stored procedure) es muy simple.


CREATE [PROCEDURE] [DBO].[nombre] <parametro_1 tipo_de_dato>[,<parametro_N tipo_de_dato>]
as
begin
<instrucciones>
end



Ejemplo: Suponiendo que tenemos las dos tablas "empleados" y "ventas" siguiente y queremos sacar diferentes datos como cantidades vendidas por en unidades y en pesos (por ahorita solo esas dos formas) en un solo sp, quedaria de la forma siguiente:


----table empleados----
|    cve_emp int,         |
|    nombre char(25),   |
|    app char(20),        |
|    apm char(20)        |
-----------------------

------table ventas-----
|    emp int,               |
|    fec char(8),          |
|    uds double,           |
|    monto money        |
-----------------------



-------------------------
-------PROCEDURE-------
-------------------------
create procedure dbo.consulta_empleados
@tipo char(1)
as
begin
if @tipo='1' begin
   select v.fec,e.nombre+' '+e.app+' '+e.apm, count(v.monto)
   from empleados e, ventas v
   where e.cve_emp=v.emp
   group by v.fec,e.nombre,e.app,e.apm
end else @tipo='2' begin if begin
   select v.fec,e.nombre+' '+e.app+' '+e.apm, sum(v.monto)
   from empleados e, ventas v
   where e.cve_emp=v.emp
   group by v.fec,e.nombre,e.app,e.apm
end else
   select 'OPCION NO VALIDA'
end
end




Y para ejecutarlo se puede hacer de las siguientes formas.

--Consulta las unidades que cada empleado (agrupado por fecha y empleado)
exec cnsulta_empleados "1"
--Consulta el total de valor vendido de cada empleado (agrupado por fecha y empleado)
exec cnsulta_empleados "2"

Bueno pues asi de facil es, y complicado como se lo pongan, ustedes pueden hacer que les haga unir con tablas hasta con las que era imposible con uniones en querys de SQL unicos (o que eran muy dificiles, tambien pueden crear variables de tabla que funcionan como una tabla temporal solo que estas se destruyen inmediatamente se termina de ejecutar el procedimiento almacenado, todo esto lo veremos mas adelante.

Saludos y espero les sea de utilidad esta informacion.

Leer post completo...

miércoles, 29 de septiembre de 2010

Creacion de usuarios desde CMD

Buenas tardes, no se si habran tenido la necesidad de crear un usuario o quitarle la contraseña a este usuario pero sin tener que abrir el panel de control.

Bien, pues es muy fácil desde el simbolo del sistema (CMD) como veremos a continuacion...


Precionamos la tecla de windows + r (con esto nos aparecera la ventana de ejecutar)
Escribimos "CMD" (no importa si son mayusculas o minusculas o combinadas)

Ahora, en esa pantallita negra, podemos ver todos los usuarios de nuestra equipo con tan solo escribir en ella lo siguiente "NET USER". Asi listara los usuarios.

Para ver el estado de un usuario podemos especificarlo, por ejemplo el Administrador, de la siguiente manera: "NET USER ADMINISTRADOR".

Para activar un usuario o desactivarlo solo escriba:
"NET USER ADMINISTRADOR /ACTIVE:YES" (Para activar) ó
"NET USER ADMINISTRADOR /ACTIVE:NO" (Para desactivar).
Estos comandos solo desactican al usuario, no lo eliminan.

Para crear un nuevo usuario solo ejecute de la siguiente manera:
"NET USER JUAN /ADD" (Crea el usuario JUAN sin contraseña)
"NET USER JUAN 123456 /ADD" (Crea el usuario JUAN con contraseña 123456)
"NET USER JUAN /DELETE" (Borra el usuario JUAN)

Ahora si queremos que nuestro usuario sea administrador, tenemos que agregarlo a ese grupo de la siguiente manera.
"NET LOCALGROUP ADMINISTRADORES JUAN /ADD" (Agrega el usuario "JUAN" al grupo de Administradores)

Y para quitarlo del grupo de administradores es:
"NET LOCALGROUP ADMINISTRADORES JUAN /DELETE" (Elimina al usuario JUAN del grupo de Administradores)

Y ahora el comando esperado. Como establecer, cambiar o quitar una contraseña a un usuario. Tomando el ejemplo del usuario JUAN ,solo necesitan ejecutar este comando:
"NET USER JUAN * "
Y despues, les pedira la nueva contraseña, si quieren colocarle una, solo escribanla, si quieren borrar la contraseña solo tecleen un enter. Despues les pedira confirmar la contraseña, de igualmanera, vuelvan a escribirla y den enter o simplenteme den enter si estan eliminando la contraseña.

Parece que esto es todo por hoy.

Espero sus comentarios. Saludos.

Leer post completo...

viernes, 24 de septiembre de 2010

Tareas en Windows Server 2008 (BAT)



No sé si les ha pasado que colocan una tarea programada, la cual ejecuta un archivo BAT, que este asu vez, genera archivos, ya sea un log, un zip u otro, y aparentemente el bat se ejecuta sin problemas pero cuando consultamos si el archivo que genera el bat existe... sorpresa!!!, no existe, jamás fue generado.

Eso es lo que pasa en el S.O. Windows server 2008 R2, sin embargo descubri la forma de programarlos y que trabajen como debe ser.

Les mostraré como deben colocar una tarea programada en el sistema operativo Microsoft Windows 2008 server R2 que ejecuta un queridisimo y muchas veces necesario archivo de ejecucion por lotes (BAT).


Teniendo el archivo BAT listo. (En este ejemplo el archivo bat despliega un "dir" y el resultado almacena en un arhivo de texto dentro de la misma ruta donde esta el bat)

Paso 1.- Abrir el programador de tareas de Windows.

Paso 2.- Crear nueva tarea.




Paso 3.- En la pestaña "General" colocar el nombre y descripcion de la tarea programada y en la parte inferior escoger la opcion "Ejecutar tanto si un usuario inicio sesion como si no" y palomear "Ejecutar con los mas altos privilegios" y por ultimo en "Configurar para" escoger "Windows server 2003, Windows XP o Windows 2000", este ultimo es muy importante para que funcione correctamente nuestro BAT.





Paso 4.- En la pestaña "Desencadenadores" escoger el momento en que uno busca se ejecute la tarea, ya sea una hora especifica en un dia especifico, un fecha diaria, por semana, por mes, al iniciar windows, etc.







Paso 5.- En la pestaña "Acciones" elegir "nueva.." y en esa nueva ventana, seleccionar el BAT que queremos que se ejecute y en donde dice "Iniciar en (opcional)" se coloca la ruta donde esta nuestro BAT , es muy importante que se ponga la ruta, porque aunque dice (opcional) no lo es, ya que si no la colocamos, el bat jamas se ejecuta correctamente.







Paso 6.- En la pestaña "Condiciones" deseleccionaremos todo.





Paso 7.- En la pestaña "Configuración" tambien deseleccionaremos todo, este y el anterior paso son opcionales, queda a disposicion del usuario configurar estas dos pestañas.





Paso 8.- Aceptar. Aqui le pedira el usuario y contraseña que usara la tarea para ejecutarse. Debe ser un usuario con privilegios para ejecutar un archivo de ejecucion por lotes.





Y esos son los pasos a seguir.

Ahora podemos ver que ya nos aparece esta tarea.





Si nos vamos a la ruta donde esta el bat, podemos ver que es el unico archivo que existe.

Procedemos a ejecutar la tarea y nos volvemos a fijar en la ruta del archivo bat.

Y efectivamente, nuestro archivo bat genero un archivo txt, que si lo revisamos contiene el listado de este mismo directorio

Nuestra tarea programada ya fue probada y si funciona.

Saludos.

Espero sus comentarios. Cualquier duda o aclaracion seran contestadas.

Leer post completo...

martes, 21 de julio de 2009

Whatever My Love by Austin Butler


Ahora les colo la letra de un soundtrack que presentaron en la serie televisiva icarly y que me gusto (version en ingles) la cancion la pueden escuchar en este link de youtube y la letra esta acontinucación. Disfrutenla:

Whatever My Love by Austin Butler:

You're so beautiful
I need the world to see
You're my mirical
Just take the time that you need
to breath
And nevermind the things I've done
You make me feel like I'm the rising sun
You've fade me in my line
And show me its alright and
I know that you're the one
And you'll always be the one
And you'll always be
You'll always be the one
And you'll always be
And you'll always be the one

Leer post completo...

jueves, 9 de julio de 2009

Descargas


Aqui se colocaran los diagramas y algunos codigos que se explican en los post, con sus respectivos enlaces. Si alguno se encuentra roto, favor de decirmelo para checar el enlace, Gracias!. Espero les sea de uilidad.

NOTA: Los codigos Assembler RISC (Ensamblador RISC) esta compilados en el software MPLab. El cual lo pueden descargar de la pagina www.microchip.com, El simulador que ocupo es el famosisimo Proteus y lo pueden descargar de este blog: http://controlpublix.blogspot.com. Estos enlaces son externos a este blog.

Operaciones Lógicas

Ejemplo: AND
Ejemplo: COMF




Leer post completo...

domingo, 28 de junio de 2009

Operaciones Lógicas


Assembler permite las siguientes instrucciones lógicas:
  • AND
  • OR
  • XOR
  • NOT, Negación o Complemento

Sus respectivas instrucciones en lenguaje ensamblador son:

  • ANDWF, para el and
  • IORWF, para el or
  • XORWF, Para el xor
  • COMF, Para el Not


Estas istrucciones reciben uno o dos argumentos (origen, destino), de los cuales solo uno es obligatorio de especificar (origen). Si no se le otorga un destino, lo guarda por defecto en el registro origen.

Ejemplo: hacemos un AND de dos variables (var1 y var2) y lo guardamos en otra variable (var3)


movfw var1 ;Carga en W el contenido de var1
andwf var2,w ;Hace un AND entre el contenido de W y var2
movwf var3 ;el resultado lo guarda en var3


Utilizando el ejemplo Anterior, suponiendo que var1 tiene el valor binario '00001111' y var2 tiene el valor binario '11001110', en resultado seria '00001110'.
El resultado puede verse en este Diagrama de Proteus.



Ejemplo 2: Hacemos un AND entre dos variables (var1 y var2) y queremos que el resultado se quede en una de las variables anteriores, para tener menos variables y menos consumo de recurso. En este ejemplo se puede guardar el resultado tanto en la primera variable como en la segunda.
A continuacion se guardara en la primera variable.


movfw var2 ;Carga en W el contenido de var2
andwf var1 ;AND (w y var1) y guarda el resultado en var1

Ahora se guardara en la segunda variable.


movfw var1 ;Carga en W el contenido de var1
andwf var2 ;AND (w y var2) y guarda el resultado en var2


Ejemplo 3: Hacemos un AND entre 1 variable (var1) y una literal (valor dado x el usuario) y guardamos el resultado en la variable (var1). En este caso se hace uso de una sola variable (var1).


movlw b'01100111' ;Carga en W la literal
andwf var1 ;Hace un AND y guarda el resultado en var1


LAS TRES PRIMERAS INSTRUCCIONES (ANDWF, IORWF, XORWF) FUNCIONAN DE LA MISMA FORMA (COMO EXPLIQUE ARRIBA). ACONTINUACION SE EXPLICA LA INSTRUCCION COMF

La instrucción COMF lo que hace es invertir los bits. Esto es colocar 1 en donde habia 0 y viceversa. Esto no quiere decir que sea una resta, no lo vallan a confundir. Por ejemplo. Si varl tiene el valor decimal 30 (en binario '00011110'), su complemento sera en decimal 225 (en binario '11100001'). La explicacion es la siguiente, su complemento es basado en la cantidad de bits que tiene el registro, el cual es de 8 bits (255 en decimal), su suman bien la cantidad 30 mas la cantidad 225 le da de resultado 255, asi como si hacen un or entre las cantidades binarias '00011110' y '11100001' les da re resultado la cantidad binaria '11111111' lo que es igual a 255 en decimal.

Ejemplo: Sacar el complemento de una variable (var1) y guardalo en una segunda variable (var2)


comf var1,w ;Saca el complemento de var1
movwf var2 ;El resultado es guardado en var2


Aqui dos diagramas que muestran el funcionamiento de la instruccion COMF, la primera muestra solo la variable y la segunda muestra el complemento de la variable.


Muestra el contenido de var1


Muestra el complemento de var1.

Ver Zona de Descargas



Leer post completo...

viernes, 26 de junio de 2009

Instrucciones BTFSS y BTFSC de Ensamblador RISC


La instrucción BTFSS y la instrucción BTFSC son cada una como una simple instrucción de comparación, como lo es un IF en otros lenguajes de programación, a excepción de que los if pueden contener varias instrucciones como en el siguite código de Java:


if (variable=='condición')
{
   instrucción1;
   instrucción2;
   instrucción3;
}
else
{
   instrucción4;
   instrucción5;
   instrucción6;
}


  • La instrucción BTFSS de Assembler RISC verifica que el bit del puerto o variable especificado se encuentre en 1 lógico (alrededor de los 5v), si la respuesta es cierta entonces se salta la siguiente instrucción, mientras que si no lo es, realiza la sig instrucción. Como se muestra en el ejemplo:



 BTFSS PORTA,0 ;"Bit 0" del puerto A esta en 1 lógico (5volts)?
   goto noestaen1 ;No, (esta en 0volts).
   goto siestaen1 ;Si, (esta en 5volts).


  • Por otra parte la instrucción BTFSC de Assembler RISC verifica que el bit tenga un 0 lógico, y de igualmanera, si es cierto, se salta la instrucción siguiente, y si es falsa entonces hace la siguiente.



 BTFSC PORTA,0 ;"Bit 0" del puerto A esta en 0 lógico (0volts)?
   goto noestaen0 ;No, (esta en 5volts).
   goto siestaen0 ;Si, (esta en 0volts).


En resumen uno se encarga de verificar si hay 1 lógico (BTFSS) y el otro verifica si hay un 0 lógico (BTFSC).

NOTA: goto es una instrucción que hace un salto a la etiqueta especificada.

Leer post completo...