bác nào thử viết hộ em bài đếm xung hiển thị ra LCD làm mẫu cho em với.viết bằng C ấy.em không biết tại sao con số không xuất ra được
bác nào giúp em chỗ LCd với
Collapse
X
-
Mấy bác coi giúp cái code này sai ở đâu mà không chạy được với.
//D4 - P1.4
//D5 - P1.5
//D6 - P1.6
//D7 - P1.7
//EN - P1.3
//RS - P1.2
#include<reg51.h>
#define lcd_port P1
//LCD Registers addresses
#define LCD_EN 0x08
#define LCD_RS 0x04
void delayus(unsigned long int t)
{
unsigned long int i;
for(i=0;i<t;i++);
}
void delayms( unsigned int ms )
{ unsigned int i,j;
for (i=0;i<ms;i++)
for (j=0;j<120;j++){};
}
void lcd_putcmd (char cmd)
{
lcd_port = (cmd & 0xF0)|LCD_EN;
lcd_port = (cmd & 0xF0);
lcd_port = ((cmd >> 4) & 0xF0)|LCD_EN;
lcd_port = ((cmd >> 4) & 0xF0);
delayus(200);
delayus(200);
}
void lcd_putchar(unsigned char dat)
{
lcd_port = ((dat & 0xF0)|LCD_EN|LCD_RS);
lcd_port = ((dat & 0xF0)|LCD_RS);
lcd_port = (((dat >> 4) & 0xF0)|LCD_EN|LCD_RS);
lcd_port = (((dat >> 4) & 0xF0)|LCD_RS);
delayus(200);
delayus(200);
}
void lcd_reset()
{
lcd_port = 0xFF;
delayms(20);
lcd_port = 0x03+LCD_EN;
lcd_port = 0x03;
delayms(10);
lcd_port = 0x03+LCD_EN;
lcd_port = 0x03;
delayms(1);
lcd_port = 0x03+LCD_EN;
lcd_port = 0x03;
delayms(1);
lcd_port = 0x02+LCD_EN;
lcd_port = 0x02;
delayms(1);
}
void lcd_init ()
{
lcd_reset(); // Call LCD reset
lcd_putcmd(0x28); // 4-bit mode - 2 line - 5x7 font.
lcd_putcmd(0x0C); // Display no cursor - no blink.
lcd_putcmd(0x06); // Automatic Increment - No Display shift.
lcd_putcmd(0x80); // Address DDRAM with 0 offset 80h.
}
void lcd_putsf(char *s)
{
while(*s);
{
lcd_putchar(*s);
s++;
}
}
void main(void)
{
delayms(30) ;
lcd_init();
while(1)
{
lcd_putcmd(0x01) ;
lcd_putcmd(0x80);
lcd_putchar('s') ;
}
}
Comment
-
-
Chú em có hiểu 2 cái định nghĩa này là gì không ?
#define LCD_EN 0x08
#define LCD_RS 0x04
Sai bét hết rồi
Để anh sửa lại cho chu em này !
Tất cả các chân của LCD đều nối trên P1 cho nó gọn:
RS - P1_0
RW - GND
EN - P1_2
D4..7 - P1_4..P1_7
Biên dịch thử rồi nạp vào Chip xem nó có hiện ra chữ 's' không.PHP Code:#define lcd_port P1 //LCD Registers addresses #define LCD_EN 0x04 #define LCD_RS 0x01 void delayus(unsigned long int t) { unsigned long int i; for(i=0;i<t;i++); } void delayms( unsigned int ms ) { unsigned int i,j; for (i=0;i<ms;i++) for (j=0;j<120;j++){}; } void lcd_putcmd (char cmd) { delayms(2); lcd_port = (cmd & 0xF0)|LCD_EN; lcd_port = (cmd & 0xF0); delayms(1); lcd_port = ((cmd << 4)&0xF0)|LCD_EN; lcd_port = ((cmd << 4)&0xF0); delayus(200); delayus(200); } void lcd_putchar (unsigned char dat) { delayms(2); lcd_port = ((dat & 0xF0)|LCD_EN|LCD_RS); lcd_port = ((dat & 0xF0)|LCD_RS); delayms(1); lcd_port = (((dat << 4)&0xF0)|LCD_EN|LCD_RS); lcd_port = (((dat << 4)&0xF0)|LCD_RS); delayus(200); delayus(200); } void lcd_reset() { lcd_port = 0xFF; delayms(20); lcd_port = 0x00+LCD_EN; lcd_port = 0x00; delayms(1); lcd_port = 0x20+LCD_EN; lcd_port = 0x00; delayms(1); lcd_port = 0x20+LCD_EN; lcd_port = 0x00; delayms(1); lcd_port = 0x20+LCD_EN; lcd_port = 0x00; delayms(1); } void lcd_init () { lcd_reset(); // Call LCD reset lcd_putcmd(0x28); // 4-bit mode - 2 line - 5x7 font. lcd_putcmd(0x0C); // Display no cursor - no blink. lcd_putcmd(0x06); // Automatic Increment - No Display shift. lcd_putcmd(0x80); // Address DDRAM with 0 offset 80h. */ } void lcd_putsf(char *s) { while(*s); { lcd_putchar(*s); s++; } } void main(void) { lcd_init(); lcd_putchar('s') ; while(1) { } }
Comment
-
lcd_port = (cmd & 0xF0)|LCD_EN;Nguyên văn bởi Multi System Xem bài viếtChú em có hiểu 2 cái định nghĩa này là gì không ?
#define LCD_EN 0x08
#define LCD_RS 0x04
Sai bét hết rồi
Để anh sửa lại cho chu em này !
Tất cả các chân của LCD đều nối trên P1 cho nó gọn:
RS - P1_0
RW - GND
EN - P1_2
D4..7 - P1_4..P1_7
Biên dịch thử rồi nạp vào Chip xem nó có hiện ra chữ 's' không.PHP Code:#define lcd_port P1 //LCD Registers addresses #define LCD_EN 0x04 #define LCD_RS 0x01 void delayus(unsigned long int t) { unsigned long int i; for(i=0;i<t;i++); } void delayms( unsigned int ms ) { unsigned int i,j; for (i=0;i<ms;i++) for (j=0;j<120;j++){}; } void lcd_putcmd (char cmd) { delayms(2); lcd_port = (cmd & 0xF0)|LCD_EN; lcd_port = (cmd & 0xF0); delayms(1); lcd_port = ((cmd << 4)&0xF0)|LCD_EN; lcd_port = ((cmd << 4)&0xF0); delayus(200); delayus(200); } void lcd_putchar (unsigned char dat) { delayms(2); lcd_port = ((dat & 0xF0)|LCD_EN|LCD_RS); lcd_port = ((dat & 0xF0)|LCD_RS); delayms(1); lcd_port = (((dat << 4)&0xF0)|LCD_EN|LCD_RS); lcd_port = (((dat << 4)&0xF0)|LCD_RS); delayus(200); delayus(200); } void lcd_reset() { lcd_port = 0xFF; delayms(20); lcd_port = 0x00+LCD_EN; lcd_port = 0x00; delayms(1); lcd_port = 0x20+LCD_EN; lcd_port = 0x00; delayms(1); lcd_port = 0x20+LCD_EN; lcd_port = 0x00; delayms(1); lcd_port = 0x20+LCD_EN; lcd_port = 0x00; delayms(1); } void lcd_init () { lcd_reset(); // Call LCD reset lcd_putcmd(0x28); // 4-bit mode - 2 line - 5x7 font. lcd_putcmd(0x0C); // Display no cursor - no blink. lcd_putcmd(0x06); // Automatic Increment - No Display shift. lcd_putcmd(0x80); // Address DDRAM with 0 offset 80h. */ } void lcd_putsf(char *s) { while(*s); { lcd_putchar(*s); s++; } } void main(void) { lcd_init(); lcd_putchar('s') ; while(1) { } }
lcd_port = (cmd & 0xF0);
lcd_port = ((cmd << 4)&0xF0)|LCD_EN;
lcd_port = ((cmd << 4)&0xF0);
lcd_port = ((dat & 0xF0)|LCD_EN|LCD_RS);
lcd_port = ((dat & 0xF0)|LCD_RS);
lcd_port = (((dat << 4)&0xF0)|LCD_EN|LCD_RS);
lcd_port = (((dat << 4)&0xF0)|LCD_RS);
Mấy câu lệnh trên là sao vậy?giải thích giùm em với!
Với lại trong code có hàm lcd_reset() để làm gì vậy?Bki4u-University of Technology!
Comment
-
Vì đây là giao tiếp 4bit cho nên không thể gửi 1byte (8bit) cùng 1 lúc được, do đó phải gửi 2 lần, mỗi lần 4bit (1 Nibble).
lần 1 lấy High Nibble, và lần 2 lấy Low Nibble. Cuối cùng sẽ được 1 byte.
Mỗi lần gửi lên LCD cần phải có 1 xung cao xuống thâp từ chấn E của LCD.
Bạn nên tham khảo lại cách hoạt động của LCD.
Comment
-
Mấy cái anh nói này thì em hiểu.Nhưng em không rõ mấy câu lệnh đó có tác dụng như thế nào,VD:Nguyên văn bởi Multi System Xem bài viếtVì đây là giao tiếp 4bit cho nên không thể gửi 1byte (8bit) cùng 1 lúc được, do đó phải gửi 2 lần, mỗi lần 4bit (1 Nibble).
lần 1 lấy High Nibble, và lần 2 lấy Low Nibble. Cuối cùng sẽ được 1 byte.
Mỗi lần gửi lên LCD cần phải có 1 xung cao xuống thâp từ chấn E của LCD.
Bạn nên tham khảo lại cách hoạt động của LCD.
em nhập : cmd=0x28,dat='s' thì nó qua 4 câu lệnh cho mỗi trường hợp:
lcd_port = (cmd & 0xF0)|LCD_EN;
lcd_port = (cmd & 0xF0);
lcd_port = ((cmd << 4)&0xF0)|LCD_EN;
lcd_port = ((cmd << 4)&0xF0);
lcd_port = ((dat & 0xF0)|LCD_EN|LCD_RS);
lcd_port = ((dat & 0xF0)|LCD_RS);
lcd_port = (((dat << 4)&0xF0)|LCD_EN|LCD_RS);
lcd_port = (((dat << 4)&0xF0)|LCD_RS);
lúc này lcd_port bằng bao nhiêu và LCD_EN tạo xung như thế nào??
Ý em là anh có thể debug giùm em được không ạ(em thử rồi mà vần ko hiểu
).
Cảm ơn mấy anh nhiều.Bki4u-University of Technology!
Comment
-
Bài viết mới nhất
Collapse

Comment