PDA

View Full Version : giúp em hiển thị lcd 20x4 với


manhdt3
12-09-2011, 04:27 PM
em viết code bằng asembly chay với lcd 16x2 chạy rùi nhưng mà khi hiển thị lên lcd 20x4 thì lại không chạy được mặc dù em đã set địa chỉ .Các bác chỉ giúp em với. thank các bác nhiều
PROCESSOR P16F877A
INCLUDE<P16F877A.INC>

DELAY2 EQU 0X20
DELAY3 EQU 0X21
DELAY4 EQU 0X22
ORG 0X00
GOTO START

CLOCK
MOVLW 0X02
MOVWF PORTB ; CHAN E LEN MUC 1

MOVLW 0X00
MOVWF PORTB ; CHAN E XUONG MUC 0
RETLW 0

DELAY3S
CLRF TMR0
CLRF INTCON
BSF STATUS,RP0
CLRF 0X81
BCF STATUS,RP0
LOOPP
MOVF TMR0,0
XORLW .3
BTFSS STATUS,Z
GOTO LOOPP
BCF STATUS,RP0
RETLW 0


DELAY1
MOVLW D'2'
MOVWF DELAY2

CHO
MOVLW D'1'
MOVWF DELAY3
MOVLW D'1'
MOVWF DELAY4
D1
DECFSZ DELAY3
GOTO $+2
DECFSZ DELAY4
GOTO D1
DECFSZ DELAY2
GOTO CHO

RETLW 0
START

BCF STATUS,RP1
BSF STATUS,RP0

CLRF TRISB
CLRF TRISD

BCF STATUS,RP0
CLRF PORTB
CLRF PORTD

MOVLW 0X38
MOVWF PORTD ; CHON 8BIT 2 DONG FONT 5X8
CALL CLOCK

CALL DELAY1 ; CHO THUC HIEN XONG

MOVLW 0X0E
MOVWF PORTD
CALL CLOCK
CALL DELAY1 ; CHON HIEN THI HIEN THI CON TRO

; CHON CHE DO HIEN THI CHU THEO HUONG
MOVLW 0X04
MOVWF PORTD ; HIEN THI GIAM KHONG DAY CHU
CALL CLOCK
CALL DELAY1

; BAT DAU
MOVLW 0X01 ;
MOVWF PORTD
CALL CLOCK
CALL DELAY1

LPP
MOVLW 0xC9
MOVWF PORTD
CALL CLOCK
CALL DELAY1

BSF PORTB,0

MOVLW 0X55
MOVWF PORTD
MOVLW 0X03
MOVWF PORTB
MOVLW 0X01
MOVWF PORTB

CALL DELAY1

GOTO LPP

tdm
13-09-2011, 01:36 PM
em viết code bằng asembly chay với lcd 16x2 chạy rùi nhưng mà khi hiển thị lên lcd 20x4 thì lại không chạy được mặc dù em đã set địa chỉ .Các bác chỉ giúp em với. thank các bác nhiều
PROCESSOR P16F877A
INCLUDE<P16F877A.INC>

DELAY2 EQU 0X20
DELAY3 EQU 0X21
DELAY4 EQU 0X22
ORG 0X00
GOTO START

CLOCK
MOVLW 0X02
MOVWF PORTB ; CHAN E LEN MUC 1

MOVLW 0X00
MOVWF PORTB ; CHAN E XUONG MUC 0
RETLW 0

DELAY3S
CLRF TMR0
CLRF INTCON
BSF STATUS,RP0
CLRF 0X81
BCF STATUS,RP0
LOOPP
MOVF TMR0,0
XORLW .3
BTFSS STATUS,Z
GOTO LOOPP
BCF STATUS,RP0
RETLW 0


DELAY1
MOVLW D'2'
MOVWF DELAY2

CHO
MOVLW D'1'
MOVWF DELAY3
MOVLW D'1'
MOVWF DELAY4
D1
DECFSZ DELAY3
GOTO $+2
DECFSZ DELAY4
GOTO D1
DECFSZ DELAY2
GOTO CHO

RETLW 0
START

BCF STATUS,RP1
BSF STATUS,RP0

CLRF TRISB
CLRF TRISD

BCF STATUS,RP0
CLRF PORTB
CLRF PORTD

MOVLW 0X38
MOVWF PORTD ; CHON 8BIT 2 DONG FONT 5X8
CALL CLOCK

CALL DELAY1 ; CHO THUC HIEN XONG

MOVLW 0X0E
MOVWF PORTD
CALL CLOCK
CALL DELAY1 ; CHON HIEN THI HIEN THI CON TRO

; CHON CHE DO HIEN THI CHU THEO HUONG
MOVLW 0X04
MOVWF PORTD ; HIEN THI GIAM KHONG DAY CHU
CALL CLOCK
CALL DELAY1

; BAT DAU
MOVLW 0X01 ;
MOVWF PORTD
CALL CLOCK
CALL DELAY1

LPP
MOVLW 0xC9
MOVWF PORTD
CALL CLOCK
CALL DELAY1

BSF PORTB,0

MOVLW 0X55
MOVWF PORTD
MOVLW 0X03
MOVWF PORTB
MOVLW 0X01
MOVWF PORTB

CALL DELAY1

GOTO LPP
em sửa lại như sau thì nó chạy thôi:

PROCESSOR 16F877A
#INCLUDE "P16F877A.INC"
__CONFIG 0x3F72;cau hinh pic

DELAY2 EQU 0X20
DELAY3 EQU 0X21
DELAY4 EQU 0X22
ORG 0X00
GOTO START

CLOCK
BSF PORTB,1
call DELAY1
BcF PORTB,1
RETLW 0

DELAY3S
CLRF TMR0
CLRF INTCON
BSF STATUS,RP0
CLRF 0X81
BCF STATUS,RP0
LOOPP
MOVF TMR0,0
XORLW .3
BTFSS STATUS,Z
GOTO LOOPP
BCF STATUS,RP0
RETLW 0


DELAY1
MOVLW .4
MOVWF DELAY3
CHO
MOVLW .255
MOVWF DELAY2
DECFSZ DELAY2
GOTO $-1
DECFSZ DELAY3
GOTO CHO
RETLW 0
START

BCF STATUS,RP1
BSF STATUS,RP0

CLRF TRISB
CLRF TRISD

BCF STATUS,RP0
CLRF PORTB
CLRF PORTD

MOVLW 0X38
MOVWF PORTD ; CHON 8BIT 2 DONG FONT 5X8
CALL CLOCK

CALL DELAY1 ; CHO THUC HIEN XONG

MOVLW 0X0E
MOVWF PORTD
CALL CLOCK
CALL DELAY1 ; CHON HIEN THI HIEN THI CON TRO

; CHON CHE DO HIEN THI CHU THEO HUONG
MOVLW 0X04
MOVWF PORTD ; HIEN THI GIAM KHONG DAY CHU
CALL CLOCK
CALL DELAY1

; BAT DAU
MOVLW 0X01 ;xoa man hinh
MOVWF PORTD
CALL CLOCK
CALL DELAY1

LPP
BCF PORTB,0;hieu la lenh
MOVLW 0xC9;hang 2 cot 9
MOVWF PORTD
CALL CLOCK
BSF PORTB,0;hieu la data
MOVLW 0X55
MOVWF PORTD
CALL CLOCK
CALL DELAY1
GOTO LPP
end

manhdt3
14-09-2011, 02:06 AM
thank bác nhiều em thử được rùi ah!

ichitea606
03-12-2011, 05:13 PM
chào các pác: mình có vấn đề như vầy mong các pác nhiệt tình giúp đỡ với, lcd 20x4 mình mô phỏng thì ok nhưng khi làm thực tế thì k hiển thị dc chữ đôi khi hiển thị hàng loạt chữ tàu chạy lung tung với lcd16x2 ráp vào mạch lại chạy bình thường, mình nghỉ chắc do phần khởi tạo lcd chưa đúng thử hoài mà vẫn không được,mong được chỉ giúp
#include <16F877A.h>
#include <DEF_16F877A.h>
#device *=16 adc=10
#fuses NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NODEBUG, NOBROWNOUT,NOCPD, NOWRT
#use delay(clock=20000000)
#define RS RD6
#define RW RD5
#define E RD4

#define LCD PORTB
unsigned char pic[]="PIC 16F877A";
int16 i;
void CONTROL(void)
{
RS = 0;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
void WRITE(void)
{
RS = 1;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}

VOID TEN (VOID)
{
LCD = 0x80;
CONTROL();
i=0;
WHILE (i<=11)
{

LCD = pic[i];
WRITE();
i++;
}
}
void main(void)
{
set_tris_B(0);
set_tris_D(0);
delay_ms(100);

LCD = 0x38;
CONTROL();
DELAY_MS(50);
LCD = 0x38;
CONTROL();
DELAY_MS(1);
LCD = 0x38;
CONTROL();
LCD = 0x0C;
CONTROL();
LCD = 0x01;
CONTROL();
LCD = 0x06;
CONTROL();


WHILE(1)
{
TEN();
}
}

tdm
03-12-2011, 11:20 PM
chào các pác: mình có vấn đề như vầy mong các pác nhiệt tình giúp đỡ với, lcd 20x4 mình mô phỏng thì ok nhưng khi làm thực tế thì k hiển thị dc chữ đôi khi hiển thị hàng loạt chữ tàu chạy lung tung với lcd16x2 ráp vào mạch lại chạy bình thường, mình nghỉ chắc do phần khởi tạo lcd chưa đúng thử hoài mà vẫn không được,mong được chỉ giúp
#include <16F877A.h>
#include <DEF_16F877A.h>
#device *=16 adc=10
#fuses NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NODEBUG, NOBROWNOUT,NOCPD, NOWRT
#use delay(clock=20000000)
#define RS RD6
#define RW RD5
#define E RD4

#define LCD PORTB
unsigned char pic[]="PIC 16F877A";
int16 i;
void CONTROL(void)
{
RS = 0;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}
void WRITE(void)
{
RS = 1;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}

VOID TEN (VOID)
{
LCD = 0x80;
CONTROL();
i=0;
WHILE (i<=11)
{

LCD = pic[i];
WRITE();
i++;
}
}
void main(void)
{
set_tris_B(0);
set_tris_D(0);
delay_ms(100);

LCD = 0x38;
CONTROL();
DELAY_MS(50);
LCD = 0x38;
CONTROL();
DELAY_MS(1);
LCD = 0x38;
CONTROL();
LCD = 0x0C;
CONTROL();
LCD = 0x01;
CONTROL();
LCD = 0x06;
CONTROL();


WHILE(1)
{
TEN();
}
}
thử lại xem sao:

#include <16F877A.h>
#include <DEF_16F877A.h>
#device *=16 adc=10
#fuses NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NODEBUG, NOBROWNOUT,NOCPD, NOWRT
#use delay(clock=20000000)
#define RS RD6
#define RW RD5
#define E RD4

#define LCD PORTB
unsigned char pic[]="PIC 16F877A";
int16 i;
void CONTROL(void)
{
RS = 0;
RW = 0;
E = 1;
delay_ms(1);
E = 0;
}
void WRITE(void)
{
RS = 1;
RW = 0;
E = 1;
delay_ms(1);
E = 0;

}

VOID TEN (VOID)
{
LCD = 0x80;
CONTROL();
i=0;
WHILE (i<=11)
{

LCD = pic[i];
WRITE();
i++;
}
}
void main(void)
{
set_tris_B(0);
set_tris_D(0);
delay_ms(500);
LCD = 0x38;
CONTROL();
LCD = 0x0E;
CONTROL();
LCD = 0x06;
CONTROL();
LCD = 0x01;
CONTROL();
TEN();

WHILE(1)
{
}
}

ichitea606
04-12-2011, 09:28 AM
cám ơn bạn nhưng cũng thế ah, không hiện được chữ,hiện 2 dòng màu đen thui,y như chỉ có mỗi nguồn thôi,bí wa lên tìm thầy thầy đưa cho code làm hiển thị chữ,mô phỏng thì bình thường nhưng khi ráp thực tế LCD này từ 20x4 bây giờ chỉ con lại 10x2,nghĩa chữ cách chữ 1 ký tự (A B C) TDM biết chỉ giùm với
#include <16f877a.h>
#include <DEF_16F877A.h>
#DEVICE *=16 ADC=10
#fuses NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NODEBUG, NOBROWNOUT,NOCPD, NOWRT
#use delay(clock=12000000)
#define RS RD4
#define RW RD5
#define E RD6
#define lcd portb


//int SEC,MIN,HOUR,DAY,WEEK,MONTH,YEAR,TEST;
//int SECI,MINI,HOURI,DAYI,WEEKI,MONTHI,YEARI,TESTI,SECT EMP,CONTROL;


const unsigned char TEMP[]="TEMPERATURE ";
INT I;
void COMMON_LCD(VOID)
{ RW=0;
E=0;
E=1;
DELAY_MS(1);
RW=1;
RS=0;
E=0;
DELAY_MS(1);
E=1;
DELAY_MS(10); }

void COMMAND_WRITE(VOID) //WRITE DATA TO CONTROL LCD
{ RS=0;
COMMON_LCD(); }

void DATAWRITE(VOID) //WRITE DATA TO LCD TO DISPLAY
{ RS=1;
COMMON_LCD(); }

VOID SETUP_LCD (VOID)
{ E=1;
RS=0;
RW=0;

LCD=(0x38); //SETUP LCD DISPLAY TWO LINES
COMMAND_WRITE();
DELAY_MS(50);
LCD=(0x38); //SETUP LCD DISPLAY TWO LINES
COMMAND_WRITE();
DELAY_MS(1);
LCD=(0x38);
COMMAND_WRITE();
LCD=(0x0C); //SETUP DISPLAY CONTROL
COMMAND_WRITE();
LCD=(0x01); //CLEAR DISPLAY
COMMAND_WRITE();
LCD=(0x06);
COMMAND_WRITE();

}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXX

void main()
{
SET_TRIS_B(0x00); //SETUP PORT B IS OUTPUT
SET_TRIS_D(0x00);
SETUP_LCD ();
LCD=(0x80); //SETUT ADDRESS FOR FIRST LINE
COMMAND_WRITE();
DELAY_MS(50);
WHILE(I<=11)// TO DISPLAY A TEXT "TEMPERATURE"

{
LCD=TEMP[I];
DATAWRITE();
DELAY_MS(100);
I++;
}
}

ichitea606
04-12-2011, 04:13 PM
Cám ơn pac TDM nhiều lúc đầu nạp code của bạn vào không chạy được là do các chân hàn không được tốt,loay hoay mãi rút ra làm lại thì mạch chạy được tới 99%,vẫn còn 1 ký tự thừa hình chữ tàu nằm cuối cùng,dù sao cũng cảm ơn pác nhiệt tình giúp đỡ