Ccs c for pic16F877a mục lục I. Tổng quan về ccs vì sao ta sử dung ccs ?



tải về 1.15 Mb.
trang6/15
Chuyển đổi dữ liệu23.08.2016
Kích1.15 Mb.
#26977
1   2   3   4   5   6   7   8   9   ...   15

4.Chân cho phép E (Enable):
Chân cho phép E được sử dụng bởi LCD để chốt thông tin hiện hữu trên chân dữ liệu của nó. Khi dữ liệu được cấp đến chân dữ liệu thì một xung mức cao xuống thấp phải được áp đến chân này để LCD chốt dữ liệu trên các chân dữ liêu. Xung này phải rộng tối thiểu là 450ns.
5.Các chân D0 - D7:
Đây là 8 chân dữ liệu 8 bít, được dùng để gửi thông tin lên LCD hoặc đọc nội dung của các thanh ghi trong LCD.
Để hiển thị các chữ cái và các con số, chúng ta gửi các mã ASCII của các chữ cái từ A đến Z, a đến f và các con số từ 0 - 9,... đến các chân này khi bật RS = 1.
Cũng có các mã lệnh mà có thể được gửi đến LCD để xoá màn hình hoặc đưa con trỏ về đầu dòng hoặc nhấp nháy con trỏ.Dưới đây là bảng liệt kê các mã lệnh:
(Phải qua lần post khác vì số ảnh vượt quá 4..... )

Tìm hiểu về LCD (ct)

Chúng ta cũng sử dụng RS = 0 để kiểm tra bít cờ bận để xem LCD có sẵn sàng nhận thông tin chưa. Cờ bận là D7 và có thể được đọc khi R/W = 1 và RS = 0 như sau:


Nếu R/W = 1, RS = 0 khi D7 = 1 (cờ bận 1) thì LCD bận bởi các công việc bên trong và sẽ không nhận bất kỳ thông tin mới nào. Khi D7 = 0 thì LCD sẵn sàng nhận thông tin mới. Lưu ý chúng ta nên kiểm tra cờ bận trước khi ghi bất kỳ dữ liệu nào lên LCD.
Có thể di chuyển con trỏ đến vị trí bất kì trên màn hình LCD bằng cách nạp vào các giá trị tương ứng như bảng sau và gởi yêu cầu đến LCD:

Tham khảo thêm về LCD tại đây: http://www.iaehv.nl/users/pouweha/lcd.htm

Có hai cách lập trình cho LCD: dùng 8bit interface (đơn giản) hoặc 4bit interface (phức tạp hơn)
7.1. 8bit interface

Code:


/*Để LCD thực thi các lệnh điều khiển:*/
RS = 0; //chọn thanh ghi lệnh

R/W = 0; //ghi dữ liệu, R/W = 1;//đọc dữ liệu

E= 1; //đưa chân E lên mức cao

E= 0; //tạo sườn xuống để chốt dữ liệu


/*Để LCD thực thi các lệnh hiển thị:*/
RS = 1; //chọn thanh ghi dữ liệu

R/W = 0; //ghi dữ liệu

E = 1; //đưa chân E lên mức cao

E = 0; //tạo sườn xuống để chốt dữ liệu

Sử dụng 8 chân D0 - D7 để truyền thông tin, dữ liệu đến LCD.
- Để điều khiển LCD (Chọn chế độ LCD, bật/tắt hiển thị, bật/tắt/nhấp nháy/di chuyển con trỏ,...): Nhập giá trị tương ứng vào D0-D7 rồi gởi lệnh yêu cầu LCD thực thi lệnh điều khiển, tiếp theo cho LCD thời gian trễ để thực thi (hoặc hỏi cờ bận xem LCD sẵn sàng thực hiện lệnh tiếp theo chưa?)
- Để hiển thị dữ liệu lên LCD:Nhập dữ liệu cần hiển thị vào D0-D7 rồi gởi lệnh yêu cầu LCD thực thi lệnh hiển thị dữ liệu, tiếp theo cho LCD thời gian trễ để thực thi (hoặc hỏi cờ bận xem LCD sẵn sàng thực hiện lệnh tiếp theo chưa?)
Đây là mạch nguyên lý kết nối LCD dùng 8 chân interface với PIC16F877A qua PORTB:

7.2. 4bit interface
Sử dụng 4 chân D4 - D7 (hoặc D0-D3 <- ít dùng) để truyền thông tin, dữ liệu đến LCD.
- Để điều khiển LCD (Chọn chế độ LCD, bật/tắt hiển thị, bật/tắt/nhấp nháy/di chuyển con trỏ,...): Nhập giá trị tương ứng vào D0-D7,lấy giá trị 4bit cao D4-D7 rồi gởi lệnh yêu cầu LCD thực thi lệnh điều khiển, tiếp theo cho LCD thời gian trễ để thực thi (hoặc hỏi cờ bận xem LCD sẵn sàng thực hiện lệnh tiếp theo chưa?).Tiếp tục, gởi 4bit thấp D0-D3 rồi gởi lệnh yêu cầu LCD thực thi lệnh điều khiển, tiếp theo cho LCD thời gian trễ để thực thi (hoặc hỏi cờ bận xem LCD sẵn sàng thực hiện lệnh tiếp theo chưa?)
- Để hiển thị dữ liệu lên LCD:Cũng làm tương tự trên nhưng thay yêu cầu LCD điều khiển bằng yêu cầu LCD hiển thị.
Đây là mạch nguyên lý kết nối LCD dùng 4 chân interface với PIC16F877A qua PORTB:
Nếu trong ứng dụng sử dụng ngắt ngoài thì có thể chuyển sang nối với PORTD hoặc tùy thích.

7.3. LCD_lib_4bit

#include


#define LCD_RS PIN_D2

//#define LCD_RW PIN_A1

#define LCD_EN PIN_D3
#define LCD_D4 PIN_D4

#define LCD_D5 PIN_D5

#define LCD_D6 PIN_D6

#define LCD_D7 PIN_D7


// misc display defines-

#define Line_1 0x80

#define Line_2 0xC0

#define Clear_Scr 0x01


// prototype statements

#separate void LCD_Init ( void );// ham khoi tao LCD

#separate void LCD_SetPosition ( unsigned int cX );//Thiet lap vi tri con tro

#separate void LCD_PutChar ( unsigned int cX );// Ham viet1kitu/1chuoi len LCD

#separate void LCD_PutCmd ( unsigned int cX) ;// Ham gui lenh len LCD

#separate void LCD_PulseEnable ( void );// Xung kich hoat

#separate void LCD_SetData ( unsigned int cX );// Dat du lieu len chan Data

// D/n Cong

#use standard_io (C)

#use standard_io (D)


//khoi tao LCD**********************************************

#separate void LCD_Init ( void )

{

LCD_SetData ( 0x00 );



delay_ms(200); /* wait enough time after Vdd rise >> 15ms */

output_low ( LCD_RS );// che do gui lenh

LCD_SetData ( 0x03 ); /* init with specific nibbles to start 4-bit mode */

LCD_PulseEnable();

LCD_PulseEnable();

LCD_PulseEnable();

LCD_SetData ( 0x02 ); /* set 4-bit interface */

LCD_PulseEnable(); /* send dual nibbles hereafter, MSN first */

LCD_PutCmd ( 0x2C ); /* function set (all lines, 5x7 characters) */

LCD_PutCmd ( 0x0C ); /* display ON, cursor off, no blink */

LCD_PutCmd ( 0x06 ); /* entry mode set, increment & scroll left */

LCD_PutCmd ( 0x01 ); /* clear display */

}

#separate void LCD_SetPosition ( unsigned int cX )



{

/* this subroutine works specifically for 4-bit Port A */

LCD_SetData ( swap ( cX ) | 0x08 );

LCD_PulseEnable();

LCD_SetData ( swap ( cX ) );

LCD_PulseEnable();

}

#separate void LCD_PutChar ( unsigned int cX )



{

/* this subroutine works specifically for 4-bit Port A */

output_high ( LCD_RS );

LCD_PutCmd( cX );

output_low ( LCD_RS );

}

#separate void LCD_PutCmd ( unsigned int cX )



{

/* this subroutine works specifically for 4-bit Port A */

LCD_SetData ( swap ( cX ) ); /* send high nibble */

LCD_PulseEnable();

LCD_SetData ( swap ( cX ) ); /* send low nibble */

LCD_PulseEnable();

}

#separate void LCD_PulseEnable ( void )



{

output_high ( LCD_EN );

delay_us ( 3 ); // was 10

output_low ( LCD_EN );

delay_ms ( 3 ); // was 5

}

#separate void LCD_SetData ( unsigned int cX )



{

output_bit ( LCD_D4, cX & 0x01 );

output_bit ( LCD_D5, cX & 0x02 );

output_bit ( LCD_D6, cX & 0x04 );

output_bit ( LCD_D7, cX & 0x08 );

}

7.4. LCD lib 8bits

#define LCD_RS PIN_A0

#define LCD_RW PIN_A1

#define LCD_EN PIN_A2
#define LCD_data Port_C
// misc display defines-

#define Line_1 0x80

#define Line_2 0xC0

#define Clear_Scr 0x01


// prototype statements

#separate void LCD_Init ( void );// ham khoi tao LCD

#separate void LCD_SetPosition ( unsigned int cX );//Thiet lap vi tri con tro

#separate void LCD_PutChar ( char cX );// Ham viet1kitu/1chuoi len LCD

#separate void LCD_PutCmd (int cX) ;// Ham gui lenh len LCD

#separate void LCD_PulseEnable ( void );

#separate int1 LCD_ready();
// D/n Cong
#use standard_io (C)

#use standard_io (A)

#use standard_io (B)

//khoi tao LCD**********************************************

#separate void LCD_Init ( void )

{

output_C(0x00); delay_ms(200);



LCD_Putcmd(0x38);

LCD_Putcmd(0x0F);

LCD_Putcmd(0x01);

LCD_Putcmd(0x06);

}

#separate void LCD_SetPosition (int cX )



{

}

#separate void LCD_PutChar ( char cX )



{

output_high(LCD_RS);

output_low(LCD_RW);

output_C(cX);

LCD_PulseEnable();

delay_ms(5);

}

#separate void LCD_PutCmd (int cX )//Gui lenh den LCD



{

output_low(LCD_RS);

output_low(LCD_RW);

output_C(cX);

LCD_PulseEnable();

delay_ms(5);

}

#separate int1 LCD_ready ()



{ int1 busy_flag;

trisc7 = 1;//set input

output_low(LCD_RS);

output_high(LCD_RW);

LCD_pulseEnable();

busy_flag = RC7;

return(busy_flag);

}

#separate void LCD_PulseEnable ( void )



{

output_high ( LCD_EN );

delay_us ( 3 ); // was 10

output_low ( LCD_EN );

delay_ms ( 3 ); // was 5

}

7.5. Hiển thị LCD 8bit interface

Chương trình hiển thị dòng chữ "BE YEU" trên hàng 1, bắt đầu tại cột 6, không hỏi cờ bận D7.
Do trong thân hàm comnwrt() và datawrt() đã tạo trễ 1ms cuối thân hàm nên sau khi gọi không cần tạo trễ cho LCD thực thi lệnh.

Code:


/*-------------------------------------------------------------------------

* Author : nhh

* Date : 05/04/06

* Hardware : PIC16F877A

* Compiler : CCS C 3.249

* Description : Hien thi LCD

*========================================================================*/

#include <16F877A.h>

#include

#fuses XT,NOWDT,NOPROTECT,NOLVP

#use delay(clock=4000000)

#define RS RD0

#define RW RD1

#define E RD2

#define LCD PORTB
/*Ham yeu cau goi lenh dieu khien LCD*/

void comnwrt(void)

{

RS = 0;


RW = 0;

E = 1;


E = 0;

delay_ms(1);

}

/*Ham yeu cau goi du lieu hien thi len LCD*/



void datawrt(void)

{

RS = 1;



RW = 0;

E = 1;


E = 0;

delay_ms(1);

}

/*Ham main*/



void main(void)

{

set_tris_B(0);



set_tris_D(0);

delay_ms(100); // Tao tre 100ms cho LCD khoi dong


LCD = 0x38; // Hai hang, ma tran dot 5*7, 8 bit interface

comnwrt();

LCD = 0x0C; // Bat hien thi, tat con tro

comnwrt();


LCD = 0x85; // Vi tri hang 1,cot 6

comnwrt();


LCD = 'B'; // Xuat dong chu "BE YEU" ra LCD

datawrt();

LCD = 'E';

datawrt();

LCD = ' ';

datawrt();

LCD = 'Y';

datawrt();

LCD = 'E';

datawrt();

LCD = 'U';

datawrt();

LCD = '!';

datawrt();

}

//======================= Register Definitions ========================



//-----Register Files------------------------------------------------------

#byte PORTA = 0x05

#byte PORTB = 0x06

#byte PORTC = 0x07

#byte PORTD = 0x08

#byte PORTE = 0x09


#byte EEDATA = 0x10C

#byte EEADR = 0x10D

#byte EEDATH = 0x10E

#byte EEADRH = 0x10F


#byte EECON1 = 0x18C

#byte EECON2 = 0x18D


#byte PR2 = 0x92
#bit RA4 = 0x05.4

#bit RA3 = 0x05.3

#bit RA2 = 0x05.2

#bit RA1 = 0x05.1

#bit RA0 = 0x05.0
#bit RB7 = 0x06.7

#bit RB6 = 0x06.6

#bit RB5 = 0x06.5

#bit RB4 = 0x06.4

#bit RB3 = 0x06.3

#bit RB2 = 0x06.2

#bit RB1 = 0x06.1

#bit RB0 = 0x06.0


#bit RC7 = 0x07.7

#bit RC6 = 0x07.6

#bit RC5 = 0x07.5

#bit RC4 = 0x07.4

#bit RC3 = 0x07.3

#bit RC2 = 0x07.2

#bit RC1 = 0x07.1

#bit RC0 = 0x07.0


#bit RD7 = 0x08.7

#bit RD6 = 0x08.6

#bit RD5 = 0x08.5

#bit RD4 = 0x08.4

#bit RD3 = 0x08.3

#bit RD2 = 0x08.2

#bit RD1 = 0x08.1

#bit RD0 = 0x08.0


#bit RE2 = 0x09.2

#bit RE1 = 0x09.1

#bit RE0 = 0x09.0
//----- INTCON -------------------------------------------------------------
#bit GIE = 0x0b.7

#bit PEIE = 0x0b.6

#bit TMR0IE = 0x0b.5

#bit INTE = 0x0b.4

#bit RBIE = 0x0b.3

#bit TMR0IF = 0x0b.2

#bit INTF = 0x0b.1

#bit RBIF = 0x0b.0


//----- PIR1 ---------------------------------------------------------------
#bit PSPIF = 0x0c.7

#bit ADIF = 0x0c.6

#bit RCIF = 0x0c.5

#bit TXIF = 0x0c.4

#bit SSPIF = 0x0c.3

#bit CCP1IF = 0x0c.2

#bit TMR2IF = 0x0c.1

#bit TMR1IF = 0x0c.0


//----- PIR2 ---------------------------------------------------------------
#bit CMIF = 0x0d.6

#bit EEIF = 0x0d.4

#bit BCLIF = 0x0d.3

#bit CCP2IF = 0x0d.0


//----- PIE1 ---------------------------------------------------------------
#bit PSPIE = 0x8c.7

#bit ADIE = 0x8c.6

#bit RCIE = 0x8c.5

#bit TXIE = 0x8c.4

#bit SSPIE = 0x8c.3

#bit CCP1IE = 0x8c.2

#bit TMR2IE = 0x8c.1

#bit TMR1IE = 0x8c.0


//----- PIE2 ---------------------------------------------------------------
#bit CMIE = 0x8d.6

#bit EEIE = 0x8d.4

#bit BCLIE = 0x8d.3

#bit CCP2IE = 0x8d.0



-Thêm một ví dụ khác, chương trình hiển thị dòng "HELLO PICVIETNAM!".

code


/*-------------------------------------------------------------------------

* Author : nhh

* Date : 05/04/06

* Hardware : PIC16F877A

* Compiler : CCS C 3.249

* Description : Hien thi LCD

*========================================================================*/

#include <16F877A.h>

#include

#fuses XT,NOWDT,NOPROTECT,NOLVP

#use delay(clock=4000000)

#define RS RD0

#define RW RD1

#define E RD2

#define LCD PORTB
const unsigned char key[]="HELLOPICVIETNAM!";

int i = 0;


/*Ham yeu cau goi lenh dieu khien LCD*/

void comnwrt(void)

{

RS = 0;


RW = 0;

E = 1;


E = 0;

delay_ms(1);

}

/*Ham yeu cau goi du lieu hien thi len LCD*/



void datawrt(void)

{

RS = 1;



RW = 0;

E = 1;


E = 0;

delay_ms(1);

}

/*Ham main*/



void main(void)

{

set_tris_B(0);



set_tris_D(0);

delay_ms(100); // Tao tre 100ms cho LCD khoi dong


LCD = 0x38; // Hai hang, ma tran dot 5*7, 8 bit interface

comnwrt();

LCD = 0x0C; // Bat hien thi, tat con tro

comnwrt();

LCD = 0x86; // Vi tri hang 1,cot 7

comnwrt();

while(true)

{

LCD = key[i];



datawrt();

delay_ms(100);

i++;

if(i==5) // Hien thi xong HELLO



{

LCD = 0xC3; // Vi tri hang 2,cot 4

comnwrt();

delay_ms(100);

}

if(i==16) // Hien thi xong PICVIETNAM!



{

delay_ms(1100);

LCD = 0x01; // Xoa man hinh hien thi

comnwrt();

delay_ms(500);

LCD = 0x86; // Vi tri hang 1,cot 7

comnwrt();

i = 0;


}

}

}



7.6. Hiển thị LCD 4bit interface

Cái này trong thư viện của CCS C đã có file lcd.c trong thư mục Drivers rất là hay rồi, nên không cần viết lại làm gì.File này rất hay,nhưng chỉ dùng cho LCD 2 line.Các bác tự nghiên cíu nhé!


Chương trình hiển thị chữ "HI!" bắt đầu tại hàng 1, cột 7.Dùng LCD 4bit interface và thư viện lcd.c của CCS C

Code:


/*-------------------------------------------------------------------------

* Author : nhh

* Date : 05/14/06

* Hardware : PIC16F877A

* Compiler : CCS C 3.249

* Description : Hien thi LCD

*========================================================================*/

#include <16F877A.h>

#include

#fuses XT,NOWDT,NOPROTECT,NOLVP

#use delay(clock=4000000)

#define use_portb_lcd TRUE

#include
void main(void)

{

delay_ms(100); // tao tre 100ms cho LCD khoi dong



lcd_init();

lcd_gotoxy(7,1); // vi tri (x,y)=(7,1)= hang 1, cot 7

lcd_putc('H');

lcd_putc('I');

lcd_putc('!');

}

7.7. LCD_8bit interface, có kiểm tra cờ bận.

Bài cuối về LCD. Hoạt động theo 8bit interface, có hỏi cờ bận đảm bảo LCD luôn thực thi đúng lệnh yêu cầu ! Chú ý việc hỏi cờ bận là hết sức cần thiết!
Một điều nữa là Protues mô phỏng cho LCD hơi cà thoạt, nên dùng Picsimulator.Tốt nhất kiếm 1 chú LCD làm cho xom!
Chương trình hiển thị dòng chữ "WONDERFUL PICVIETNAM!",tham khảo source code của CCS C.

Code:


/*-------------------------------------------------------------------------* Author : nhh

* Date : 05/04/06

* Hardware : PIC16F877A

* Compiler : CCS C 3.249

* Description : Hien thi LCD

*========================================================================*/

#include <16F877A.h>

#include

#fuses XT,NOWDT,NOPROTECT,NOLVP

#use delay(clock=4000000)

#define E RD2

#define RS RD0

#define RW RD1

#byte lcd_data = 0x06 // Dia chi PORTB


/* Khai bao nguyen mau cac ham su dung */

byte lcd_read_byte();

void lcd_send_byte( byte address, byte n );

void lcd_init();

void lcd_gotoxy( byte x, byte y);

void lcd_putc( char c);

void lcd_refresh();
/* Doc mot byte tu LCD */

byte lcd_read_byte()

{

byte read_byte;



set_tris_B(0xFF); // PORTB = input

RW = 1;


delay_cycles(1);

E = 1;


delay_cycles(1);

read_byte = lcd_data;

E = 0;

set_tris_B(0x00); // PORTB = output



return(read_byte);

}
/* Goi 1byte den LCD */

void lcd_send_byte( byte address, byte n )

{

RS = 0;



while ( bit_test(lcd_read_byte(),7) ) ;

RS = address;

delay_cycles(1);

RW = 0;


delay_cycles(1);

E = 0;


lcd_data = n;

delay_cycles(1);

E = 1;

delay_us(2);



E = 0;

}

/* Khoi tao ban dau cho LCD */



void lcd_init()

{

byte const lcd_init_string[4] = {0x38, 0x0C, 1 , 6};



byte i;

set_tris_B(0x00);

RS = 0;

RW = 0;


E = 0;

delay_ms(15);

for(i=1;i<=3;++i)

{

lcd_data = 3;



delay_cycles(1);

E = 1;


delay_us(2);

E = 0;


delay_ms(5);

}

lcd_data = 2;



delay_cycles(1);

E = 1;


delay_us(2);

E = 0;


delay_ms(5);

for(i=0;i<=3;++i)

{

lcd_send_byte(0,lcd_init_string[i]);



}

}
/* Nhay den vi tri (x,y) tren LCD,nhay nham y se bao loi */

void lcd_gotoxy( byte x, byte y)

{

byte address;



switch(y)

{

case 1: address=0;



address+=x-1;

lcd_send_byte(0,0x80|address);

break;

case 2: address=0x40;



address+=x-1;

lcd_send_byte(0,0x80|address);

break;

default :lcd_init();



lcd_putc("ERROR Y POSITION");

while(true); // Dung tai day!

}

}

/* Hien thi ki tu hoac chuoi ra LCD */



void lcd_putc( char c)

{

lcd_send_byte(1,c);



}

/* Hien thi ki tu hoac chuoi ra LCD */

void lcd_refresh()

{

lcd_send_byte(0,1);



lcd_send_byte(0,6);

}

/* Ham main */



void main (void)

{

set_tris_B(0); //PORTB = output



set_tris_D(0); //PORTD = output
lcd_init();
lcd_gotoxy(5,1);

lcd_putc("WONDERFUL");


lcd_gotoxy(4,2);

lcd_putc("PICVIETNAM!");

}

Nên gom các hàm trên thành 1 file lcd_8bit.c chẳng hạn, đến khi sử dụng chỉ việc include nó vào cho khỏe...



Bài viết này em sử dụng Lcd 2 hàng để hiển thị giá trị anlog đưa vào ở kênh A và dưa ra các cổng nối tiếp, thời gian để thay dổi giá trị ADC là 1s. (trong ccs chỉ hổ trợ Lcd 2 hàng nhưng basic lại rất hổ trợ rất nhiều LCD, mình muốn viết điều khiển LCD bằng Basic, nhưng lại muốn nhúng nó vào trong ccs phải làm sao mong các bác chỉ giúp)

7.8. LCD and Keypad drive



CODE:

a. Delay

/*

* Delay functions



* See delay.h for details

*

* Make sure this code is compiled with full optimization!!!



*/

#include "delay.h"


void

DelayMs(unsigned char cnt)

{

#if XTAL_FREQ <= 2MHZ



do {

DelayUs(996);

} while(--cnt);

#endif
#if XTAL_FREQ >16MHZ

unsigned char i;

do {


i = 100;

do {


DelayUs(10);

} while(--i);

} while(--cnt);

#else


#if XTAL_FREQ > 2MHZ

unsigned char i;

do {

i = 4;


do {

DelayUs(250);

} while(--i);

} while(--cnt);

#endif

#endif


}

b. lcd

/*

* LCD interface example



* Uses routines from delay.c

* This code will interface to a standard LCD controller

* like the Hitachi HD44780. It uses it in 4 bit mode, with

* the hardware connected as follows (the standard 14 pin

* LCD connector is used):

*

* PORTB bits 0-3 are connected to the LCD data bits 4-7 (high nibble)



* PORTA bit 4 is connected to the LCD RS input (register select)

* PORTA bit 5 is connected to the LCD EN bit (enable)

*

* To use these routines, set up the port I/O (TRISA, TRISB) then



* call lcd_init(), then other routines as required.

*

*/



static bit LCD_RS @ ((unsigned)&PORTA*8+4); // Register select

static bit LCD_EN @ ((unsigned)&PORTA*8+5); // Enable


#define LCD_STROBE ((LCD_EN = 1),(LCD_EN=0))
/* write a byte to the LCD in 4 bit mode */
void

lcd_write(unsigned char c)

{

PORTB = c >> 4;



LCD_STROBE;

PORTB = c;

LCD_STROBE;

DelayUs(40);

}

/*

* Clear and home the LCD



*/

void


lcd_clear(void)

{

LCD_RS = 0;



lcd_write(0x1);

DelayMs(2);

}

/* write a string of chars to the LCD */


void

lcd_puts(const char * s)

{

LCD_RS = 1; // write characters



while(*s)

lcd_write(*s++);

}

/*

* Go to the specified position



*/

void


lcd_goto(unsigned char pos)

{

LCD_RS = 0;



lcd_write(0x80+pos);

}

/* initialise the LCD - put into 4 bit mode */


void

lcd_init(void)

{

LCD_RS = 0; // write control bytes



DelayMs(15); // power on delay

PORTB = 0x3; // attention!

LCD_STROBE;

DelayMs(5);

LCD_STROBE;

DelayUs(100);

LCD_STROBE;

DelayMs(5);

PORTB = 0x2; // set 4 bit mode

LCD_STROBE;

DelayUs(40);

lcd_write(0x28); // 4 bit mode, 1/16 duty, 5x8 font

lcd_write(0x08); // display off

lcd_write(0x0F); // display on, blink curson on

lcd_write(0x06); // entry mode

}



tải về 1.15 Mb.

Chia sẻ với bạn bè của bạn:
1   2   3   4   5   6   7   8   9   ...   15




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương