urgent svp

< Sujet précédent  Sujet suivant >
Index du Forum -> Forum des Logiciels -> PCWH Pic C Compiler
AuteurMessage
Tunisia.png olfa92
Newbie



Messages : 1
Inscrit(e) le: 23/04/2014
Posté le 23/04/2014 20:22  
urgent svp
#include<16F877.h>
#use delay(clock=4000000)
#byte kbd = 0xF81 // portc 0xF82 et portD 0xF83
#byte kbd = 6 //si on utulise portc alors kbd= 7 et si on utulise le portD kbd= 8
#define set_tris_kbd(x) set_tris_b(x)

#define COL0 (1 << 4) //on fait un decalage de 4 chiffres a gauche
#define COL1 (1 << 5) //on fait un decalage de 5 chiffre a gauche
#define COL2 (1 << 6)
#define COL3 (1 << 7)

#define ROW0 (1 << 0)
#define ROW1 (1 << 1)
#define ROW2 (1 << 2)
#define ROW3 (1 << 3)


#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3) // on definit les rangèes
#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2|COL3) // on definit toutes les colonnes


char const KEYS[4][4] = {{'7','8','9','/'}, // on declare dans une matrice tt les caractères du clavier
{'4','5','6','*'},
{'1','2','3','-'},
{'c','0','=','+'}};

#define KBD_DEBOUNCE_FACTOR 60 // c'est le nombre apr de fois que vous allez effectuer un essai avec votre clavier

void kbd_init() {
}

char kbd_getc( ) {
static BYTE kbd_call_count;
static short int kbd_down;
static char last_key;
static BYTE col;

BYTE kchar;
BYTE row;

kchar='\0';
if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
switch (col) {
case 0 : set_tris_kbd(ALL_PINS&~COL0);
kbd=~COL0&ALL_PINS;
break;
case 1 : set_tris_kbd(ALL_PINS&~COL1);
kbd=~COL1&ALL_PINS;
break;
case 2 : set_tris_kbd(ALL_PINS&~COL2);
kbd=~COL2&ALL_PINS;
break;
case 3 : set_tris_kbd(ALL_PINS&~COL3);
kbd=~COL3&ALL_PINS;
break;
}

if(kbd_down) {
if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
kbd_down=FALSE;
kchar=last_key;
last_key='\0';
}
} else {
if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
if((kbd & ROW0)==0)
row=0;
else if((kbd & ROW1)==0)
row=1;
else if((kbd & ROW2)==0)
row=2;
else if((kbd & ROW3)==0)
row=3;
last_key =KEYS[row][col];
kbd_down = TRUE;
} else {
++col;
if(col==4)
col=0;
}
}
kbd_call_count=0;
}
set_tris_kbd(ALL_PINS);
return(kchar);
}
///////////////////////////////////////////////////////////////////////////
//// LCDD.C ////
//// Driver for common LCD modules ////
//// ////
//// lcd_init() Must be called before any other function. ////
//// ////
//// lcd_putc(c) Will display c on the next position of the LCD. ////
//// The following have special meaning: ////
//// \f Clear display ////
//// \n Go to start of second line ////
//// \b Move back one position ////
//// ////
//// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////
//// ////
//// lcd_getc(x,y) Returns character at position x,y on LCD ////
//// ////
///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
// D0 enable
// D1 rs
// D2 rw
// D4 D4
// D5 D5
// D6 D6
// D7 D7
//
// LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
//#define use_portb_lcd TRUE


struct lcd_pin_map {
BOOLEAN unused;

BOOLEAN rs;
BOOLEAN rw;
BOOLEAN enable;
// This structure is overlayed
// on to an I/O port to gain
// access to the LCD pins.
// The bits are allocated from
//BOOLEAN unused; // low order up. ENABLE will
int data : 4; // be pin B0.



} lcd;


#if defined(__PCH__)
#if defined use_portb_lcd

#byte lcd = 0xF81,0XF82 // This puts the entire structure
#else
#byte lcd = 0xF83 // This puts the entire structure
#endif

#else
#if defined use_portb_lcd
#byte lcd = 6 // on to port B (at address 6)
#else
#byte lcd = 8 // on to port D (at address 8)


#if defined use_portb_lcd
#define set_tris_lcd(x) set_tris_b(x)
#else
#define set_tris_lcd(x) set_tris_d(x)
#endif
#define lcd_type 1
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_one 0x20
#define lcd_line_two 0x40 // Adresse de la RAM de LCD pour la deuxième ligne

BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
// These bytes need to be sent to the LCD
// to s


// The following are used for setting
// the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



BYTE lcd_read_byte() {
BYTE low,high;
set_tris_lcd(LCD_READ);
lcd.rw = 1;
delay_cycles(1);
lcd.enable = 1;
delay_cycles(1);
high = lcd.data;
lcd.enable = 0;
delay_cycles(1);
lcd.enable = 1;
delay_us(1);
low = lcd.data;
lcd.enable = 0;
set_tris_lcd(LCD_WRITE);
return( (high<<4) | low);
}


void lcd_send_x( BYTE n ) {
lcd.data = n;
delay_cycles(1);
lcd.enable = 1;
delay_us(2);
lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

lcd.rs = 0;
while ( bit_test(lcd_read_byte(),7) ) ;
lcd.rs = address;
delay_cycles(1);
lcd.rw = 0;
delay_cycles(1);
lcd.enable = 0;
lcd_send_x(n >> 4);
lcd_send_x(n & 0xf);
}


void lcd_init() {
BYTE i;
set_tris_lcd(LCD_WRITE);
lcd.rs = 0;
lcd.rw = 0;
lcd.enable = 0;
delay_ms(15);
for(i=1;i<=3;++i) {
lcd_send_x(3);
delay_ms(5);
}
lcd_send_x(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING);
}


void lcd_gotoxy( BYTE x, BYTE y) {
BYTE address;

if(y!=1)
address=lcd_line_two;
else
address=0;
address+=x-1;
lcd_send_byte(0,0x82|address);
}

void lcd_putc( char c) {
switch (c) {
case '\f' : lcd_send_byte(1,1);
delay_ms(2);

break;
case '\n' : lcd_gotoxy(1,1); break;
case '\b' : lcd_send_byte(1,0x10); break;
default : lcd_send_byte(1,c); break;
}
}

char lcd_getc( BYTE x, BYTE y) {
char value;

lcd_gotoxy(x,y);
while ( bit_test(lcd_read_byte(),6) ); // wait until busy flag is low
lcd.rs=1;
value = lcd_read_byte();
lcd.rs=0;
return(value);
}

void main()
{

char k;

char ff;

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
port_b_pullups(true);
kbd_init();
lcd_init();

while(1)
{

lcd_gotoxy(1,2);//positionement du message sur la premiere ligne sur le clavier
delay_ms(2000);
printf(lcd_putc " int=");// ecrire sur le clavier du message "valint="
delay_ms(2000);//attente de 2000ms

do
{


k=kbd_getc();// attente que le bouton du clavier soit appuiè
if(k!=0)


lcd_putc(k);//affichage sur le LCD de la valeur de K deja saisie au clavier





}


while(k!='c');

lcd_gotoxy(1,1);
delay_ms(3000);
printf(lcd_putc " pas=");
do
{


k=kbd_getc();
if(k!=0)
if(k=='c')
lcd_putc('\f');
else
lcd_putc(k);




}
while(k!='c');

lcd_gotoxy(1,2);

printf(lcd_putc "fin=");
do
{


k=kbd_getc();
if(k!=0)
if(k=='c')
lcd_putc('\f');
else

lcd_putc(k);




}
while(true);{

}
}
}






How can I check if the values entered on the keyboard are saved memory space or not ?
Thank you


Revenir en haut | Permalien

Haut de page

© 2024 Technologue pro, cours électricité électronique informatique · © 2007 - 2024 Technologue pro - Ressources pédagogiques pour l'enseignement technologique en Tunisie
Usage dans un cadre strictement académique

Technologue: cours en ligne gratuit en électricité, électronique, informatique industrielle et mécanique pour l'enseignement technologique en Tunisie et offre des cours en ligne en génie électrique, informatique, mécanique, une base de données de TP, projets fin d'études et un annuaire de ressources pédagogiques
Licence - Sitemap - Qui somme nous ? - confidentialité- Tunisie Index
J'accepte
Ce site web utilise des cookies. Nous utilisons des cookies pour vous offrir la meilleure expérience sur notre site Web. Plus d'infos