Em dùng AVR kết nối với LCD, sử dụg codevision để lập trình thì nó đã có hẳn cái thư viện lcd.h. Bên trong nó hỗ trợ hết rồi và mình chỉ có việc sài nó thôi. Em muốn hiểu về cơ chế làm việc của lcd, nghĩa là mình có thể hoàn toàn lập trình với nó mà không cần dùng đến lcd.h (như mấy bác sài 89 với lcd ấy mà). các bác chỉ em với. Thanks very much
Thông báo
Collapse
No announcement yet.
LCD 2x16
Collapse
X
-
Vậy thì bạn hãy bê luôn đoạn code của 89 sang cho avr. Chỉnh sủa một chút cho đúng với AVR (như việc đặt cấu hình cho chân). Như vậy là chạy oke luôn. So sánh với Datasheet của LCD. Bạn thấy không có j khác biệt. Hoặc nếu muốn xem cái thằng AVR nó viết cho LCD thế nào thì hãy vào thư mục cài đặt C:\cvavr\lib. Sau đó mở cái file LCD.lib ra bạn sẽ thấy ngay. Trong thư mục này cũng có rất nhiều mã code đó.
Thân mến!"Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"
-
Đôi khi bạn cũng cần tận dụng tối đa vi điều khiển. Mà các chương trình mẫu của codevision thì lại hơi chiếm dụng tài nguyên.
Dưới đây là sơ đồ mạch giao tiếp tiny2313 với LCD16x2. Chỉ dùng có 6 chân (nếu dùng chương trình mẫu của code vision thì mất nguyên 1 cổng).

Code giao tiếp như sau:
Code:/***************************************************** This program was produced by the CodeWizardAVR V1.24.2c Standard Automatic Program Generator © Copyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.ro e-mail:office@hpinfotech.ro Project : Version : Date : 2/8/2007 Author : Dung Company : Comments: Chip type : ATtiny2313 Clock frequency : 11.059200 MHz Memory model : Tiny External SRAM size : 0 Data Stack size : 32 *****************************************************/ #include <tiny2313.h> #define LINE1_ADDR 0x00 // Start of line 1 in the DD-Ram #define LINE2_ADDR 0x40 // Start of line 2 in the DD-Ram /* Display-Commands */ #define CLEAR_DISPLAY 0x01 // Clear entire display and set Display Data Address to 0 #define DD_RAM_PTR 0x80 // Address Display Data RAM pointer #define DISP_INIT 0x28 // 4 bit 2 lines #define INC_MODE 0x06 // Display Data RAM pointer incremented after write #define DISP_ON 0x0C #define CURSOR_ON 0x04 #define CURSOR_OFF 0x00 #define DISP_OFF 0x08 #define Left 0x10 #define Right 0x14 // Declare your global variables here const char Disp1[]="\nTvao: (oC)"; const char Disp2[]= "Tchenh: (oC)"; const char Disp3[]="\nDat tham so: "; const char Disp4[]="\n TEMPERATURE "; const char Disp5[]= " MONITOR "; //*************************************************************************** /* * Waits for some time so the 7066 can do the last command */ void wait (unsigned int time) { int i; for (i = 0; i < time ;i++){ } } /* * WriteInstrReg: Write to Instruction Register of LCD Display Device */ static void WriteInstrReg (unsigned char Instr) { PORTB.2 = 0; // select instruction register PORTB.3 = 1; // give operation start signal wait(45); // wait PORTB = (PORTB&0x0F)|(Instr&0xF0); // write instruction PORTB.3 = 0; wait(45); // wait PORTB.3 = 1; // give operation start signal wait(45); // wait PORTB = (PORTB&0x0F)|((Instr<<4)&0xF0); // write instruction PORTB.3 = 0; //PORTB| = 0xf0; // DATA_PORT is input [prevent I/O-Port from damage] } /* * WriteDataReg: Write to Data Register of LCD Display Device */ static void WriteDataReg (unsigned char val) { PORTB.2 = 1; // select instruction register PORTB.3 = 1; // give operation start signal wait(45); // wait PORTB = (PORTB&0x0F)|(val&0xF0); // write instruction PORTB.3 = 0; wait(45); // wait PORTB.3 = 1; // give operation start signal wait(45); // wait PORTB = (PORTB&0x0F)|((val<<4)&0xF0); // write instruction PORTB.3 = 0; } /*****************************************************************/ void GotoXY(unsigned char x,unsigned char y) { char position; if (x==1){ position=LINE1_ADDR | DD_RAM_PTR; WriteInstrReg(position|y); }else{ position=LINE2_ADDR | DD_RAM_PTR; WriteInstrReg(position|y); } } /*****************************************************************/ #define _ALTERNATE_PUTCHAR_ #pragma used+ void putchar (char c) { if (c == '\n') { WriteInstrReg (LINE1_ADDR | DD_RAM_PTR); // place to start of line 1 } else { WriteDataReg (c); } } #pragma used- /*****************************************************************/ // Standard Input/Output functions #include <stdio.h> #include <delay.h> /***************************************************************************/ /* * Clear_Display: Write 0x20 to Display RAM */ static void Clear_Display (void) { WriteInstrReg (CLEAR_DISPLAY); wait(2000); } /*****************************************************************/ void InitLCD(void) { wait(40000); PORTB.2 = 0; // select instruction register PORTB.3 = 1; // give operation start signal wait(45); // wait PORTB = PORTB|0x20; // write instruction PORTB.3 = 0; wait(45); // wait WriteInstrReg(DISP_INIT); //4 bits 1 line WriteInstrReg(0x08); Clear_Display(); wait(2000); WriteInstrReg(INC_MODE); wait(45); WriteInstrReg (LINE1_ADDR | DD_RAM_PTR); // place to start of line 1 WriteInstrReg (DISP_ON); } void main(void) { // Declare your local variables here unsigned char count=1; unsigned char buttoncnt,i,c,buff[9]; // Crystal Oscillator division factor: 1 CLKPR=0x80; CLKPR=0x00; // Input/Output Ports initialization // Port A initialization // Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In // State7=0 State6=0 State5=1 State4=1 State3=1 State2=1 State1=P State0=P PORTB=0x03; DDRB=0xFC; // Port D initialization // Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=In // State6=P State5=0 State4=0 State3=0 State2=0 State1=1 State0=P PORTD=0x43; DDRD=0x3E; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected //TCCR0A=0x00; //TCCR0B=0x00; //TCNT0=0x00; //OCR0A=0x00; //OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge //TCCR1A=0x00; //TCCR1B=0x00; //TCNT1H=0x00; //TCNT1L=0x00; //ICR1H=0x00; //ICR1L=0x00; //OCR1AH=0x00; //OCR1AL=0x00; //OCR1BH=0x00; //OCR1BL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off //GIMSK=0x00; //MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization //TIMSK=0x00; // Universal Serial Interface initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off //USICR=0x00; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: Off // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRB=0x18; UCSRC=0x06; UBRRH=0x01; UBRRL=0x1F; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; // Global enable interrupts #asm("cli") InitLCD(); printf(Disp4); GotoXY(2,0); printf(Disp5); for(i=0;i<100;i++) wait(50000); Clear_Display(); printf(Disp3); WriteInstrReg (LINE2_ADDR | DD_RAM_PTR); printf(Disp2); PrintTc(Tc); while (1) { // Place your code here for(i='A';i<'G';i++) lcd_putchar(i); lcd_putchar('\n'); delay_ms(10000); printf("Hello Mr Dung"); delay_ms(10000); }; }AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
Xem thêm tại Online Store ---> Click here
Mob: 0982.083.106
Comment
-
Trời, muốn hiểu bản chất thì bác phải tự tìm hiểu chứ bắt người ta viết code là thế nào? Cần kíp lắm thì mới làm vậy thôi bác ạ, bác tìm datasheet con DM0802 về mà đọc, nó nói rõ hết nguyên lý hoạt động của LCD đấy! Nếu không chịu tìm hiểu phần cứng thì suôt ngày bác chỉ đốt LCD mà thôi! Chúc bác thành công!Nguyên văn bởi thehomeland Xem bài viếtquên mất.Viết cho ATmega8 nha.Dùng LCD 2x16.Sử dụng lcd.h đóNỏ biết chữ mần răng ký được??!! Thôi nhé.
Comment
-
ban nói rất đúng. Nếu bỏ chút thời gian cùng lắm là 1 ngày, ta có thể hiểu và viết được chương trình đơn giản cho nó. Nhưng vơi thời buổi hiện đại này, internet đầy như vậy, việc tìm một đoạn code search trên WEB thì đầy mà. Chúng ta cần phải tự tìm hiểu một chút, tự tìm code, sau do tự làm, mắc mớ lúc đó mới nên hỏi, vi lúc đó có rất nhiều thắc mắc để hỏi,Nguyên văn bởi thangktvta Xem bài viếtTrời, muốn hiểu bản chất thì bác phải tự tìm hiểu chứ bắt người ta viết code là thế nào? Cần kíp lắm thì mới làm vậy thôi bác ạ, bác tìm datasheet con DM0802 về mà đọc, nó nói rõ hết nguyên lý hoạt động của LCD đấy! Nếu không chịu tìm hiểu phần cứng thì suôt ngày bác chỉ đốt LCD mà thôi! Chúc bác thành công!
sẽ hiểu ra được rất nhiều. Còn một khi không chịu tìm hiểu, chỉ có hỏi và hỏi xin và xin thì sẽ chỉ biết được mỗi cái đó, sang cái khác lại đi hỏi. Như vậy thì chỉ bao giờ tiến bộ được."Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"
Comment
-
Cám ơn lời khuyên của các bạn.Nhưng mà mình cũng đã lập trình cho LCD bằng các lệnh thông thường đc rồi.Chỉ có điều là vẫn ko biết sử dụng các hàm trong lcd.h như thế nào thôi.Mình muốn xem một ví dụ để biết rõ hơn cách sử dụng chúng.Chứ về nguyên lý hoạt động LCD thì mình cũng nắm sơ sơ rồi.
Cái thắc mắc của mình là tại sao lúc mình sử dụng các hàm trong lcd.h nó lại báo lỗi ở phần giải mã asm.Có lẽ là mình khai báo sai chân vi xử lý,ko phù hợp với các hàm của lcd.h chăng?Tự tìm hiểu nguyên nhân nhưng mà ko hiểu nên mới hỏi thế thôi.
Các bạn giúp mình tí đê
Comment
-
Bạn dùng thư viện lcd.h thì sao không dùng luôn công cụ tự động tạo mã của CV luôn đi ( CodewizardAVR ) trong đó có 2 tùy chọn cổng nối với LCd là B, D. cứ đấu như chỉ dẫn của CodewizardAVR là được, các hàm của nó thì bác xông thẳng vào thư viện Lcd.h tìm là thấyNguyên văn bởi thehomeland Xem bài viếtCám ơn lời khuyên của các bạn.Nhưng mà mình cũng đã lập trình cho LCD bằng các lệnh thông thường đc rồi.Chỉ có điều là vẫn ko biết sử dụng các hàm trong lcd.h như thế nào thôi.Mình muốn xem một ví dụ để biết rõ hơn cách sử dụng chúng.Chứ về nguyên lý hoạt động LCD thì mình cũng nắm sơ sơ rồi.
Cái thắc mắc của mình là tại sao lúc mình sử dụng các hàm trong lcd.h nó lại báo lỗi ở phần giải mã asm.Có lẽ là mình khai báo sai chân vi xử lý,ko phù hợp với các hàm của lcd.h chăng?Tự tìm hiểu nguyên nhân nhưng mà ko hiểu nên mới hỏi thế thôi.
Các bạn giúp mình tí đê
...
Nhưng mà chú ý vụ fuse bit nếu bác có ý định đấu LCD vào PortB, còn nếu chọn PortD thì không ảnh hưởng Hòa bình
Comment
-
1. Cách dùng các hàm trong lcd.h thì bác có thể mở help ra mà đọc, có đủ hết từ lập trình mức thấp đến mức cao.Nguyên văn bởi thehomeland Xem bài viếtCám ơn lời khuyên của các bạn.Nhưng mà mình cũng đã lập trình cho LCD bằng các lệnh thông thường đc rồi.Chỉ có điều là vẫn ko biết sử dụng các hàm trong lcd.h như thế nào thôi.Mình muốn xem một ví dụ để biết rõ hơn cách sử dụng chúng.Chứ về nguyên lý hoạt động LCD thì mình cũng nắm sơ sơ rồi.
Cái thắc mắc của mình là tại sao lúc mình sử dụng các hàm trong lcd.h nó lại báo lỗi ở phần giải mã asm.Có lẽ là mình khai báo sai chân vi xử lý,ko phù hợp với các hàm của lcd.h chăng?Tự tìm hiểu nguyên nhân nhưng mà ko hiểu nên mới hỏi thế thôi.
Các bạn giúp mình tí đê
2. Lỗi biên dịch asm có nhiều nguyên nhân, dễ bị nhất đó là có khi nào đó bác mở lcd.h ra và vô tình thay đổi một chữ bất kì nào đó thế là bị lỗi, hoặc do phần mềm, do Window..... vân vân và vân vân...Nỏ biết chữ mần răng ký được??!! Thôi nhé.
Comment
-
Ví dụ với ATmega16 nhé,mình có đoạn code sau:
#include <mega16.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
//hien thi dong chu "hello"
void main(void)
{
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("hello");
while (1) ;
}
Có lỗi gì ở đây vậy?lúc mô phỏng trên proteus mình thấy chân E của lcd lúc nào cũng ở mức 0,tất nhiên là ko hiển thị đc gì rồi.mà chân PORTD.6 và .7 thì ko có tín hiệu.bạn nào giúp mình với.
Làm thử theo trong phần help cũng thấy thế.Chỉ giùm nhé
Comment
-
Muốn hỏi bạn một câu: Bạn kết luận rằng nó ko làm việc được chỉ vì bạn mô phỏng nó ko đc?Nguyên văn bởi thehomeland Xem bài viếtVí dụ với ATmega16 nhé,mình có đoạn code sau:
#include <mega16.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
//hien thi dong chu "hello"
void main(void)
{
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("hello");
while (1) ;
}
Có lỗi gì ở đây vậy?lúc mô phỏng trên proteus mình thấy chân E của lcd lúc nào cũng ở mức 0,tất nhiên là ko hiển thị đc gì rồi.mà chân PORTD.6 và .7 thì ko có tín hiệu.bạn nào giúp mình với.
Làm thử theo trong phần help cũng thấy thế.Chỉ giùm nhé
Thế thì bạn xin sang học CNTT đi chứ học điện tử làm gì.AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
Xem thêm tại Online Store ---> Click here
Mob: 0982.083.106
Comment
-
Hơi bị dị ứng đấy anh Army đâu phải dân IT nào cũng mô phỏng.Nguyên văn bởi VNarmy Xem bài viếtMuốn hỏi bạn một câu: Bạn kết luận rằng nó ko làm việc được chỉ vì bạn mô phỏng nó ko đc?
Thế thì bạn xin sang học CNTT đi chứ học điện tử làm gì.
Sông dài, Thuyền lớn, Biển rộng bao la.
Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.
Comment
Bài viết mới nhất
Collapse
-
bởi theidiotcatViệc lựa chọn một chiếc laptop gaming phù hợp với nhu cầu, ngân sách chưa bao giờ là dễ dàng. Và điều đó càng khó hơn trong năm 2026 khi mà mức giá liên tục tăng.
Nếu bạn chưa biết nên chọn một chiếc laptop gaming như thế nào...-
Channel: Đánh giá sản phẩm DTVN
26-06-2026, 10:29 -
-
bởi theidiotcatVới mức ngân sách 20 - 30 triệu đồng trong năm 2026, các bạn sinh viên và dân văn phòng có thể tìm thấy nhiều lựa chọn cao cấp, mạnh mẽ, pin “trâu”, đặc biệt là các mẫu laptop AI hỗ trợ cho học tập và làm việc.
Trong phân...-
Channel: Đánh giá sản phẩm DTVN
26-06-2026, 10:25 -
-
bởi theidiotcatDưới đây là một số mẫu laptop nổi bật trong phân khúc dưới 20 triệu giúp các bạn văn phòng, sinh viên và đặc biệt là tân sinh viên có thể dễ dàng lựa chọn được mẫu laptop phù hợp với nhu cầu và ngân sách của mình.
Thị...-
Channel: Đánh giá sản phẩm DTVN
26-06-2026, 10:07 -
-
bởi theidiotcatViệc chọn mua một bộ máy tính phục vụ cho các nhu cầu làm việc văn phòng và sử dụng cơ bản hàng ngày đang trở nên dễ dàng và tiết kiệm hơn bao giờ hết. Thay vì phải đau đầu trích ngân sách để mua cả vi xử lý lẫn card đồ họa rời...
-
Channel: Đánh giá sản phẩm DTVN
25-06-2026, 11:23 -
-
bởi theidiotcatViệc nâng cấp từ một dàn máy tính cũ lên cấu hình mới luôn khiến nhiều người đắn đo về mức chi phí bỏ ra. Nếu bạn đang tìm kiếm một sự lột xác hoàn toàn về hiệu năng mà vẫn cân đối được dòng tiền, combo giữa vi xử lý Ryzen...
-
Channel: Đánh giá sản phẩm DTVN
25-06-2026, 11:06 -
-
Trả lời cho Lực dọc trục làm hỏng ổ bi.bởi nguyendinhvanVí dụ một trang như thế này
...-
Channel: Điện tử công suất
24-06-2026, 19:57 -
-
Trả lời cho Lực dọc trục làm hỏng ổ bi.bởi nguyendinhvanỔ bi có loại chịu lực dọc, loại chịu lực ngang.
Bạn kiếm một quyển Data cũng một hãng vòng bi nào đó. Họ sẽ cấp cho bạn đủ thông số kỹ thuật.
Khi lựa chọn được mã sản phẩm, bạn chỉ việc tìm mua mã đó, hoặc đặt hàng....-
Channel: Điện tử công suất
24-06-2026, 19:52 -
-
bởi GargiChào mọi người, tôi đang gặp một vấn đề kỹ thuật và muốn được nghe ý kiến của mọi người.
Tôi đã lắp một đĩa xích vào trục đầu ra của hộp số hành tinh bánh răng xoắn dùng cho truyền động xích. Sau vài tháng hoạt động, ổ bi đầu ra bị hỏng.
Bản thân...-
Channel: Điện tử công suất
24-06-2026, 13:22 -
-
bởi vi van phamSau hàng chục năm, không biết có ai còn nghĩ gì về tôi? Riêng tôi, nhớ nhiều về dientuviet nam. net. Ngày ấy tìm 1 người bạn đam mê về điện từ khó như trúng số độc đăc. Tôi đã trúng số độc đắc khi được mời về dientuvietnam.net...
-
Channel: Tâm tình dân kỹ thuật
23-06-2026, 22:43 -
-
bởi FotiniChào mọi người.
Cấu trúc khung giàn của tôi sử dụng một động cơ servo tích hợp trên mỗi trục (https://www.oyostepper.es/category-8...integrado.html), với một dây nối đất chung.
Việc kích hoạt từng trục riêng lẻ hoạt động tốt, nhưng...-
Channel: Điện tử dành cho người mới bắt đầu
18-06-2026, 14:03 -

Comment