Bonjour à tous,
Voila je vous présente mon problème.
Je suis entrain de développer un programme pour décoder une trame GPS puis l'afficher sur un écran LCD 16*2.
Le pic utiliser est un PIC18f452 et le compilateur est le MCC18.
Je vais vous montrer les codes que j'ai déjà écrit donc il me faudrait de l'aide pour pouvoir finir le programme Merci d'avance.
Code Lcd:
Code décodage trame:Code:#include<p18f452.h> #include<delays.h> //Déclaration des ports #define DATA_PORT PORTD #define TRIS_DATA_PORT TRISD #define RS_PIN PORTDbits.RD2 /* ligne RS */ #define TRIS_RS DDRDbits.RD2 /* config ligne RS */ #define E_PIN PORTDbits.RD3 /* ligne E */ #define TRIS_E DDRDbits.RD3 /* config ligne E */ //déclaration fonction Commande initialisation void init (unsigned char cmdinit); //déclaration des fonctions Commande et d'Ecriture d'une donnée void WriteCmdXLCD(unsigned char cmd); void WriteDataXLCD(char data); void main (void) { char chaine[]="Hello World"; char i; init (0x30);// mode 8 bits sur interface 8 bits init (0x30);// mode 8 bits sur interface 8 bits init (0x30);// mode 8 bits sur interface 8 bits init (0x20);// mode 4 bits sur interface 8 bits WriteCmdXLCD(0X28);//mode 4 bits et 2 lignes WriteCmdXLCD(0X0F);//afficheur en fonction D=1 Le curseur C=1 et le clignotement B=1 WriteCmdXLCD(0X01);//efface la mémoire de donnée et ramène le curseur à l'@0x00 WriteCmdXLCD( 0X06);//le curseur se déplace vers la droite I/D=1 //l'affichage n'accompagne pas le curseur dans son déplacement S=0 i=0; while(chaine[i]!='\0') {WriteDataXLCD(chaine[i]);i++;} WriteCmdXLCD( 0XC0);//changement de ligne: ligne 2 début de ligne WriteDataXLCD('G');//ecriture du caractère 'G' while(1); } //fonction Commande d'initialisation on envoie que les 4 bits de poids fort void init (unsigned char cmdinit) { TRIS_RS=0; TRIS_E=0; RS_PIN = 0; TRIS_DATA_PORT &= 0x0f; DATA_PORT &= 0x0f;//envoi des bits de poids fort DATA_PORT |= cmdinit&0xf0; E_PIN = 1; Delay10TCYx(1);//5us E_PIN = 0; Delay10KTCYx (10);// 50ms } //fonction Commande on envoie les 4 bits de poids fort puis les 4 bits de poids faible void WriteCmdXLCD(unsigned char cmd) { TRIS_RS=0; TRIS_E=0; RS_PIN = 0; TRIS_DATA_PORT &= 0x0f; DATA_PORT &= 0x0f;//envoi des bits de poids fort DATA_PORT |= cmd&0xf0; E_PIN = 1; Delay10TCYx(1);//5us E_PIN = 0; DATA_PORT &= 0x0f; //envoi des bits de poids faible DATA_PORT |= (cmd<<4)&0xf0; E_PIN = 1; Delay10TCYx(1);//5us E_PIN = 0; Delay10KTCYx (10);//50ms remplace la lecture du BusyFlag } //fonction Ecriture on envoie les 4 bits de poids fort puis les 4 bits de poids faible void WriteDataXLCD(char data) { TRIS_RS=0; TRIS_E=0; RS_PIN = 1; TRIS_DATA_PORT &= 0x0f; DATA_PORT &= 0x0f; //envoi des bits de poids fort DATA_PORT |= data&0xf0; E_PIN = 1; Delay10TCYx(1);//5us E_PIN = 0; DATA_PORT &= 0x0f; //envoi des bits de poids faible DATA_PORT |= ((data<<4)&0xf0); E_PIN = 1; Delay10TCYx(1);//5us E_PIN = 0; Delay10KTCYx (10);//50ms remplace la lecture du BusyFlag }
Code:#include <delays.h> #include <p18f452.h> #include <stdio.h> #include <string.h> #include <sw_uart.h> #include <timers.h> #include <usart.h> #include <xlcd.h> char txt[768]; signed int latitude, longitude; char *string; int i; unsigned short ready; void main() { ADCON1 = 0x0F; //Désactivation du CAN Delay_ms(100); ready = 0; //Set Timer1 Prescaler to 1:8 T1CON.T1CKPS1 = 1; //mise à 1 de T1CKPS1 T1CON.T1CKPS0 = 1; //mise à 1 de T1CKPS0 //Enable Timer1 interrupt: PIE1.TMR1IE = 1; //mise à 1 de TMR1IE //Timer1 starts counting from 15536: TMR1L = 0xB0; TMR1H = 0x3C; //Clear Timer1 interrupt flag: PIR1.TMR1IF = 0; //mise à 0 de TMR1IF //Note: Timer1 est configurer pour réaliser des intetuption toutes les 50ms UART1_Init(9600); //Enable Usart Receiver interrupt: PIE1.RCIE = 1; //mise à 1 de RCIE //Enable Global interrupt and Peripheral interrupt: INTCON.GIE = 1; //mise à 1 de GIE INTCON.PEIE = 1; //mise à 1 de PEIE //Start Timer 1: T1CON.TMR1ON = 1; //mise à 1 de TMR1ON while(1) { RCSTA.OERR = 0; //mise à 0 de OERR RCSTA.FERR = 0; //mise à 0 de FERR if(ready == 1) { //Si les données sont dans txt alors le tableau est pret: ready = 0; string = strstr(txt,"$GPGGA"); if(string != 0) { //Si le tableau contient txt "$ GPGGA" la chaîne peut passer ... if(string[17] != ',') { //Si "$ GPGGA" à dans son message NMEA "," signe de la 8ème lettre //position, cela signifie que la THA récepteur GPS n'a pas de position fixe! latitude = (string[17]-69)*10 + (string[18]-69); longitude = (string[30]-69)*100 + (string[31]-69)*10 + (string[32]-69); if(string[29] == 'S') { //Si la latitude est dans la direction Sud, il a signe moins latitude = 0 - latitude; } if(string[43] == 'W') { //si la longitude est dans la direction Ouest, il a signe moins longitude = 0 - longitude; } Display_Cursor(latitude, longitude); //Afficher l'heure sur l'écran } } } } }
-----