Nguyên văn bởi thangktvta
Xem bài viết
Thông báo
Collapse
No announcement yet.
Tập lập trình LCD 2x16 trên AVR vô đây!
Collapse
X
-
The goal of power electronics is control the flow of energy from an electrical source to an electrical load with high efficiency, high availability, high reliability, light weight and low cost.
-
Nguyên văn bởi bijusi@ Xem bài viếtĐâu có, mình dùng port nào cho LCD cũng được mà! Bạn nói kg hiểu nguyên lý hoạt động là đúng nhưng tìm hiểu thì cũng ra, mình kg cần đi sâu về phần đó.
Làm như vậy giúp ta linh hoạt hơn trong thiết kế mạch khi chân cẳng hạn chế hay là một chân nhiều chức năng trong mạch!
Chúc vui vẻ!Nỏ biết chữ mần răng ký được??!! Thôi nhé.
Comment
-
Nguyên văn bởi bijusi@ Xem bài viếtĐâu có, mình dùng port nào cho LCD cũng được mà! Bạn nói kg hiểu nguyên lý hoạt động là đúng nhưng tìm hiểu thì cũng ra, mình kg cần đi sâu về phần đó.The goal of power electronics is control the flow of energy from an electrical source to an electrical load with high efficiency, high availability, high reliability, light weight and low cost.
Comment
-
Thông thường tôi dùng thẳng thư viện lcd trong codevision nhưng lắm lúc cũng phải dùng cái của mình như ở đây: http://dientuvietnam.net/forums/show...02&postcount=4
Nguyên văn bởi Le Thi Bich Xem bài viếtđể hiển thị một giá trị data (adc_data) chẳng hạn em làm thế này:
char lcd_buffer[33];
unsigned int data0;
data0=adc_data[0];
sprintf(lcd_buffer,"Gia tri la: %d",data0);
lcd_gotoxy(0,0);
lcd_puts(lcd_buffer);
delay_ms(50);
lcd_clear();
hôm trước anh VNarmy cho em em làm để hiện thị giá trị adc0 lên lcd chạy tốt lắm nhưng em chẳng hiểu j cả
char lcd_buffer[33];để làm j?
tại sao lại là [33]?
sao em dùng đoạn code như thế này:
lcd_gotoxy(0,0);
lcd_puts(adc_data(0));
delay_ms(50);
lcd_clear();lại không chạy được nhỉ?
các anh cùng bàn luận cho em vỡ!
Lại nữa, một vài hàm của Codevision thực ra viết lại theo hàm C chuẩn ví dụ như cái sprintf ở trên chẳng hạn. Có thể dễ dàng tra cứu trong help của codevision để biết tính năng nhưng nếu kém tiếng Anh thì hoàn toàn có thể tra cứu thông tin từ một quyển dạy lập trình C tiếng Việt như cuốn của GS Phạm Văn Ất chẳng hạn.Last edited by VNarmy; 20-11-2008, 16:59.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
-
Mới tìm hiểu và không có thời gian thì dùng sẵn thư viện của CVAVR là tiện nhất. Nhưng đã dùng nhiều rồi và muốn tuỳ biến theo ứng dụng thì thế nào chả phải lập thư viện riêng.
Chịu khó xem lại đoạn mã CVAVR viết cho LCD mình thấy nhiều cái hay lắm. Bữa nào rảnh sẽ viết bài cùng chia sẻ.!e
Comment
-
Nguyên văn bởi VNarmy Xem bài viếtThông thường tôi dùng thẳng thư viện lcd trong codevision nhưng lắm lúc cũng phải dùng cái của mình như ở đây: http://dientuvietnam.net/forums/show...02&postcount=4
Nhiều bạn cứ nghĩ chả cần biết gì về C chuẩn nhưng vẫn có thể lập trình C dẫn đến cái lỗi như ở trên đây. Cái tham số của hàm lcd_puts là chuỗi (con trỏ *char) mà lại đút một tham số kiểu char hay int vào thì có mà chạy vào mắt.
Lại nữa, một vài hàm của Codevision thực ra viết lại theo hàm C chuẩn ví dụ như cái sprintf ở trên chẳng hạn. Có thể dễ dàng tra cứu trong help của codevision để biết tính năng nhưng nếu kém tiếng Anh thì hoàn toàn có thể tra cứu thông tin từ một quyển dạy lập trình C tiếng Việt như cuốn của GS Phạm Văn Ất chẳng hạn.
giá em có thật nhiều thời jan để được nghiên cứu và học hỏi các anh thì tốt biết mấy. ngày nào xếp em cũng giao cho đủ mọi chuyện, ngày xua đi học thì còn chăm bây giờ khó quá cứ làm việc bí ở đâu lại lên diễn đàn hỏi các anh chỉ bảo kinh nghiệm tích lũy dần dần anh ạ.
bớt nóng anh nhéThiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.
Comment
-
Nguyên văn bởi Le Thi Bich Xem bài viếtanh VNarmy nóng tính thế, anh có vợ chưa đấy ạ?
giá em có thật nhiều thời jan để được nghiên cứu và học hỏi các anh thì tốt biết mấy. ngày nào xếp em cũng giao cho đủ mọi chuyện, ngày xua đi học thì còn chăm bây giờ khó quá cứ làm việc bí ở đâu lại lên diễn đàn hỏi các anh chỉ bảo kinh nghiệm tích lũy dần dần anh ạ.
bớt nóng anh nhéThe goal of power electronics is control the flow of energy from an electrical source to an electrical load with high efficiency, high availability, high reliability, light weight and low cost.
Comment
-
Tôi có viết 1 đoạn code để hiển thị giá trị 1 biến ra LCD:
#include <mega8.h>
#include <stdio.h>
#include <lcd.h>
...
char buffer[20];
long f=123456;
sprintf(buffer," f=%6f Hz \n",f);
lcd_gotoxy(0,0);
lcd_puts(buffer);
...
Lý ra ở LCD sẽ hiện ra: f=123456Hz . Nhưng nó chỉ hiện: f= Hz
Lỗi ở đâu tôi tìm chưa ra, các bác chỉ giúp. Tôi dùng CodeVision 2.3.9, rồi dùng 1.24.6...thử lại đều không được...
Comment
-
Tôi sợ do chưa biết sử dụng hàm sprintf(), nên viết kiểu khác:
...
char num[]={"0","1",....,"9"};
for(i=0;i<10;i++)
{ buffer[i]=num[f%10]; //Lấy số lẻ thứ 1
f=f/10; //bỏ số lẻ...
}
lcd_puts(buffer); //Đưa kết quả ra LCD
...
Dùng CV 2.3.9 thì nó báo lỗi ở khai báo mảng num[]... missing '}' - mà có thiếu đâu
Dùng CV 1.24.6 thì không báo lỗi gì nhưng chạy thì LCD trống trơn. Không hiển thị nên chưa làm ra cái gì...
Nhờ các bác giúp...
Comment
-
Có bác nào lập trình LCD bằng asm chỉ giúp em với ,em viết 1 đoạn chương trình hiện thị dòng chữ " DHBKHN k51' nhưng ko thấy ji??.đây là đoạn code của em
;*************************************************
; LCD module 8bit
;Nguyen thanh khiem
;DBO-PC0
;DB1-PC1
;..............
;DB7-PC7
;RS-PD7
;R/W-PD6
;ENABLE-PD5
;*************************************************
.include "8535def.inc"
;=================================================
; Khai bao bien ,cac hang so
.def temp =R16
;=================================================
;Khai bao ngat
.CSEG
.ORG 0x00
Rjmp Reset
;=================================================
Reset:
; initial Stack
LDI temp,high(RAMEND)
OUT SPH,temp
LDI temp,low(RAMEND)
OUT SPL,temp
SER temp
OUT DDRC, temp ;PortC out put
OUT DDRD, temp
SBI DDRD,7 ;PortD.7 out put
SBI DDRD,6 ;PortD.7 out put
; SBI DDRD,5 ;PortD.7 out put
;================================================= =======
LCDinit:
LDI temp,0X38 ; LCD 2 DONG MATRAN 5X7
RCALL COMMAND
LDI temp,0X01
RCALL COMMAND
LDI temp,0X0F ;bat hien thi con tro nhap nhay
RCALL COMMAND
LDI temp,0X06
RCALL COMMAND
LDI temp,'B' ;
RCALL DATA_DISPLAY
LDI temp,'K' ;
RCALL DATA_DISPLAY
LDI temp,'H' ;
RCALL DATA_DISPLAY
LDI temp,'N' ;
RCALL DATA_DISPLAY
LDI temp,'K' ;
RCALL DATA_DISPLAY
LDI temp,'5' ;
RCALL DATA_DISPLAY
LDI temp,'1' ;
RCALL DATA_DISPLAY
HERE:
RJMP HERE
;================================================= =======
; CHUONG TRINH CON XUAT LENH
COMMAND:
RCALL Check_BF
; OUT PortC,temp
CBI PortD,7 ;RS=0 XUAT LENH
CBI PortD,6 ;R/W =0 GHI DU LIEU
OUT PortC,temp
SBI PortD,5 ;ENEBLE =1 XUNG CAO XUONG THAP
CBI PortD,5 ;ENABLE =0 CHOT DU LIEU
RET
;================================================= =========
;CHUONG TRINH CON XUAT DU LIEU
DATA_DISPLAY:
RCALL Check_BF
; OUT PortC,temp ;
SBI PortD,7; RS=1 XUAT DU LIEU
CBI PortD,6 ;R/W =0 GHI DU LIEU
OUT PortC,temp
SBI PortD,5 ;ENEBLE =1 XUNG CAO XUONG THAP
CBI PortD,5 ;ENABLE =0 CHOT DU LIEU
RET
;================================================= ========
; KIEM TRA CO BAN
Check_BF:
CBI DDRC,7 ; PortC,7 as input
CBI PortD,7 ; RS =0
SBI PortD,6 ;R/W=1
; SBI DDRD,5 ;PortD.5 as output
; DOC TRANG THAI THANH GHI LENH
BACK:
CBI PortD,5 ;ENABLE =0 CHOT DU LIEU
SBI PortD,5
; CBI PortD,5
SBIC PortD,7
RJMP BACK
RET
;================================================= ===
Comment
-
Check hộ lỗi hiển thị lên LCD
Các bác check hộ em lỗi hiển thị lên LCD chữ "Hello!" với .Sao bài đơn giản thế mà em làm mãi mà không biết sai ở đâu.Khi chạy mô phỏng trên Proteus thì toàn báo Watchdog setup sequence is timed out.Do nothing. Thậm chí em copy Code của một bác rồi mô phỏng như bác ây mà vẫn lỗi . Lỗi này là lỗi gì vậy ạ?
Code của em đây ạ:
/************************************************** ***
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 3/20/2010
Author :
Company :
Comments:
Chip type : ATmega16
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
************************************************** ***/
#include <mega16.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=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
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("Hello!");
while (1)
{
// Place your code here
};
}
Link Mediafire
Không hiểu sao em dùng chức năng đính kèm file của diễn đàn ko đc
Đây là Code + mô phỏng của một bác mà em chỉ copy & paste --> dịch rồi mô phỏng như bác ấy mà vẫn lỗi như trên
.
Các bác check hộ cho.Em nghĩ nó dễ mà không làm đc thì cay cú tự xử mất mấy ngày nay rồi.Nay thì phải hỏi vậy.Cảm ơn các bác nhiều,
Comment
-
Mình đang có bài hiển thị 2 từ " Hello World" trên LCD, mình làm trên 8bit thì ok, nhưng khi làm trên 4bit thi ko làm duoc, . Mong mọi ngưoi giúp mình.
Dứoi đây là code cho 8bit (chạy ok) nhưng khi chuyển sang 4 bit thi ko chạy duoc.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#define F_CPU 12000000UL /* CPU frequency, required for delay library */
#include <util/delay.h>
#include <string.h>
#include <usbdrv/main.h>
/*======================================
Atmega32 to LCD
======================================
PB7 -> D7
PB6 -> D6
PB5 -> D5
PB4 -> D4
PB3 -> D3
PB2 -> D2
PB1 -> D1
PB0 -> D0
PC2 -> RS
PC1 -> RW
PC0 -> E
======================================*/
// Function prototype
void init8LCD(void);
void ePulse(void);
void send8Cmd(unsigned char);
void send8Char(unsigned char);
void send8String(unsigned char[]);
void goto8LCD(unsigned char line, unsigned char position);
//=============== SYSTEM hooks, leave and ignore =================================
void user_system_500us_interrupt()
{}
void user_command( uint8_t* get_ctrl, uint16_t* get_addr, uint16_t* val)
{}
//============== Executive Loop ==================================================
void user_forever_loop()
{//--- User initializations.
init8LCD(); // Initialise LCD
goto8LCD(1, 6);
send8String("Hello\nWorld");
while(1)
{//--- put your tasks here.
}
}
void init8LCD(void)
{
DDRB = 0b11111111; // Set PORTB to be output
DDRC = 0b11111111; // Set PORTC to be output
PORTB = 0;
PORTC = 0;
send8Cmd(0b00111000); // 2 lines, 5x7 char size
send8Cmd(0b00001100); // display on, cursor off, blink off
}
void ePulse(void)
{
// E = 0
PORTC = PORTC & 0b11111110;
_delay_us(1);
// E = 1
PORTC = PORTC | 0b00000001;
_delay_us(1);
// E = 0
PORTC = PORTC & 0b11111110;
}
void send8Cmd(unsigned char command)
{
// Wait
_delay_us(40);
// RS=0, RW=0 and E=0
PORTC = PORTC & 0b11111000;
// Send command to PORTB
PORTB = command;
// Pulse E
ePulse();
// Wait
_delay_us(40);
// RS=0, RW=0 and E=0
PORTC = PORTC & 0b11111000;
}
void send8Char(unsigned char character)
{
// Wait
_delay_us(40);
// RS=0, RW=0 and E=0
PORTC = PORTC & 0b11111000;
// Set RS = 1
PORTC = PORTC | 0b00000100;
// Send letter to PORTB
PORTB = character;
// Pulse E
ePulse();
// Wait
_delay_us(40);
// RS=0, RW=0 and E=0
PORTC = PORTC & 0b11111000;
}
void send8String(unsigned char str[])
{
unsigned char i;
unsigned char length;
length = (unsigned char) strlen(str);
for (i=0; i<length; i++)
{
if (str[i] == '\n')
goto8LCD(2, 4);
else
send8Char(str[i]);
}
}
void goto8LCD(unsigned char line, unsigned char position)
{
if (line == 1)
{
send8Cmd(0x80 + position - 1);
}
else if (line == 2)
{
send8Cmd(0xc0 + position - 1);
}
}
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Hỏi cách điều chế xungbởi thetungBạn cho qua cái Tờ ri gơ Sờ mít ấy ......
-
Channel: Kỹ thuật điện tử tương tự
16-12-2024, 11:26 -
-
Trả lời cho Hỏi cách điều chế xungbởi nguyendinhvanCó gì mà khó ?
Răn cưa vuông đây
...-
Channel: Kỹ thuật điện tử tương tự
15-12-2024, 23:36 -
-
Trả lời cho hỏi về tụ điệnbởi ndp62Chữ " VENT" không phải là tên hãng sx tụ đâu ,vó thế là 1 ký hiệu liên quan tụ lowesr ?
-
Channel: Điện thanh
15-12-2024, 18:24 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi bqvietTrừ trường hợp công suất (rất) thấp, hầu như tất cả các loại nguồn xung thông thường đều có tụ nhỏ 1 - 10nF nối giữa sơ cấp và thứ cấp, để thoát nhiễu và để chống hiện tượng tương tự tĩnh điện. Vụ này đã thảo luận vài...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 22:02 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi namlangnhoE thử 3 cái nguồn nó đều giống nhau. Nên e làm tiếp địa luôn.
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 19:58 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi mèomướpDạ chú sắm con át chống giật và thay nguồn tổ ong khác cho an toàn ạ. Đa phần nguồn xung đều xả nhiễu của bên thứ cấp về điện lưới qua 1 con tụ nên cảm giác tê sẽ khó xác định rõ ràng là do rò điện hay là nó vốn vậy...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 18:51 -
-
bởi namlangnhoXin chào mọi người. E có sử dụng 1 cục nguồn tổ ong 12v-30A chạy đèn led xe trà sữa. Mà thợ thi công bị rò điện nên điện rò ra khung xe. E dùng đồng hồ đo điện ở khung xe và cả output thì thấy có dòng điện xoay chiều hơn 100v. Nên chạm...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 00:12 -
-
bởi Manh.n.trCác bác cho em hỏi cách điều chế xung răng cưa sang xung vuông với ạ. Em đang thấy khó ạ...
-
Channel: Kỹ thuật điện tử tương tự
13-12-2024, 20:46 -
-
Trả lời cho hỏi về thiết kế mạch tuần tự trên proteusbởi Hatruong1309
-
Channel: Hỗ trợ học tập
12-12-2024, 00:33 -
-
bởi Hatruong1309Cho e hỏi là phần chân X thì nối cái j thì mạch mới chạy được ạ và kiểm tra đúng sai kiểu j ạ
Đề bài thiết kế mạch dãy đồng bộ nhận biết dãy tín hiệu vào ở dạng nhị phân được đưa liên tiếp ở đầu vào X và được đồng...-
Channel: Hỗ trợ học tập
12-12-2024, 00:33 -
Comment