Révision 517
Ajouté par jeleroy il y a presque 4 ans
SP4b2.c | ||
---|---|---|
/***********************************************************************/
|
||
#include "sfr32c87.h"
|
||
|
||
/* definition des ports connect?s au micro-controlleur*/
|
||
#define port pd3
|
||
#define LCD_RS p3_0
|
||
#define LCD_RW p3_1
|
||
... | ... | |
#define LCD_B6 p3_6
|
||
#define LCD_B7 p3_7
|
||
|
||
|
||
void LCD_init_port(void);
|
||
/*D?claration des fonction utilis?es*/
|
||
void tpo_us(unsigned short duree);
|
||
void tpo_ms(unsigned short duree);
|
||
void LCD_4b(unsigned char car);
|
||
... | ... | |
void LCD_init(void);
|
||
void LCD_char(unsigned char car);
|
||
void LCD_str(unsigned char *str);
|
||
void init_keyboard(void);
|
||
void tpo_50ms(void);
|
||
void decode_touche(unsigned char code_touche,unsigned char* valeur_touche);
|
||
|
||
//D?claration des variables
|
||
unsigned char touche = 0;
|
||
unsigned char premier_code_touche = 0;
|
||
unsigned char deuxieme_code_touche = 0;
|
||
unsigned char code_touche = 0;
|
||
unsigned char valeur_touche;
|
||
|
||
void LCD_init_port(void){
|
||
port = 0xFF;
|
||
}
|
||
|
||
void tpo_us(unsigned short duree){
|
||
tcspr = 0x8A;
|
||
ta0mr = 0x82;
|
||
ta0 = duree;
|
||
ta0s = 1;
|
||
ta0os = 1;
|
||
ta0ic = 0x00;
|
||
tcspr = 0x8A; //Rapport de division fr?quence
|
||
ta0mr = 0x82; //Mode comptage une seule fois
|
||
ta0 = duree; //Valeur de la temporisation
|
||
ta0s = 1; //D?but comptage
|
||
ta0os = 1; //D?marrage comptage
|
||
ta0ic = 0x00; //D?sactivation des interruptions
|
||
while(ir_ta0ic != 1);
|
||
ta0s = 0;
|
||
ta0s = 0; //Fin comptage
|
||
}
|
||
|
||
void tpo_ms(unsigned short duree){
|
||
... | ... | |
}
|
||
|
||
void LCD_4b(unsigned char car){
|
||
LCD_E = 1;
|
||
LCD_E = 1; //Pr?t ? envoyer une donn?e (sur front descendant
|
||
|
||
if (car & 128){
|
||
LCD_B7 = 1;
|
||
if (car & 128){ //Si le bits de poids fort vaut 1
|
||
LCD_B7 = 1; //Application d'un 1 sur la sortie
|
||
}else{
|
||
LCD_B7 = 0;
|
||
LCD_B7 = 0; //Sinon application d'un 0 sur la sortie
|
||
}
|
||
|
||
if (car & 64){
|
||
... | ... | |
LCD_B4 = 0;
|
||
}
|
||
|
||
LCD_E = 0;
|
||
LCD_E = 0; //Donn?e envoy?e
|
||
}
|
||
|
||
void LCD_8b(unsigned char car){
|
||
LCD_4b(car);
|
||
LCD_4b(car<<4);
|
||
LCD_4b(car); //Envoi du bit de poids fort
|
||
LCD_4b(car<<4); //Envoi du bit de poids faible
|
||
}
|
||
|
||
void LCD_com(unsigned char car){
|
||
LCD_RS = 0;
|
||
LCD_RS = 0; //Envoi d'une commande
|
||
LCD_8b(car);
|
||
}
|
||
void LCD_init(void){
|
||
//Processus necesaire ? l'initialisation de l'afficheur
|
||
LCD_RS=0;
|
||
tpo_ms(15);
|
||
LCD_4b(0x30);
|
||
LCD_4b(0x30); //Afficheur en mode 8 bits
|
||
tpo_ms(5);
|
||
LCD_4b(0x30);
|
||
LCD_4b(0x30); //Afficheur en mode 8 bits
|
||
tpo_us(100);
|
||
LCD_4b(0x30);
|
||
LCD_4b(0x30); //Afficheur en mode 8 bits
|
||
tpo_us(100);
|
||
LCD_4b(0x20);
|
||
LCD_com(0x28);
|
||
LCD_com(0x06);
|
||
LCD_com(0x0E);
|
||
LCD_com(0x01);
|
||
LCD_com(0x0E); //Extinction de l'afficheur
|
||
LCD_com(0x01); //R?initialisation de l'afficheur
|
||
tpo_ms(5);
|
||
}
|
||
|
||
void LCD_char(unsigned char car){
|
||
LCD_RS = 1;
|
||
LCD_8b(car);
|
||
LCD_RS = 1; //Envoi d'une donn?e
|
||
LCD_8b(car); //Envoi d'un caract?re
|
||
}
|
||
void LCD_str(unsigned char *str){
|
||
void LCD_str(unsigned char *str){//Envoi d'une chaine de caract?re
|
||
int i = 0;
|
||
while(str[i] != '\0'){
|
||
LCD_char(str[i]);
|
||
while(str[i] != '\0'){ //Tant que l'on est pas ? la fin de la chaine de caract?re
|
||
LCD_char(str[i]);
|
||
i ++;
|
||
}
|
||
}
|
||
|
||
void init_keyboard(void){
|
||
pd10 = 0x0F; //Configuration des broches du clavier en entr?e/sortie
|
||
p10=0; //Mise des broches du port 1? ? 0
|
||
pu31 = 1; //Activation des r?sistance de tirage ? l'?tat haut
|
||
}
|
||
|
||
void tpo_50ms(void){
|
||
tcspr = 0x8A;
|
||
ta0mr = 0x82;
|
||
ta0 = 50000;
|
||
ta0s = 1;
|
||
ta0os = 1;
|
||
ta0ic = 0x00;
|
||
while(ir_ta0ic != 1);
|
||
ta0s = 0;
|
||
}
|
||
void decode_touche(unsigned char code_touche,unsigned char* valeur_touche){
|
||
|
||
switch(code_touche){
|
||
case (0xBE): //Code de la touche du clavier
|
||
*valeur_touche = 0x31;//code de la touche en hexadecimale
|
||
break;
|
||
|
||
case (0xDE):
|
||
*valeur_touche = 0x32;
|
||
break;
|
||
|
||
case (0x7E):
|
||
*valeur_touche = 0x33;
|
||
break;
|
||
|
||
case (0xBD):
|
||
*valeur_touche = 0x34;
|
||
break;
|
||
|
||
case (0xDD):
|
||
*valeur_touche = 0x35;
|
||
break;
|
||
|
||
case (0x7D):
|
||
*valeur_touche = 0x36;
|
||
break;
|
||
|
||
case (0xEB):
|
||
*valeur_touche = 0x37;
|
||
break;
|
||
|
||
case (0xDB):
|
||
*valeur_touche = 0x38;
|
||
break;
|
||
|
||
case (0x7B):
|
||
*valeur_touche = 0x39;
|
||
break;
|
||
|
||
case (0xE7):
|
||
*valeur_touche = 0x2A;
|
||
break;
|
||
|
||
case (0xD7):
|
||
*valeur_touche = 0x30;
|
||
break;
|
||
|
||
case (0x77):
|
||
*valeur_touche = 0x23;
|
||
break;
|
||
|
||
|
||
}
|
||
}
|
||
|
||
void main(void)
|
||
{
|
||
char car[] = {'B','o','n','j','o','u','r',' ',};
|
||
LCD_init_port();
|
||
LCD_init();
|
||
LCD_str(car);
|
||
{
|
||
char car[] = {'B','o','n','j','o','u','r',' '};
|
||
LCD_init_port(); //Initialisation des broches
|
||
LCD_init(); //Initialisation de l'afficheur
|
||
while (1){
|
||
init_keyboard();
|
||
|
||
|
||
pd10 = 0x0F; //Mode entr?e (colonnes) sortie (lignes)
|
||
p10=0; //Mise ? 0 des sorties
|
||
pu31 = 1; //Activation des r?sistance de tirage ? l'?tat haut (colonnes)
|
||
pu30 = 1;//Activation des r?sistance de tirage ? l'?tat haut (lignes)
|
||
|
||
touche = p10; //Lecture de la valeur sur les sorties
|
||
tpo_50ms(); //anti rebond
|
||
while(p10 == 0xF0);
|
||
premier_code_touche = touche & 0xF0; //Stockage du premier code de la touche
|
||
|
||
pd10 = 0xF0; ////Mode sortie (colonnes) entr?e (lignes)
|
||
p10 = 0;
|
||
pu31 = 1;
|
||
|
||
p10 = touche; //stockage du premier code la touche dans p10 pour l'appliquer sur les sorties du micro-controlleur
|
||
|
||
touche = p10;
|
||
|
||
deuxieme_code_touche = 0x0F & touche;//Stockage du deuxi?me code de la touche
|
||
|
||
code_touche = deuxieme_code_touche+premier_code_touche;//Stockage des deux code de la touche
|
||
|
||
while(p10 == 0x0F);
|
||
|
||
|
||
|
||
|
||
decode_touche(code_touche, &valeur_touche);
|
||
|
||
|
||
LCD_char(valeur_touche);// Affichage de la valeur de la touche
|
||
}
|
||
|
||
}
|
Formats disponibles : Unified diff
Affichage touche du clavier sur l'afficheur fonctionnel