Вы находитесь на странице: 1из 32

SESIN XI-XIII

CCS PARA
MICROCONTROLADORES
PIC

POR: EULER DEZA FIGUEROA


EULER DEZA FIGUEROA
Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

TECLADO [ KEYPAD 3x4 ]


Las entradas a travs de un pulsador son muy habituales en los

sistemas con microcontroladores para trabajar con una mayor


informacin o informacin alfanumrica.
Por ejemplo, se utilizan los teclados matriciales de 1x4, 3x4, 4x4,
4x6, Etc.

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

TECLADO [ KEYPAD 3x4 ]


El compilador de C incluye el driver KBD.C para manejar el

teclado (3x4). Las funciones que incorporan son as siguientes


kbd_init();

// inicializa el sistema, debe ser la primera funcin en el programa


Kbd_getc()
// Devuelve el valor de la tecla pulsada en funcin de la tabla que tiene
programada

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

TECLADO [ KEYPAD 3x4 ]


A travs de la modificacin de esta tabla podemos adecuar el resultado

del programa a las distintas caratulas del teclado


El archivo KBD.C esta pensado para trabajar con el PORTB o el PORTD
Activado o no la linea #define use_portb_lcd TRUE podemos seleccionar
el PORTB

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

TECLADO [ KEYPAD 3x4 ]


Las conexiones vienen dadas en el fichero pero se pueden modificar

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

TECLADO [ KEYPAD 3x4 ]


Las conexiones vienen dadas en el fichero pero se pueden modificar

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

TECLADO [ KEYPAD 3x4 ]


Se puede trabajar con el LCD y el teclado a travs de puertos separados

o compartir el mismo puerto (ahorro de patillas )


Compartir puerto suele conllevar problemas si se quiere trabajar con el
teclado y las interrupciones RB4/RB7
CONEXIN DE LCD Y
TECLADO A
DIFERENTES
PUERTOS

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

TECLADO [ KEYPAD 3x4 ]


Compartir puerto suele conllevar problemas si se quiere trabajar con el

teclado y las interrupciones RB4/RB7


CONEXIN DE LCD Y
TECLADO AL MISMO
PUERTO [B]

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Introducir datos por el teclado y visualizarlos en el LCD. Cuando se

pulsa la tecla * borrar el LCD.

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Programa Principal

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Programa Principal cont.

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Librera: KBD_LIB [Derived from KBDD.C ].
///////////////////////////////////////////////////////////////////////////
////
KBD_LIB.C by Redraven
////
////
////
////
Derived from KBDD.C
////
////
Generic keypad scan driver
////
////
////
//// kbd_init() Must be called before any other function.
////
////
////
//// c = kbd_getc(c) Will return a key value if pressed or /0 if not ////
////
This function should be called frequently so as ////
////
not to miss a key press.
////
////
////
///////////////////////////////////////////////////////////////////////////
////
(C) Copyright 1996,1997 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.
////
////////////////////////////////////////////////////////////////////////////
EULER DEZA FIGUEROA
Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Librera: KBD_LIB [Derived from KBDD.C ].

////////////////// The following defines


the keypad layout on port D
// Un-comment the following define
to use port B
#define use_portb_kbd TRUE
// Make sure the port used has pullup resistors (or the LCD) on
// the column pins
#if defined(__PCH__)
#if defined use_portb_kbd
#byte kbd = 0xF81
// This
puts the entire structure
#else
#byte kbd = 0xF83
// This
puts the entire structure
#endif
#else

#if defined use_portb_kbd


#byte kbd = 6
// on to
port B (at address 6)
#else
#byte kbd = 8
// on to
port D (at address 8)
#endif
#endif
#if defined use_portb_kbd
#define
set_tris_kbd(x)
set_tris_b(x)
#else
#define
set_tris_kbd(x)
set_tris_d(x)
#endif
EULER DEZA FIGUEROA
Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Librera: KBD_LIB [Derived from KBDD.C ].

//Keypad connection: (for example


column 0 is B0)
#define COL0 (1 << 0) // PIN_B0
#define COL1 (1 << 1) // PIN_B1
#define COL2 (1 << 2) // PIN_B2
#define COL3 (1 << 3) // PIN_B3
#define ROW0 (1 << 4) // PIN_B4
#define ROW1 (1 << 5) // PIN_B5
#define ROW2 (1 << 6) // PIN_B6
#define ROW3 (1 << 7) // PIN_B7
#define
ALL_ROWS
(ROW0|ROW1|ROW2|ROW3)
#define
ALL_PINS
(ALL_ROWS|COL0|COL1|COL2|CO
L3)

// Keypad layout:
char
const
KEYS[4][4]
{{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}};

#define
KBD_DEBOUNCE_FACTOR
33
// Set this number to apx n/333
where
// n is the
number of times you expect

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Librera: KBD_LIB [Derived from KBDD.C ].

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;
}
EULER DEZA FIGUEROA
Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Librera: KBD_LIB [Derived from KBDD.C ].

if(kbd_down) {
if((kbd
&
(ALL_ROWS))==(ALL_ROW
S)) {
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;
}
}
EULER DEZA FIGUEROA
Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Librera: KBD_LIB [Derived from KBDD.C ].

kbd_call_count=0;
}
set_tris_kbd(ALL_PINS);
return(kchar);
}

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Librera: LCD.C

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Librera: LCD.C . cont

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Librera: LCD.C . cont

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Librera: LCD.C . cont

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


// original version of this library incorrectly labeled
LCD_DATA0 as LCD_DATA4,
// LCD_DATA1 as LCD_DATA5, and so on. this block of code
makes the driver
// compatible with any code written for the original library
#if (defined(LCD_DATA0) && defined(LCD_DATA1) &&
defined(LCD_DATA2)
&&
defined(LCD_DATA3)
&&
!defined(LCD_DATA4)
&&
!defined(LCD_DATA5)
&&
!defined(LCD_DATA6) && !defined(LCD_DATA7))
#define LCD_DATA4 LCD_DATA0
#define LCD_DATA5 LCD_DATA1
#define LCD_DATA6 LCD_DATA2
#define LCD_DATA7 LCD_DATA3
#endif
#ifndef LCD_DATA4
#ifndef LCD_DATA_PORT
#if defined(__PCB__)
#define LCD_DATA_PORT
0x06 //portb
#define set_tris_lcd(x) set_tris_b(x)
#else
#if defined(PIN_D0)
#define LCD_DATA_PORT
getenv("SFR:PORTD")
//portd
#else
#define LCD_DATA_PORT
getenv("SFR:PORTB")
//portb
#endif
#endif
#endif

Librera: lcd.c

#if defined(__PCB__)
LCD_PIN_MAP lcd, lcdlat;
#byte lcd = LCD_DATA_PORT
#byte lcdlat = LCD_DATA_PORT
#elif defined(__PCM__)
LCD_PIN_MAP lcd, lcdlat, lcdtris;
#byte lcd = LCD_DATA_PORT
#byte lcdlat = LCD_DATA_PORT
#byte lcdtris = LCD_DATA_PORT+0x80
#elif defined(__PCH__)
LCD_PIN_MAP lcd, lcdlat, lcdtris;
#byte lcd = LCD_DATA_PORT
#byte lcdlat = LCD_DATA_PORT+9
#byte lcdtris = LCD_DATA_PORT+0x12
#elif defined(__PCD__)
LCD_PIN_MAP lcd, lcdlat, lcdtris;
#word lcd = LCD_DATA_PORT
#word lcdlat = LCD_DATA_PORT+2
#word lcdtris = LCD_DATA_PORT-0x02
#endif
#endif //LCD_DATA4 not defined
#ifndef LCD_TYPE
#define LCD_TYPE 2
#endif

// 0=5x7, 1=5x10, 2=2 lines

#ifndef LCD_LINE_TWO
#define LCD_LINE_TWO 0x40
line
#endif

// LCD RAM address for the second

BYTE const LCD_INIT_STRING[4] = {0x20 | (LCD_TYPE << 2), 0xc, 1,


6};
// These bytes need to be sent to the LCD
// to start it up.

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


BYTE lcd_read_nibble(void);

BYTE lcd_read_byte(void)
{
BYTE low,high;
#if defined(__PCB__)
set_tris_lcd(LCD_INPUT_MAP);
#else
#if (defined(LCD_DATA4) && defined(LCD_DATA5)
&& defined(LCD_DATA6) && defined(LCD_DATA7))
output_float(LCD_DATA4);
output_float(LCD_DATA5);
output_float(LCD_DATA6);
output_float(LCD_DATA7);
#else
lcdtris.data = 0xF;
#endif
#endif

lcd_output_rw(1);
delay_cycles(1);
lcd_output_enable(1);
delay_cycles(1);
high = lcd_read_nibble();

Librera: lcd.c

lcd_output_enable(0);
delay_cycles(1);
lcd_output_enable(1);
delay_us(1);
low = lcd_read_nibble();
lcd_output_enable(0);
#if defined(__PCB__)
set_tris_lcd(LCD_INPUT_MAP);
#else
#if
(defined(LCD_DATA4)
defined(LCD_DATA5)
defined(LCD_DATA6)
defined(LCD_DATA7))
output_drive(LCD_DATA4);
output_drive(LCD_DATA5);
output_drive(LCD_DATA6);
output_drive(LCD_DATA7);
#else
lcdtris.data = 0x0;
#endif
#endif
return( (high<<4) | low);
}

&&
&&
&&

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


BYTE lcd_read_nibble(void)
{
#if (defined(LCD_DATA4) && defined(LCD_DATA5)
&& defined(LCD_DATA6) && defined(LCD_DATA7))
BYTE n = 0x00;
/* Read the data port */
n |= input(LCD_DATA4);
n |= input(LCD_DATA5) << 1;
n |= input(LCD_DATA6) << 2;
n |= input(LCD_DATA7) << 3;
return(n);
#else
return(lcd.data);
#endif

Librera: lcd.c

void lcd_send_nibble(BYTE n)
{
#if
(defined(LCD_DATA4)
&&
defined(LCD_DATA5)
&&
defined(LCD_DATA6)
&&
defined(LCD_DATA7))
/* Write to the data port */
output_bit(LCD_DATA4, bit_test(n, 0));
output_bit(LCD_DATA5, bit_test(n, 1));
output_bit(LCD_DATA6, bit_test(n, 2));
output_bit(LCD_DATA7, bit_test(n, 3));
#else
lcdlat.data = n;
#endif
delay_cycles(1);
lcd_output_enable(1);
delay_us(2);
lcd_output_enable(0);

}
TOBE.

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: Manejo Teclado de pantalla LCD de 2 x 16


Disear un sistema basico para el control de acceso; a traves de

un teclado de 4x4 introducir una clave de 4 digitos, que cuando sea


correcta abra una puerta (con un pulso a rele ) y lo indique en una
pantalla de LCD. Guardar la clave de acceso en la memoria
EEPROM .

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: GENERACION DE SEALES PWM


Introducir los datos, a travs de un teclado, de velocidad de un motor y

generar una seal modulada en ancho de pulso proporcional al dato de la


velocidad
Se genera una seal modulada en

ancho de pulso PWM (Sin utilizar el


modulo CCP del PIC) donde el
semiperiodo de seal a nivel alto
esta fijado por el valor introducido
en el teclado. Para ello se utiliza un
registro de 8 bits para fijar el
semiperiodo a nivel alto (PWMH) y el
semiperiodo a nivel bajo (PWML)
Como el valor mximo del registro
es 255, este debe coincidir con el
valor mximo del teclado, es decir 9,
por lo tanto, la relacin entre el valor
del teclado y el semiperiodo PWMH
ser:

PWH = ( 255/9) x Tecla


aproximadamente
PWMH = 28xTecla

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: GENERACION DE SEALES PWM


Segn dicha ecuacin cuando el valor de teclado sea de 0 la salida

ser 0 de forma continua y el motor estar parado. Cuando el valor de


teclado sea 9, el semiperiodo PWMH ser de 252 (no llega 255) y el
motor estar casi a toda marcha. El semiperiodo a nivel bajo PWML
se obtiene de restar el PWMH a 255

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: GENERACION DE SEALES PWM

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: GENERACION DE SEALES PWM

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Programa 15: GENERACION DE SEALES PWM

EULER DEZA FIGUEROA


Euler_df28@hotmail.com

PROGRAMAS EN CCS COMPILER

Bibliografa
CCS C Compiler Manual PCD CCS INC FEBREO 2015
CCS C Compiler Manual PCB/PCM/PCH CCS INC FEBREO

2015
Compilador C CCS y simulador PROTEUS para
Microcontroladores PIC Eduardo Garca Breijo
Diseo y simulacion de Sistemas microcontrolados en lenguaje
C Juan Ricardo Clavijo Mendoza
Programacion en CCS para Microcontroladores PIC Aaron
Castro Bazua
Datasheets

ING. EULER DEZA FIGUEROA


euler_df28@hotmail.com
EULER DEZA FIGUEROA
Euler_df28@hotmail.com

Вам также может понравиться