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
|
|
|