Dans le cadre de mon premier projet, je suis en train de tester le module Rotary click de MikroE sur ma plaque EasyPIC7.
J'ai téléchargé le code exemple et je l'ai travaillé . j'entends par la , j'ai changé des valeurs, modifié le mouvements... etc, pour me faire la main dessus et comprendre le code Grey .
Par contre je ne comprends pas certaines lignes que je me permets de vous soumettre pour une t'chtite explication , si vous avez le temps .
Le code entier :
[spoil]
Code : Tout sélectionner
sbit HC595_cs at RE0_bit;
sbit ENCA at RC0_bit;
sbit ENCB at RA2_bit;
sbit ENC_SW at RB0_bit;
sbit HC595_cs_direction at TRISE0_bit;
sbit ENCA_direction at TRISC0_bit;
sbit ENCB_direction at TRISA2_bit;
sbit ENC_SW_direction at TRISB0_bit;
unsigned int Led_State = 0x0001;
char ENCA_bit,ENCB_bit;
char ENC_Button_State = 0;
//################### Interruption sur Appui BP #####################################
void Interrupt(){
ENC_Button_State++; // Incremente la valeur du Bouton
if (ENC_Button_State == 4) // Si le bouton arrive à 4
ENC_Button_State = 0; // On le passe à 0 .
if (INT0IF_bit){ // Verification de l'interruption par le Flag INT0
INT0IF_bit = 0; // Réarmement du flag pour l'interrutpion
// switch pour selectionner l'etat des leds suivant la valeur du Bouton
// Cette valeur en Hexa correspond à une valeur en binaire sur 16 bits
switch (ENC_Button_State){
case 0 : Led_State = 0x0003; // 1 led allumée = 00000000 - 00000001
break;
case 1 : Led_State = 0x0101; // 2 leds allumées = 00000001 - 00000001
break;
case 2 : Led_State = 0x1111; // 4 leds allumées = 00010001 - 00010001
break;
case 3 : Led_State = 0x5555; // 8 leds allumées = 01010101 - 01010101
break;
default : // Secours toujours mettre un defaut avec un switch
break;
}
}
}
void HC595_Write(int value){
char first_byte, second_byte;
second_byte = value; // Enregistrement du premier byte
value = value>>8; // On décale de 8 bit pour afficher le second byte
first_byte = value; // Enregistrement du second Byte
SPI1_write(first_byte); // Envoi du premier byte au HC595
SPI1_write(second_byte); // Envoi du second Byte
HC595_cs = 0; // HC595
asm{nop};
asm{nop};
asm{nop};
HC595_cs = 1;
}
//##################################################################################
//########################## PROGRAMME PRINCIPAL #################################
//##################################################################################
void main() {
ANSELA = 0 ; // Configure PORTA en digital
ANSELB = 0 ; // Configure PORTB en digital
ANSELC = 0 ; // Configure PORTC en digital
ENCA_direction = 1; // Configure RC0 en entrée
ENCB_direction = 1; // Configure RA2 en entrée
ENC_SW_direction = 1; // Configure RB0 en entrée
HC595_cs_direction = 0; // Configure RE0 en sortie
INT0IE_bit = 1 ; // Autorise l'interruption sur RB0
GIE_bit = 1 ; // Autorise toutes les interruptions ( Global Int Enable)
SPI1_Init(); // Initialisation du SPI1
// ######################### BOUCLE PRINCIPALE ##################################
while(1) {
if((ENCA_bit != RC0_bit)||(ENCB_bit != RA2_bit)){ // SI l'état logique change sur la PinA ou la PinB
// On compare le dernier état logique de la PinB ET le nouvel état logique de la PinA
if(ENCB_bit|RC0_bit==1){ // Si ENCB_old OU ENCA_new est à 1
Led_State = (Led_State << 1) | (Led_State >> 15);
}
if(ENCA_bit|RA2_bit==1){ // Si ENCA_old OR ENCB_new est à 1
Led_State = (Led_State >> 1) | (Led_State <<15);
}
ENCA_bit = RC0_bit ; // On enregistre la nouvelle valeur dans ENCA_bit
ENCB_bit = RA2_bit ; // On enregistre la nouvelle valeur dans ENCB_bit
}
HC595_Write(Led_State); // Execute la fonction
}
} Il s'agit de cette ligne en premier lieu :
Code : Tout sélectionner
if(ENCB_bit|RC0_bit==1){ // Si ENCB_old OU ENCA_new est à 1
Led_State = (Led_State << 1) | (Led_State >> 15);
} J'ai l'impression qu'on ce sert de l'ancien état pour déterminé le sens de mouvement à effectuer! mais je ne comprends pas ce que viens faire le | dans le Led_State = (Led_State << 1) | (Led_State >> 15); ? ou plutôt comment déterminé s'il faut décalé de 1 ou de 15 ?
Et Ici en deuxième :
Code : Tout sélectionner
HC595_cs = 0; // HC595
asm{nop};
asm{nop};
asm{nop};
HC595_cs = 1; Je pense que HC595_cs = 0; active la mise à jour des valeurs mais que viennent faire les asm{nop};
PS : mon premier projet et un compte à rebours pour un jeu de société pour mes enfants ; j'avais fabriquer le premier en BASIC, mais il n'as pas resisté a la brutalité des enfants !





Oui mais cela me fais me posé d'autre questions ? combien de temps dur un