Ara
15th

Bu uygulamada HD44780 uyumlu 2×16 LCD’ler için 74164 shift register entegresi ile 3 pin uygulaması yer almakta. İlgili sürücü dosyasını “driver” klasörüne atıldığında lcdnizi sadece 3 pin ile kontrol edebilirsiniz. Devrede;
LDE_E: Aktif etme pini
LCD_CK: Clock pulse için
LCD_DAT: en düşük değerlikli biti başta göndermek üzere data pini olarak kullanılmıştır.
// flex_lcd_3_pins.c
//Modificación de Flex_lcd por Duende_Azul y Akenafab //Trabaja con 3 pines y 74VHC164 //8-Bit Serial-In, Parallel-Out Shift Register
//La LCD se usa en modo 4bits //Revisar diagrama de conexion Adjunto //Se ha utilizado a una velocidad de @40MHz sin ningun problema
//No esta habilitada la lectura del LCD //RW debe ir a gnd
//Definir pines antes de llamar libreria// //#define LCD_E PIN_A0 //#define LCD_CK PIN_A1 //#define LCD_DAT PIN_A2
//======================================== int RS_bit; #define lcd_type 2 // 0=5×7, 1=5×10, 2=2 lines #define lcd_line_two 0×40 // LCD RAM address for the 2nd line
int8 const LCD_INIT_STRING[4] = { 0×20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5×8 dots 0xc, // Display on 1, // Clear display 6 // Increment cursor };
//————————————- void lcd_send_nibble(int8 nibble, int rs_bit) {
int x; if(RS_bit==1) nibble=nibble|0×10;
for(x=0;x<5;x++){ output_bit(LCD_DAT,shift_right(&nibble,1,0)); delay_cycles(1); output_low(LCD_CK); delay_us(1); output_high(LCD_CK);}
output_high(LCD_E); delay_us(2); output_low(LCD_E); }
//———————————– //—————————————- // Send a byte to the LCD. void lcd_send_byte(int8 address, int8 n) { //output_low(LCD_RS); RS_bit=0; delay_us(100);
if(address) //output_high(LCD_RS); RS_bit=1; else //output_low(LCD_RS); RS_bit=0;
delay_cycles(1);
output_low(LCD_E);
lcd_send_nibble(n >> 4,RS_bit); lcd_send_nibble(n & 0xf,RS_bit); }
//—————————- void lcd_init(void) { int8 i;
//output_low(LCD_RS); RS_bit=0;
output_low(LCD_E);
delay_ms(20);
for(i=0 ;i < 3; i++) { lcd_send_nibble(0×03,RS_bit); delay_ms(5); }
lcd_send_nibble(0×02,RS_bit);
for(i=0; i < sizeof(LCD_INIT_STRING); i++) { lcd_send_byte(0, LCD_INIT_STRING[i]);
delay_ms(5); }
}
//----------------------------
void lcd_gotoxy(int8 x, int8 y) { int8 address;
if(y != 1) address = lcd_line_two; else address=0;
address += x-1; lcd_send_byte(0, 0×80 | address); }
//—————————– void lcd_putc(char c) { switch(c) { case ‘\f‘: //limpia pantalla lcd_send_byte(0,1); delay_ms(8); break;
case ‘\n‘: //cambio de linea lcd_gotoxy(1,2); break;
case ‘\b‘: //retrocede 1 caracter lcd_send_byte(0,0×10); break;
default: lcd_send_byte(1,c); break; } }
//------------------------------
void lcd_setcursor_vb(short visible, short blink) { lcd_send_byte(0, 0xC|(visible<<1)|blink); }
Yukarıdaki kodlar kütüphaneye uygun bir isimle kaydediniz.Aşağıda örnek uygulama yer almakta
#include <16F88.h>
#FUSES INTRC_IO,NOWDT,PUT,MCLR,NOBROWNOUT,NOLVP,NOPROTECT,NODEBUG,CCPB0,NOFCMEN,NOIESO #use delay(Internal=8M) //———— Pines del LCD ———————// #define LCD_E PIN_A0 #define LCD_CK PIN_A1 #define LCD_DAT PIN_A2 //————————————————–// #include “flex_lcd_3pins.c” // Cargamos libreria del lcd void main(){ delay_ms(100);
output_a(0); output_b(0); lcd_init(); // inicializamos el LCD lcd_setcursor_vb(1,1); //cursor visible,papadeo while(1){
printf(lcd_putc,“\f-LCD 3 pin Mode-\n* !.|.|..|.|.! *”); delay_ms(1000); printf(lcd_putc,“\f* Duende_Azul *\n * Akenafab *”); delay_ms(1000); }//end while }//end main
Örnekle ilgili bütün dosyalara www.micropic.es sitesinden ulaşabilirsiniz.
