El grup 2 va fer un programa amb la següent presentació a la pantalla:

Addicionalment, els LED indiquen si la temperatura o la humitat han sortit fora d'uns màxims i mínims que han establert.
El programa d'aquest grup és el següent:
#include <p16F690.inc> __config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
cblock 0x20 Compta ; Comptador d'iteracions Temp ; Variable temporal Valor:2 ; Valor d'entrada (16 bits) Resul:5 ; Valor de sortida Port ; Valor a escriure al port A Temps ; Variable per a guardar-hi el temps Bits ; Compta els bits que es van rebent Control ; Bits de control (port B) Caracter ; Caràcter o codi a enviar (port C) Retard1 ; Variables per als cicles de retard Retard2 ComparaH ComparaT Leds Comparak Humit:2 ; Valor de la humitat relativa (en %) multiplicat per 10 Temper:2 ; Valor de la temperatura (en °C) multiplicat per 10 Check ; Suma de comprovació de la lectura del sensor endc
org 0 Inici bsf STATUS,RP0 ; Tria el banc 1 movlw 0xFF ; Posa l'acumulador a FFh (tot uns) movwf TRISA ; Posa tots els bits del port A com a entrada bcf TRISA,2 ; De moment, RA2 és sortida clrf TRISB ; Tot el port B és de sortida clrf TRISC ; Tot el port C és de sortida movlw b'10000000' ; Configuració de Timer0 ; Com a temporitzador basat en rellotge ; 000 - Factor d'escala de 2 ; TMR0 s'incrementarà cada 2 us ; I resistències de pull-up desactivades (valor per defecte) movwf OPTION_REG ; Ho guarda al registre de configuració del Timer0 bcf STATUS,RP0 bsf STATUS,RP1 ; Tria el banc 2 movlw b'11111011' movwf ANSEL ; Posa AN2 (RA2) com entrada binària bcf STATUS,RP0 bcf STATUS,RP1 ; Tria el banc 0 movlw b'00000100' ; PORTA,2 és on hi ha el sensor movwf Port ; Ho guardem a la variable Port movwf PORTA ; I ho copiem al port A call IniPant Bucle call ConfPant ; Configuració de la pantalla call Llegir ; Llegeix els valors del sensor andlw 0xFF ; Anem a veure si W és zero btfss STATUS,Z ; Si és zero, and donarà zero goto Bucle ; No és zero, tornem a llegir ; És zero, lectura correcta movlw 0x07 ; Adreça DDRAM (Filera 1 - Posició 1) iorlw b'10000000' ; Posa el bit de DDRAM a 1 movwf Caracter ; Ho guarda a la variable call EnviaC ; Ho envia movf Temper+1,w ; Llegeix el byte més significatiu de la temperatura movwf Valor+1 ; Ho prepara per convertir-ho a BCD movf Temper,w ; Llegeix el byte menys significatiu de la temperatura movwf Valor ; Ho prepara per convertir-ho a BCD call BCD5 ; Ho converteix en BCD en 3 bytes call SeparaH ; Ho separem en 5 bytes call EscPant5 ; Ho enviem a la pantalla movf ComparaT,w movwf Comparak movlw 0x47 ; Adreça DDRAM (Filera 2 - Posició 1) iorlw b'10000000' ; Posa el bit de DDRAM a 1 movwf Caracter ; Ho guarda a la variable call EnviaC ; Ho envia movf Humit+1,w ; Llegeix el byte més significatiu de la humitat movwf Valor+1 ; Ho prepara per convertir-ho a BCD movf Humit,w ; Llegeix el byte menys significatiu de la humitat movwf Valor ; Ho prepara per convertir-ho a BCD call BCD5 ; Ho converteix en BCD en 3 bytes call SeparaH ; Ho separem en 5 bytes call EscPant5 ; Ho enviem a la pantalla clrf Leds ; Els Leds movf Comparak,w ; guardem el valor de Compara a W (acumulador) sublw .6 ; li resto dos al acumulador btfss STATUS,C ; comparo. Si es positiu fa la funcio seguent, sino salta la funció següent ; (shift set (set=1=)).Aquesta funció només salta la pròxima línia de text. call Ledstempmax ; pos eso call Retard ; Crida a la funció Retard, el paràmetre està a W movf Comparak,w ; guardem el valor de Compara a W (acumulador) sublw .6 ; li resto dos al acumulador btfsc STATUS,C ; comparo. Si es NO positiu fa la funcio seguent, sino salta la funció següent ; (shift set (set=1=)).Aquesta funció només salta la pròxima línia de text. call Ledstempmin ; pos eso call Retard ; Crida a la funció Retard, el paràmetre està a W movf ComparaH,w ; guardem el valor de Compara a W (acumulador) sublw .7 ; li resto dos al acumulador btfss STATUS,C ; comparo. Si es positiu fa la funcio seguent, sino salta la funció següent (shift set (set=1=)) call Ledshummax ; pos eso call Retard ; Crida a la funció Retard, el paràmetre està a W movf ComparaH,w ; guardem el valor de Compara a W (acumulador) sublw .5 ; li resto dos al acumulador btfsc STATUS,C ; comparo. Si es positiu fa la funcio seguent, sino salta la funció següent (shift set (set=1=)) call Ledshummin ; pos eso call Retard ; Crida a la funció Retard, el paràmetre està a W movlw 0x00 ; Adreça DDRAM (Filera 1 - Posició 1) iorlw b'10000000' ; Posa el bit de DDRAM a 1 movwf Caracter ; Ho guarda a la variable call EnviaC ; Ho envia movlw 'T' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'E' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'M' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'P' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw ':' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 0x40 ; Adreça DDRAM (2 - 1) iorlw b'10000000' ; Posa el bit de DDRAM a 1 movwf Caracter ; Ho guarda a la variable call EnviaC ; Ho envia movlw 'H' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'R' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw ':' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 0x0E ; Adreça DDRAM (Filera 1 - Posició 1) iorlw b'10000000' ; Posa el bit de DDRAM a 1 movwf Caracter ; Ho guarda a la variable call EnviaC ; Ho envia movlw b'11011111' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 'C' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movlw 0x4E ; Adreça DDRAM (Filera 1 - Posició 1) iorlw b'10000000' ; Posa el bit de DDRAM a 1 movwf Caracter ; Ho guarda a la variable call EnviaC ; Ho envia movlw b'00100101' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard call Retard goto Bucle
Llegir ; Llegeix els valors al sensor ; Primer activem el funcionament del sensor bsf STATUS,RP0 ; Tria el banc 1 bcf TRISA,2 ; Posem el pin com a sortida bcf STATUS,RP0 ; Tria el banc 0 clrf Humit+1 ; Posa a zero les variables on ha d'anar la lectura clrf Humit clrf Temper+1 ; Els primers bits de Humit+1 seran 0; així clrf Temper ; si el bit de més a la dreta de Check el posem a 1 movlw 0x01 ; podrem veure on ha quedat aquest 1 movwf Check ; en cas que hi hagi una errada de lectura bcf Port,2 ; Posa la sortida a 0 movf Port,w ; Ho copia a W movwf PORTA ; I ho envia al port movlw .2 ; Retard d'1,54 ms call Retard ; Espera el temps bsf Port,2 ; Posa la sortida a 1 movf Port,w ; Ho copia a W movwf PORTA ; I ho envia al port movlw .5 ; El retard serà de 3*5 = 15 us call Retus ; Un cop activat, esperem la resposta bsf STATUS,RP0 ; Tria el banc 1 bsf TRISA,2 ; Posem el pin com a entrada bcf STATUS,RP0 ; Tria el banc 0 ; Esperem a rebre el pols d'inici ; Primer un L d'uns 80 us ; Per començar, s'ha de desactivar l'entrada ; i s'ha de reactivar al cap d'entre 70 i 90 us Esp0 btfsc PORTA,2 ; S'ha desactivat l'entrada? goto Esp0 ; No, doncs esperem clrf TMR0 ; Comencem a comptar el temps Esp1I ; Esperem que s'activi l'entrada btfsc PORTA,2 ; S'ha activat l'entrada? goto ZeroIni ; Sí, doncs el zero inicial ja està movf TMR0,w ; No, agafa el valor actual del temps movwf Temps ; i el guarda movlw .45 ; Mirem que no passem de 90 us subwf Temps,w ; W = Temps - W btfss STATUS,C ; C = 1 si Temps >= 45 goto Esp1I ; És més petit, seguim esperant retlw .1 ; És més gran: Error 1 - Zero inicial massa llarg ZeroIni ; El zero inicial ja està ; Comprovem la durada movf TMR0,w ; Agafa el valor actual del temps movwf Temps ; i el guarda clrf TMR0 ; Comencem a comptar el temps per al següent movlw .35 ; Mirem que no sigui menor que 70 us subwf Temps,w ; W = Temps - W btfss STATUS,C ; C = 1 si Temps >= 35 retlw .2 ; És més petit: Error 2 - Zero inicial massa curt ; Ja tenim el zero inicial ; Ara l'entrada està a u i esperem que es posi a zero Esp0I ; Esperem a que es desactivi l'entrada btfss PORTA,2 ; S'ha desactivat l'entrada? goto UIni ; Sí, doncs l'u inicial ja està movf TMR0,w ; No, agafa el valor actual del temps movwf Temps ; i el guarda movlw .45 ; Mirem que no passem de 90 us subwf Temps,w ; W = Temps - W btfss STATUS,C ; C = 1 si Temps >= 45 goto Esp0I ; És més petit, seguim esperant retlw .3 ; És més gran: Error 3 - U inicial massa llarg UIni ; L'u inicial ja està movf TMR0,w ; Agafa el valor actual del temps movwf Temps ; i el guarda clrf TMR0 ; Comencem a comptar el temps per al següent movlw .35 ; Mirem que no sigui menor que 70 us subwf Temps,w ; W = Temps - W btfss STATUS,C ; C = 1 si Temps >= 35 retlw .4 ; És més petit: Error 4 - U inicial massa curt ; Ja tenim l'u inicial ; Ara hem de rebre els bits movlw .40 ; Hem de rebre 40 bits movwf Bits ; Aquesta variable els comptarà BucBits ; Esperem a rebre un bit ; Primer un L d'uns 80 us ; Ara l'entrada està a zero ; S'ha d'activar al cap d'entre 10 i 90 us clrf TMR0 ; Comencem a comptar el temps Esp1B ; Esperem que s'activi l'entrada btfsc PORTA,2 ; S'ha activat l'entrada? goto ZeroB ; Sí, doncs el valor 0 del bit ja està movf TMR0,w ; No, agafa el valor actual del temps movwf Temps ; i el guarda movlw .45 ; Mirem que no passem de 90 us subwf Temps,w ; W = Temps - W btfss STATUS,C ; C = 1 si Temps >= 45 goto Esp1B ; És més petit, seguim esperant retlw .5 ; És més gran: Error 5 - Valor 0 del bit massa llarg ZeroB ; El valor 0 del bit ja està movf TMR0,w ; Agafa el valor actual del temps movwf Temps ; i el guarda clrf TMR0 ; Comencem a comptar el temps per al següent movlw .5 ; Mirem que no sigui menor que 10 us subwf Temps,w ; W = Temps - W btfss STATUS,C ; C = 1 si Temps >= 5 retlw .6 ; És més petit: Error 6 - Valor 0 del bit massa curt ; Ja tenim el valor 0 del bit. Ara esperem un 1 Esp0B ; Esperem a que es desactivi l'entrada btfss PORTA,2 ; S'ha desactivat l'entrada? goto UB ; Sí, doncs el valor 1 del bit ja està movf TMR0,w ; No, agafa el valor actual del temps movwf Temps ; i el guarda movlw .40 ; Mirem que no passem de 80 us subwf Temps,w ; W = Temps - W btfss STATUS,C ; C = 1 si Temps >= 40 goto Esp0B ; És més petit, seguim esperant retlw .7 ; És més gran: Error 7 - Valor 1 del bit massa llarg UB ; El valor 1 del bit ja està movf TMR0,w ; Agafa el valor actual del temps movwf Temps ; i el guarda clrf TMR0 ; Comencem a comptar el temps per al següent ; Ja hem comprovat que no passi de 80 us ; Si és més petit que 12 us és massa curt movlw .6 ; Mirem si és menor que 12 us subwf Temps,w ; W = Temps - W btfss STATUS,C ; C = 1 si Temps >= 8 retlw .8 ; És més petit: Error 8 - Valor 1 del bit massa curt ; Ja hem comprovat que no sigui massa curt ; Si és més petit que 38 us és un pols curt, o sigui un 0 movlw .19 ; Mirem si és menor que 38 us subwf Temps,w ; W = Temps - W btfss STATUS,C ; C = 1 si Temps >= 19 goto EsUn0 ; Si està entre 16 i 38 us és un 0 ; No era un pols curt ; Si és més gran que 60 us és un pols llarg, o sigui un 1 movlw .30 ; Mirem si és menor que 60 us subwf Temps,w ; W = Temps - W btfsc STATUS,C ; C = 1 si Temps >= 30 goto EsUn1 ; Si està entre 60 i 80 us és un 1 retlw .9 ; No és ni llarg ni curt: Error 9 - Valor 1 del bit incorrecte EsUn0 bcf STATUS,C ; Si és un 0 entrem un 0 goto EntraBit EsUn1 bsf STATUS,C ; Si és un 1 entrem un 1 EntraBit ; Guardem el bit rebut rlf Check,f ; Entrem per Check i anem rodant fins a Humit+1 rlf Temper,f rlf Temper+1,f rlf Humit,f rlf Humit+1,f decfsz Bits,f ; Un altre bit rebut goto BucBits ; Si no hem acabat, esperem el següent retlw .0 ; Lectura correcta EscPant3 ; Anem a enviar la lectura de 3 caràcters movlw .3 ; Cal fer-ho 3 cops movwf Compta ; Ho posem al comptador movlw Resul+2 ; Adreça de la darrera xifra goto EscPant EscPant5 ; Anem a enviar la lectura de 5 caràcters movlw .4 ; Cal fer-ho 5 cops movwf Compta ; Ho posem al comptador movlw Resul+4 ; Adreça de la darrera xifra EscPant movwf FSR ; Adreçament indirecte BuclePant movf INDF,w ; Llegeix el caràcter movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia decf FSR,f ; Decrementa FSR decfsz Compta,f ; Decrementa el comptador goto BuclePant ; Si no és zero, repetim movlw ',' ; Lletra movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia movf INDF,w ; Llegeix el caràcter movwf Caracter ; Ho guarda a la variable call EnviaL ; Ho envia return ; Fi de l'enviament a la pantalla IniPant ; Inicialització del mode de funcionament de la pantalla movlw 0 ; Comença un cicle de durada fixa (0,2 s) call Retard ; Crida a la funció Retard, el paràmetre està a W call Retard ; Crida a la funció Retard, el paràmetre està a W call Retard ; Crida a la funció Retard, el paràmetre està a W movlw b'00100000' ; Function set - Configuració inicial 0010 al nibble de l'esquerra movwf Caracter ; Ho guarda a la variable call EnviaI ; Envia els 4 bits superiors ; Ara enviem la configuració 2 línea, 5x8 píxels 0010 1000 call EnviaI ; Enviem la part esquerra (ja ho teníem a Caracter) movlw b'10000000' ; I ara la part dreta (però posada a l'esquerra) movwf Caracter ; Ho guarda a la variable call EnviaI ; Envia els 4 bits superiors return ; Fi de la inicialització del mode de funcionament ; ConfPant ; Configuració de la pantalla movlw b'00001100' ; Display ON/OFF control - Activa la pantalla amb cursor intermitent movwf Caracter ; Ho guarda a la variable call EnviaC ; Ho envia return ; Fi de la configuració de la pantalla ; EnviaC ; Enviem caràcters de control bcf Control,7 ; Desactiva E bcf Control,5 ; Desactiva RS goto Envia EnviaL ; Enviem caràcters a visualitzar bcf Control,7 ; Desactiva E bsf Control,5 ; Activa RS Envia call EnviaN ; Envia els 4 bits més alts swapf Caracter,f ; Permuta els nibbles call EnviaN ; Envia els 4 bits més alts swapf Caracter,f ; Torna a deixar els nibbles com estaven return ; Tornem al lloc des d'on hem vingut EnviaI ; Enviem nibbles de caràcters de control bcf Control,7 ; Desactiva E bcf Control,5 ; Desactiva RS EnviaN ; Enviem nibbles decfsz Retard1,f ; Funció de retard de 0,8 ms goto EnviaN movf Control,w ; Copia Control a l'acumulador movwf PORTB ; I ho posa al PORTB nop ; Espera 1 us nop ; Espera 1 us nop ; Espera 1 us movf Caracter,w ; Llegeix el caràcter andlw 0xF0 ; Agafa els 4 bits més alt iorwf Leds,w movwf PORTC ; Envia el byte bsf Control,7 ; Activa E movf Control,w ; Copia Control a l'acumulador movwf PORTB ; I ho posa al PORTB nop ; Espera 1 us nop ; Espera 1 us nop ; Espera 1 us nop ; Espera 1 us nop ; Espera 1 us bcf Control,7 ; Desactiva E movf Control,w ; Copia Control a l'acumulador movwf PORTB ; I ho posa al PORTB return ; Tornem al lloc des d'on hem vingut Retus ; Funció de retard; W conté el nombre de cicles de 3 us que cal fer movwf Retard1 Bucleus decfsz Retard1,f goto Bucleus return Retard ; Funció Retard, W conté el nombre de cicles de 771 us que cal fer movwf Retard2 ; Ho copia a la variable Retard2 BucRet decfsz Retard1,f ; Decrementa la variable 1 ; si dona zero, no es fa la instrucció següent goto BucRet ; Salta, excepte si el resultat ha estat zero decfsz Retard2,f ; Decrementa la variable 2 goto BucRet ; Salta, excepte si el resultat ha estat zero return ; Tornem al lloc des d'on hem vingut BCD5 ; Converteix a BCD bcf STATUS,C ; Posa a zero C per entrar zeros a les rotacions movlw .16 ; Nombre d'iteracions movwf Compta ; Comptador d'iteracions clrf Resul+2 ; Desenes de miler clrf Resul+1 ; Unitats de miler i centenes clrf Resul ; Desenes i unitats BucleBCD rlf Valor,f ; Girem bits a l'esquerra a valor rlf Valor+1,f ; Cap a valor+1 rlf Resul,f ; I cap als resultats rlf Resul+1,f rlf Resul+2,f decfsz Compta,f ; Decrementa Compta goto ajust ; Si no és zero, ajustem el resultat retlw 0 ; Si és zero ja estem; tornem un 0 a W ajust ; funció d'ajust dels resultats movlw Resul ; Agafem l'adreça del byte de menys pes movwf FSR ; La posa a l'adreçament indirecte call ajustBCD ; Ajusta el byte de més a la dreta movlw Resul+1 ; Agafem l'adreça del byte del mig movwf FSR ; La posa a l'adreçament indirecte call ajustBCD ; Ajusta el byte del mig movlw Resul+2 ; Agafem l'adreça del byte de més pes movwf FSR ; La posa a l'adreçament indirecte call ajustBCD ; Ajusta el byte de més a l'esquerra goto BucleBCD ; Torna a repetir el bucle (fins a 16 cops) ajustBCD ; funció d'ajust d'un byte, primer el nibble de la dreta, després l'altre movlw 0x03 ; Agafa el valor 03h addwf INDF,w ; El suma al byte que ajustem movwf Temp ; Ho guarda a Temp btfsc Temp,3 ; És més gran que 07h (s'ha activat el bit 3)? movwf INDF ; Si és cert, sobreposa el resultat movlw 0x30 ; Agafa el valor 30h addwf INDF,w ; El suma al byte que ajustem movwf Temp ; Ho guarda a Temp btfsc Temp,7 ; És més gran que 70h (s'ha activat el bit 7)? movwf INDF ; Si és cert, sobreposa el resultat retlw 0 ; Retorna amb un zero a W SeparaH ; Separa els digits i els converteix a ASCII movf Resul+2,w ; Agafa les desenes de miler movwf Resul+4 ; Les posa al seu lloc swapf Resul+1,w ; Llegeix les unitats de miler i les centenes ; i les guarda, permutades, a w andlw 0x0F ; Es queda amb les unitats de miler movwf Resul+3 ; Les posa al seu lloc movf Resul+1,w ; Llegeix les unitats de miler i les centenes i les guarda a w andlw 0x0F ; Es queda amb les centenes movwf Resul+2 ; Les posa al seu lloc movwf ComparaH swapf Resul,w ; Llegeix les desenes i les unitats i les guarda, permutades, a w andlw 0x0F ; Es queda amb les desenes movwf Resul+1 ; Les posa al seu lloc movwf ComparaT movf Resul,w ; Llegeix les desenes i les unitats i les guarda a w andlw 0x0F ; Es queda amb les unitats movwf Resul ; Les posa al seu lloc movlw .5 ; Cal fer-ho 5 cops movwf Compta ; Ho posem al comptador movlw Resul+4 ; Adreça de la darrera xifra movwf FSR ; Adreçament indirecte movlw '0' ; Carrega el codi ASCII del número 0 ; Sumant-li la xifra tindrem el codi ASCII Bucle1 addwf INDF,f ; Ho afegeix al dígit decf FSR,f ; Decrementa FSR decfsz Compta,f ; Decrementa el comptador goto Bucle1 ; Si no és zero, repetim movlw .4 ; Cal fer-ho 4 cops movwf Compta ; Ho posem al comptador movlw Resul+4 ; Adreça de la darrera xifra movwf FSR ; Adreçament indirecte Bucle2 movf INDF,w ; Llegeix el dígit xorlw '0' ; Compara amb 0 btfss STATUS,Z ; Si Z està activat eren iguals goto Final ; Si no eren iguals, ja estem movlw ' ' ; Carrega un espai en blanc movwf INDF ; Substitueix el 0 per l'espai decf FSR,f ; Decrementa FSR decfsz Compta,f ; Decrementa el comptador goto Bucle2 ; Si no és zero, repetim Ledstempmax bsf Leds,0 ; Encenc el LED n° 0 (el 1 diguemne) return Ledshummax bsf Leds,2 ; Encenc el LED n° 2 (el 3 diguemne) return Ledstempmin bsf Leds,1 ; Encenc el LED n° 1 (el 2 diguemne) return Ledshummin bsf Leds,3 ; Encenc el LED n° 3 (el 4 diguemne) return Final retlw 0 ; Retorna amb un 0 a W end

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.