En aquest exemple farem servir un sensor de temperatura i mostrarem la temperatura llegida a una pantalla sèrie.
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8 #define _XTAL_FREQ 4000000 // La freqüència del rellotge és 4 MHz
// Definició de les funcions que farem servir void EnviaL(char Caracter); // Envia un caràcter void Cursor(char Filera, char Columna); // Posiciona el cursor (filera 1 a 2 i columna 1 a 32, segons pantalla)
unsigned int Lectura; // Valor llegit char Digits[4]; // Variable amb el número dígit a dígit // Digits[0] és el decimal char Negatiu; // Guarda si el valor és negatiu o positiu
void main (void) {
ANSEL = 0b00000101; // Configura AN0 i AN2 com entrada analògica
ANSELH = 0; // Desactiva les altres entrades analògiques
TRISA = 0xFF; // Tot el port A és d'entrada
TRISC = 0; // Tot el port C és de sortida
TRISB = 0; // Tot el port B és de sortida
__delay_ms(2000); // Esperem que arrenqui la pantalla
TXSTAbits.BRGH = 1; // Configuració de velocitat
BAUDCTLbits.BRG16 = 0; // Paràmetre de velocitat de 8 bits
SPBRG = 25; // Velocitat de 9600 baud
TXSTAbits.SYNC = 0; // Comunicació asíncrona
TXSTAbits.TX9 = 0; // Comunicació de 8 bits
RCSTAbits.SPEN = 1; // Activa comunicació sèrie
TXSTAbits.TXEN = 1; // Activa comunicació
ADCON1 = 0b00010000; // Posa el conversor a 1/8 de la freqüència
ADCON0 = 0b10001001; // Activa el conversor A/D connectat a AN2
// amb el resultat justificat per la dreta
while (1) { // Inici del bucle de programa
ADCON0bits.GO = 1; // Posa en marxa el conversor
while (ADCON0bits.GO == 1) // Mentre no acabi
; // ens esperem
Cursor(1, 1); // Posició
Lectura = ADRESH;
Lectura = Lectura << 8;
Lectura = Lectura | ADRESL; // Valor llegit
// T = (125 * Lectura - 12800) / 256
Lectura = 125 * Lectura; // Primer pas del càlcul
if (Lectura >= 12800) { // És positiu?
Negatiu = 0; // Sí
Lectura = Lectura - 12800; // Segon pas del càlcul
} else {
Negatiu = 1; // És negatiu
Lectura = 12800 - Lectura; // Segon pas del càlcul
}
Lectura = Lectura / 128; // Lectura té el doble de la temperatura
// En valor absolut
if (Lectura == 2 * (Lectura / 2)) { // Mirem si el decimal és 0 o 5
Digits[0] = 0;
} else {
Digits[0] = 5;
}
// Separem els dígits
Lectura = Lectura / 2; // Lectura té la temperatura en valor absolut
Digits[1] = Lectura % 10; // Unitats
Lectura = Lectura / 10;
Digits[2] = Lectura % 10; // Desenes
Digits[3] = Lectura / 10; // Centenes
// Convertim a ASCII i posem el signe
for (signed char j = 0; j <= 4; j++){ // 4 dígits
Digits[j] = Digits[j] + '0'; // Li sumem el codi ASCII de 0
}
if (Digits[3] == '0') { // Mirem si el primer dígit és 0
Digits[3] = ' '; // Si ho és, hi posem un espai
if (Digits[2] == '0') { // I mirem si ho és el segon
Digits[2] = ' '; // Si ho és, hi posem un espai
}
}
if (Negatiu) { // Ara mirem si és negatiu
Digits[3] = '-'; // Si ho és, hi posem el signe -
}
// Ho enviem a la pantalla
EnviaL('T'); // Lletra
EnviaL(' '); // Espai
EnviaL('='); // Igual
EnviaL(' '); // Espai
for (signed char j = 3; j > 0; j--){ // 3 dígits
EnviaL(Digits[j]); // Número
}
EnviaL(','); // Coma
EnviaL(Digits[0]); // Número
EnviaL(' '); // Espai
EnviaL(0b11011111); // Graus
EnviaL('C'); // Lletra
_delay(1000000); // Retard
}
}
void EnviaL(char Caracter) {
TXREG = Caracter; // Agafa el caràcter i l'envia
__delay_ms(1); // Donem temps
while (PIR1bits.TXIF == 0) // Esperem que s'acabi d'enviar
; // No fem res
}
void Cursor(char Filera, char Columna) {
char Posicio = 0; // Variable per a calcular la posició
if (Filera == 2) {
Posicio = 64; // La primera columna de la segona fila és 64;
}
if (Columna > 0 && Columna < 33) { // Comprovem que sigui un valor raonable
Posicio = Posicio + Columna; // Sumem les adreces
Posicio = Posicio - 1; // Restem 1 perquè numera des de 0
}
Posicio = Posicio + 128; // Posa el bit de posicionat a 1
EnviaL(254); // Control de la posició del cursor
EnviaL(Posicio); // Canvia el cursor de lloc
}

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