PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Ðề tài đã khoá
 
Ðiều Chỉnh Xếp Bài
Old 25-04-2007, 04:32 PM   #1
Lattice
Nhập môn đệ tử
 
Tham gia ngày: Apr 2007
Bài gửi: 1
:
Trích:
Nguyên văn bởi ncv View Post
Chương trình gửi ký tự ra 2x16 LCD dùng CCS C

#include "16F877A.h" // PIC16F877A header file
#use delay(clock=4000000) // for 4Mhz crystal
#fuses XT, NOWDT, NOPROTECT, NOLVP // for debug mode

#define WRITE_DATA 0
#define WRITE_COMMAND 1

#define NCHAR_PER_LINE 16 // max char numbers per line
#define MS10 10 // 10 milliseconds
#define US400 400 // 400 microseconds

#define LCD_RS PIN_A1
#define LCD_RW PIN_A2
#define LCD_E PIN_A3

///////////////////////////////////////////////////////////
//
/* private */ void lcd_write(byte dat, int1 option) {
delay_us(US400);
if (option == WRITE_DATA)
output_high(LCD_RS);
else // option == WRITE_COMMAND
output_low(LCD_RS);
output_low(LCD_RW);
output_b(dat);

output_high(LCD_E);
delay_us(US400);
output_low(LCD_E);
}

///////////////////////////////////////////////////////////
//
void lcd_init(void) {
output_low(LCD_E); // Let LCD E line low

lcd_write(0x38, WRITE_COMMAND); // Set LCD 16x2, 5x7, 8bits data
delay_ms(15);
lcd_write(0x01, WRITE_COMMAND); // Clear LCD display
delay_ms(MS10);
lcd_write(0x0f, WRITE_COMMAND); // Open display & current
delay_ms(MS10);
lcd_write(0x06, WRITE_COMMAND); // Window fixed (Character Entry Mode?)
delay_ms(MS10);
}

///////////////////////////////////////////////////////////
//
void lcd_display_char(int8 line, int8 pos, char ch) {
line = (line == 0) ? 0 : 1;
pos = (pos > NCHAR_PER_LINE) ? NCHAR_PER_LINE : pos;

lcd_write(0x80 + 0x40 * line + pos, WRITE_COMMAND);
lcd_write(ch, WRITE_DATA);
}

///////////////////////////////////////////////////////////
void lcd_display_str(int8 line, char str[], int8 nchars) {
int8 i;
for (i = 0; i < nchars; i++)
lcd_display_char(line, i, str[i]);
}

///////////////////////////////////////////////////////////
/**
* Display characters to a 2x16 LCD
*
* (1) LCD1 to GND
* (2) LCD2 to VDD 5 volts
* (3) LCD4 (RS) - LCD5 (RW) - LCD6 (E) to A1, A2, A3
* (4) LCD7-LCD14 to B0-B7 (bus data)
*
* Ref: http://pic16.com/bbs/dispbbs.asp?boa...ID=5879&page=1
*/
void main(void) {
int8 i;
char LINE1[] = { "SGN Tech" };
char LINE2[] = { "Xin chao" };

lcd_init();

// use of lcd_display_char()
for (i = 0; i < 8; i++)
lcd_display_char(0, i, LINE1[i]);

// use of lcd_display_str
lcd_display_str(1, LINE2, 8);
}
Bạn có cách nào khai báo LINE1,LINE2 thành một biến không nhỉ, kiểu thế này, mình thử mà không được:
char LINE[] = { "SGN Tech" ,"Xin chao" };
for (i = 0; i < 8; i++)
lcd_display_char(0, i, LINE[i]);
for (i = 9; i < 16; i++)
lcd_display_char(1, i-8, LINE[i]);
À, bạn có bài nào trong C sử dụng kỹ thuật bảng giống bài trong MPLAB của bác Falleaf không, mình khai báo nhiều hằng kiểu char quá nên RAM tốn kinh khủng.
Lattice vẫn chưa có mặt trong diễn đàn  
Old 25-04-2007, 07:27 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi Lattice View Post
Bạn có cách nào khai báo LINE1,LINE2 thành một biến không nhỉ, kiểu thế này, mình thử mà không được:
char LINE[] = { "SGN Tech" ,"Xin chao" };
for (i = 0; i < 8; i++)
lcd_display_char(0, i, LINE[i]);
for (i = 9; i < 16; i++)
lcd_display_char(1, i-8, LINE[i]);
À, bạn có bài nào trong C sử dụng kỹ thuật bảng giống bài trong MPLAB của bác Falleaf không, mình khai báo nhiều hằng kiểu char quá nên RAM tốn kinh khủng.
Thử thế này xem:
Code:
char LINE[] = {"SGN TechXin chao"};
Để dùng Flash thay vì dùng RAM như trên, bạn thêm từ khóa const vào khai báo:
Code:
char const LINE[] = {"SGN TechXin chao"};
Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn  
Old 08-05-2006, 05:36 PM   #3
NTVinh
Đệ tử 2 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 32
:
Chương trình ví dụ sau mô tả cách dùng PWM do CCS cung cấp.
PWM là gì? sử dụng nó vào mục đích gì?
1) PWM là gì? PWM là một bộ điều chế độ rộng xung. Có hai thông số (tạm gọi đơn giản như vậy, và có lẽ cũng chỉ quan tâm đến hai thông số này với PWM) quan trọng của PWM là chu kỳ xung T và thời gian t1 của mức logic 0,
trong ví dụ này thì t1 tương ứng với value. Để "điều chế độ rộng xung" thì chúng ta sẽ giữ nguyên T và thay đổi t1, theo yêu cầu của bài toán cụ thể.
Value trong ví dụ sau lấy được từ đầu vào anlaog, chu kỳ (hay tần số) của xung được chọn lựa từ PC thông qua cổng truyền thông nối tiếp RS232.
2) PWM dùng vào mục đích gì? Có nhiều ứng dụng cho nó, ví dụ truyền thông, điều khiển các van bán dẫn trong các biến tần, làm bộ nguồn chuyển mạch,...ôi nhiều lắm!
Bắt đầu viết nhé:

#if defined(__PCM__)
#include <16F877.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BRGH1OK)

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=10000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BRGH1OK)
#endif


void main() {
char selection=1;
int8 value;



printf("\r\nFrequency:\r\n");
printf(" 1) 7.8 khz\r\n");
printf(" 2) 19.5 khz\r\n");
printf(" 3) 0.48 khz\r\n");
do {
selection=getc();
}while((selection<'1')||(selection>'3'));


setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM

// The cycle time will be (1/clock)*4*t2div*(period+1)
// In this program clock=4000000 and period=127 (below)
// For the three possible selections the cycle time is:
// (1/4000000)*4*1*128 = 12.8 us or 7.8 khz
// (1/4000000)*4*4*128 = 51.2 us or 19.5 khz
// (1/4000000)*4*16*128= 204.8 us or 0.48 khz
switch(selection) {
case '1' : setup_timer_2(T2_DIV_BY_1, 127, 1);
break;
case '2' : setup_timer_2(T2_DIV_BY_4, 127, 1);
break;
case '3' : setup_timer_2(T2_DIV_BY_16, 127, 1);
break;
}



setup_port_a(ALL_ANALOG);
setup_adc(adc_clock_internal);
set_adc_channel( 0 );
printf("%c\r\n",selection);

while( TRUE ) {
value=read_adc();
//value++;
printf("%2X\r",value);
set_pwm1_duty(value); //value may be an 8 or 16 bit constant or variable
// This sets the time the pulse is
// high each cycle. We use the A/D
// input to make a easy demo.
// the high time will be:
// if value is LONG INT:
// value*(1/clock)*t2div
// if value is INT:
// value*4*(1/clock)*t2div
// for example a value of 30 and t2div
// of 1 the high time is 30us
// WARNING: A value too high or low will
// prevent the output from
// changing.
}

}
Nguyen The Vinh.
NTVinh vẫn chưa có mặt trong diễn đàn  
Old 09-05-2006, 09:18 PM   #4
ncv
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 16
:
Chương trình hiển thị phím số ra đèn 7 đoạn (không dùng interrupt)

Code:
Chương trình hiển thị phím số trên ma trận phím 4x3 ra đèn 7 đoạn (không dùng interrupt)

#include <16F877A.h>
#fuses NOWDT, XT
#fuses NOLVP // important
#use delay(clock=4000000)

#include <kbd.c> // in PICC\Drivers

// 0 1 2 3 4 5 6 7 8 9
byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };

///////////////////////////////////////////////////////////
/* private */void off_on_led_transistor() {
output_low(PIN_D1);
delay_ms(1);
output_high(PIN_D1);
}

///////////////////////////////////////////////////////////
void display(int8 digit) {
output_c(DIGITS[digit] ^ 0xff);
off_on_led_transistor();
}

///////////////////////////////////////////////////////////
int8 char_to_digit(char c) {
return c & 0b00001111; // first 4 bits only
}

///////////////////////////////////////////////////////////
int1 digit_key_pressed(char key) {
byte pattern;
pattern = 0b00110000;
return (key & pattern) == pattern;
}

///////////////////////////////////////////////////////////
/**
* Echo digit-key presses (0 to 9) of a 4x3 keypad to the 7-segment LED
*
* Configuration:
* Use PORTB for keypad by uncommenting the following line in PICC\Drivers\KBDD.c
* #define use_portb_kbd TRUE
*
* Wiring: (TM Board)
* (1) PIC's B1-B7 to Matrix Keypad's R3-R0&C2-C0 (notice the reverse order)
* (2) PIC's C0-C6 to 7-segment LED's A-G
* PIC's D1 to 7-segment LED's C2
*/
void main() {
int8 i, digit;
char key;

kbd_init();
while (true) {
key = kbd_getc();
if (digit_key_pressed(key)) {
digit = char_to_digit(key);
for (i = 0; i < 200; i++) // repeat the display for human eyes
display(digit);
}
}
}

thay đổi nội dung bởi: falleaf, 12-05-2006 lúc 09:01 PM.
ncv vẫn chưa có mặt trong diễn đàn  
Old 12-05-2006, 05:24 PM   #5
ncv
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 16
:
Chương trình hiển thị phím số ra đèn 7 đoạn (DÙNG INTERRUPT)

Chương trình hiển thị phím số trên bàn phím 4x3 ra đèn 7 đoạn (DÙNG INTERRUPT).

#include <16F877A.h>
#fuses NOWDT, XT
#fuses NOLVP // important
#use delay(clock=4000000)

#include <kbd.c> // in PICC\Drivers

// 0 1 2 3 4 5 6 7 8 9
byte const DIGITS[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };

///////////////////////////////////////////////////////////
/* private */void off_on_led_transistor() {
output_low(PIN_D1);
delay_ms(1);
output_high(PIN_D1);
}

///////////////////////////////////////////////////////////
void display(int8 digit) {
output_c(DIGITS[digit] ^ 0xff);
off_on_led_transistor();
}

///////////////////////////////////////////////////////////
int8 char_to_digit(char c) {
return c & 0b00001111; // first 4 bits only
}

///////////////////////////////////////////////////////////
int1 digit_key_pressed(char key) {
byte pattern;
pattern = 0b00110000;
return (key & pattern) == pattern;
}

///////////////////////////////////////////////////////////
#INT_RB
void RB_handler() {
int8 i, digit;
char key;

key = kbd_getc();
if (digit_key_pressed(key)) {
digit = char_to_digit(key);
for (i = 0; i < 200; i++) // repeat the display for human eyes
display(digit);
}
}
///////////////////////////////////////////////////////////
/**
* Echo digit-key presses (0 to 9) of a 4x3 keypad to the 7-segment LED
*
* Configuration:
* Use PORTB for keypad by uncommenting the following line in PICC\Drivers\KBDD.c
* #define use_portb_kbd TRUE
*
* Wiring: (TM Board)
* (1) PIC's B1-B7 to Matrix Keypad's R3-R0&C2-C0 (notice the reverse order)
* (2) PIC's C0-C6 to 7-segment LED's A-G
* PIC's D1 to 7-segment LED's C2
*/
void main() {
enable_interrupts(GLOBAL);
enable_interrupts(INT_RB);
kbd_init();
while (true) {
// do nothing
}
}
ncv vẫn chưa có mặt trong diễn đàn  
Old 12-05-2006, 09:04 PM   #6
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Bạn nhớ sử dụng thẻ [CODE] để viết các đoạn mã lệnh trong đó nhé, vì các bài viết mã lệnh nhiều khi cần thụt ra thụt vào nhìn cho nó dễ coi, nếu bạn không đặt cái thẻ này vào thì sẽ rất khó nhìn vì nó thẳng tuột.

Ngoài ra, nếu được, mong bạn khi viết chú thích thêm bằng tiếng Việt.

Chúc vui.
falleaf vẫn chưa có mặt trong diễn đàn  
Old 04-03-2007, 08:55 AM   #7
khangcodt
Đệ tử 2 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 27
:
Red face Kbd

Trích:
Nguyên văn bởi ncv View Post
Chương trình hiển thị phím số trên bàn phím 4x3 ra đèn 7 đoạn (DÙNG INTERRUPT).

#include <16F877A.h>
#fuses NOWDT, XT
#fuses NOLVP // important
#use delay(clock=4000000)

#include <kbd.c> // in PICC\Drivers
Nhờ bác NCV chỉ giáo.
Có lẽ tại công lực của em còn non kém nên em đọc cái driver này mãi mà chẳng hiểu nó là cái gì, dùng vào đâu, tác dụng ra sao...???
Mong bác rọi đèn pin khai sáng cho em với.
Cảm ơn bác rất nhiều...nhiều!!!
khangcodt vẫn chưa có mặt trong diễn đàn  
Old 03-06-2006, 07:10 PM   #8
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Tìm hiểu về LCD

LCD được tìm hiểu ở đây là HD44780 của hãng Hitachi, gồm 2 dòng, mỗi dòng 16 kí tự.


HD44780 có 14 chân, chức năng của các chân:

1.Các chân VCC, VSSVEE: Chân VCC_Cấp dương nguồn 5V, chân VCC_Nối đất, chân VEE được dùng để điều khiển độ tương phản của màn hình LCD.

2.Chân chọn thanh ghi RS (Register Select):
Có hai thanh ghi rất quan trọng bên trong LCD, chân RS được dùng để chọn các thanh ghi này như sau: Nếu RS = 0 thì thanh ghi mà lệnh được chọn để cho phép người dùng gửi một lệnh chẳng hạn như xoá màn hình, đưa con trỏ về đầu dòng,… Nếu RS = 1 thì thanh ghi dữ liệu được chọn cho phép người dùng gửi dữ liệu cần hiển thị trên LCD.

3.Chân đọc/ghi R/W:
Đầu vào đọc/ghi cho phép người dùng ghi thông tin lên LCD khi R/W = 0 hoặc đọc thông tin từ nó khi R/W = 1.

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

thay đổi nội dung bởi: nhh, 07-07-2007 lúc 10:25 AM. Lý do: freewebtown.com bị ngủm
nhh vẫn chưa có mặt trong diễn đàn  
Old 03-06-2006, 07:13 PM   #9
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
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

thay đổi nội dung bởi: nhh, 07-07-2007 lúc 10:33 AM. Lý do: freewebtown.com bị ngủm
nhh vẫn chưa có mặt trong diễn đàn  
Old 03-06-2006, 07:17 PM   #10
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Lập trình cho LCD

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)

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:


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.
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn  
Old 04-03-2007, 09:29 AM   #11
khangcodt
Đệ tử 2 túi
 
Tham gia ngày: Nov 2006
Bài gửi: 27
:
Question Dùng LCD và ngắt

Trích:
Nguyên văn bởi nhh View Post
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)

1.8bit interface

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

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.
Hôm nay rãnh rỗi Pót hơi nhiều...!!!

Trước hết xin lỗi bác NHH vì cắt dán bài của bác.
Sau đó cảm ơn bác vì em tin bác sẽ trả lời cho em bài này....(Hì hì...!!!)

Nếu sài LCD (theo kiểu gì cũng vậy) thì đều mất toi PortB, hay chính xác hơn là mất hết ngắt ngoài trên PortB. (Nếu sử dụng PIC ít chân thì hết ngắt ngoài...Phí quá!!!). May mà bác có nhắc đến điều này ở cuối bài.
Bác thương thì thương cho chót, bác bày luôn cho anh em cách sử dụng LCD trên các port khác, chẳng hạn portA (kết hợp B1-B3 của portB), portC,D...
Nội lực của em còn đuối, mặc dù đã thử tìm hiểu cấu hình kết nối với LCD trong driver 'LCD.c' nhưng "em chẳng biết, em chẳng thấy...Ở bên người ấy..."

Mong bác chỉ giáo giúp.
Thanks. Thanks. Thanks... And only know to say "thanks"!!!
khangcodt vẫn chưa có mặt trong diễn đàn  
Old 05-03-2007, 08:11 PM   #12
vdt
Đệ tử 1 túi
 
Tham gia ngày: Sep 2005
Bài gửi: 15
:
Trích:
Nguyên văn bởi khangcodt View Post
Hôm nay rãnh rỗi Pót hơi nhiều...!!!

Trước hết xin lỗi bác NHH vì cắt dán bài của bác.
Sau đó cảm ơn bác vì em tin bác sẽ trả lời cho em bài này....(Hì hì...!!!)

Nếu sài LCD (theo kiểu gì cũng vậy) thì đều mất toi PortB, hay chính xác hơn là mất hết ngắt ngoài trên PortB. (Nếu sử dụng PIC ít chân thì hết ngắt ngoài...Phí quá!!!). May mà bác có nhắc đến điều này ở cuối bài.
Bác thương thì thương cho chót, bác bày luôn cho anh em cách sử dụng LCD trên các port khác, chẳng hạn portA (kết hợp B1-B3 của portB), portC,D...
Nội lực của em còn đuối, mặc dù đã thử tìm hiểu cấu hình kết nối với LCD trong driver 'LCD.c' nhưng "em chẳng biết, em chẳng thấy...Ở bên người ấy..."

Mong bác chỉ giáo giúp.
Thanks. Thanks. Thanks... And only know to say "thanks"!!!
Đúng như NHH đã nói, k0 ai làm như bạn đâu. Nếu bạn định dùng Port nào để đ/k LCD thì bạn nên sử dụng nguyên Port đó nhé, như vậy vừa dễ lập trình, vừa dễ trong khi làm mạch, lại dễ dàng hơn trong việc kiểm soát lỗi nữa, tóm lại là nó thực tế hơn bạn ạ.
Còn việc thay vì sử dụng Port B, ta đổi sang dùng port khác thì quá dễ đúng không bạn, chắc không cần phải nói ra ở đây nhé. Bạn nên dung luôn các driver của CCS C cho dễ (ví dụ LCD420.c), sau đó có thể sửa đi đôi chút cho phù hợp với nhu cầu thực tế của bạn, ví dụ như bạn có thể tận dụng chân thiết lập chế độ đọc dữ liệu từ LCD xuống pic (vì k0 có nhu cầu đọc từ LCD xuống PIC) để làm việc khác.
Chúc bạn thành công
vdt vẫn chưa có mặt trong diễn đàn  
Old 03-06-2006, 07:20 PM   #13
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
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 <DEFS_16F877A.h>
#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();
}
Hình Kèm Theo
File Type: bmp LCD_FIRST.bmp (124.5 KB, 1040 lần tải)
File Kèm Theo
File Type: rar lcd_first.rar (16.5 KB, 1627 lần tải)
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn  
Old 03-06-2006, 07:22 PM   #14
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
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 <DEFS_16F877A.h>
#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;
         }
   }
}
Hình Kèm Theo
File Type: bmp LCD_PVN.bmp (124.5 KB, 727 lần tải)
File Kèm Theo
File Type: rar lcd_pvn.rar (16.9 KB, 1426 lần tải)

thay đổi nội dung bởi: nhh, 07-07-2007 lúc 10:35 AM. Lý do: Update
nhh vẫn chưa có mặt trong diễn đàn  
Old 03-06-2006, 07:24 PM   #15
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
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 <DEFS_16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>

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('!');
}
Hình Kèm Theo
File Type: bmp LCD_PVN.bmp (124.5 KB, 900 lần tải)
File Kèm Theo
File Type: rar lcd_pvn.rar (16.9 KB, 1601 lần tải)
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn  
Ðề tài đã khoá


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
TUT về USART trong PIC16F877A mafd_47a MPASM 16 19-02-2025 05:32 AM
TUT ve I2C ( pic16f877a ) mafd_47a MPASM 28 28-01-2025 10:45 PM
Lập nhóm PIC16F877A nhh Cơ bản về vi điều khiển và PIC 285 08-03-2017 11:08 PM
Bộ so sánh và PWM cho PIC16F877A anhquangngai Cơ bản về vi điều khiển và PIC 24 08-09-2012 09:00 AM
Pic16f877a TỪ DỄ TỚi KhÓ ntc Cơ bản về vi điều khiển và PIC 373 23-05-2009 10:24 PM


Múi giờ GMT. Hiện tại là 06:29 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam