PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   dsPIC Tutorial 3-Đọc ngõ vào và giao tiếp LCD (http://www.picvietnam.com/forum/showthread.php?t=553)

silvadk2 25-03-2009 10:14 PM

:(. Hic, anh nam có thể viết cho em chương trình con xuất lệnh và dữ liệu ở chế độ 8bit bằng C30 không ạ.

namqn 25-03-2009 10:17 PM

Trích:

Nguyên văn bởi silvadk2 (Post 23997)
:(. Hic, anh nam có thể viết cho em chương trình con xuất lệnh và dữ liệu ở chế độ 8bit bằng C30 không ạ.

Việc này còn đơn giản hơn so với chế độ 4-bit nữa, bạn thử suy nghĩ một chút xem. Tôi đảm bảo có nhiều bạn thành viên trên diễn đàn này có thể giúp bạn, không nhất thiết phải là tôi đâu.

Thân,

silvadk2 25-03-2009 10:19 PM

phần cứng của em là nối RB0->RB7 với D0-D7. còn RS,RW, và E nối với RF6,RF3, và RF2.

silvadk2 25-03-2009 10:29 PM

void LCD_CMD(unsigned char CMD)
{
// LCDdelayms(1);
LCD_RW=0;
LCD_RS = 0;
LCD_DATA = CMD;
LCD_EN = 1; ShortDelay(); LCD_EN = 0; //Xung Enable
}
Em nghĩ là như thế này, có đúng ko bác !

namqn 25-03-2009 11:31 PM

Trích:

Nguyên văn bởi silvadk2 (Post 24001)
void LCD_CMD(unsigned char CMD)
{
// LCDdelayms(1);
LCD_RW=0;
LCD_RS = 0;
LCD_DATA = CMD;
LCD_EN = 1; ShortDelay(); LCD_EN = 0; //Xung Enable
}
Em nghĩ là như thế này, có đúng ko bác !

Code của bạn là ổn rồi. Bạn nhớ thay đổi các phần #define cho các chân RW, RS, EN, và 8-bit dữ liệu cho phù hợp với phần cứng của bạn, và đảm bảo là các bit TRIS tương ứng với 8-bit dữ liệu được thiết lập một cách thích hợp.

Thân,

silvadk2 26-03-2009 12:44 AM

Hic, đây là code của em, biên dịch thì ko lỗi, nhưng nạp vào thì chẳng thấy LCD viết gì anh ạ, chán thế .

Code:

#include        <p30f4011.h>
#include        <string.h>

_FOSC(CSW_FSCM_OFF & HS);       
_FWDT(WDT_OFF);                               
_FBORPOR(MCLR_EN & PBOR_ON & BORV_27);
_FGS(CODE_PROT_OFF);               

#define                LCD_EN                LATFbits.LATF2                //Tin hieu Enable cho LCD, chan RF2
#define                LCD_RS                LATFbits.LATF6                //Tin hieu Reset cho LCD, chan RF6
#define                LCD_RW                LATFbits.LATF3                //Tin hieu doc ghi cho LCD, chan RF3
#define                RW_TRIS          TRISFbits.TRISF3
#define                RS_TRIS                TRISFbits.TRISF6
#define                E_TRIS                TRISFbits.TRISF2
#define                LCD_PORTB        PORTB
#define                LCD_DATA        LATB                                //Cac tin hieu Data cho LCD
#define                LCD_TRIS        TRISB                                //Tristate cua cac tin hieu Data cho LCD

#define                LCD_CLEAR                0x01                //Xoa man hinh LCD
#define                LCD_HOME                0x02                //Tro ve dau dong
#define                LCD_NORMAL                0x06                //Che do nhap du lieu binh thuong
#define                LCD_NORMAL_S        0x07                //Che do nhap du lieu binh thuong, dich man hinh
#define                LCD_OFF                0x08                //Tat man hinh
#define                LCD_ON                        0x0C                //Bat man hinh
#define                LCD_ON_CRSR        0x0E                //Bat man hinh va con tro
#define                LCD_ON_BLINK        0x0F                //Bat man hinh va con tro (nhap nhay)
#define                LCD_8B2L                0x38                //Che do 2 dong, giao tiep 8 bit du lieu
#define                LCD_HOMEL1                0x80                //Ve dau dong 1
#define                LCD_HOMEL2                0xC0                //Ve dau dong 2

#define                ShortDelay()        {Nop() Nop() Nop() Nop() Nop() Nop() Nop() Nop() Nop()}
//***************************************************************************//


//***************************************************************************//
//
//        Function:                LCDdelayms
//        Description:        LCDdelayms for LCD               
//        Input:                        Number of ms
//        Output:                        None
//
//***************************************************************************//
void LCDdelayms(unsigned int ms)
{
        #define                FCY                                2500*4
        unsigned int i=0;
        while(ms--){while(++i<FCY/7);        i=0;}
}
//*************************** END OF LCDDELAYMS ****************************//

void LCD_CMD(unsigned char CMD)
{

        LCD_RW=0;
        LCD_RS = 0;       
    LCD_DATA = CMD;                                               
        LCD_EN = 1;        ShortDelay();        LCD_EN = 0;
               
}
//************************* End of LCD_CMD *********************************//

void LCD_DAT(unsigned char DATA)
{
        LCD_RW=0;
        LCD_RS = 1;       
    LCD_DATA = DATA;                                               
        LCD_EN = 1;        ShortDelay();        LCD_EN = 0;        //Xung Enable
       
}
//****************************** END OF LCD_DATA ****************************//



void InitLCD(void)
{
        LCD_CMD(LCD_8B2L);                        //Dat che do giao tiep 8-bit, man hinh 2 dong
        LCDdelayms(1);
        LCD_CMD(LCD_8B2L);                        //Dat che do giao tiep 8-bit, man hinh 2 dong
        LCDdelayms(1);
        LCD_CMD(LCD_8B2L);                        //Dat che do giao tiep 8-bit, man hinh 2 dong
        LCDdelayms(1);
        LCD_CMD(LCD_OFF);                        //Tat man hinh
        LCDdelayms(1);
        LCD_CMD(LCD_CLEAR);                        //Xoa man hinh
        LCDdelayms(1);
        LCD_CMD(LCD_ON);                        //Bat man hinh
        LCDdelayms(1);
        LCD_CMD(LCD_NORMAL);                //Che do nhap lieu binh thuong
                                                                //Cursor move Increment, Not to shift the display
        LCDdelayms(1);
        LCD_CMD(LCD_CLEAR);                        //Xoa man hinh
        LCDdelayms(5);
}
//************************** END OF InitLCD *********************************//

void LCD_PutChar(unsigned char character)
{
       
        LCD_DAT(character);
        LCDdelayms(1);
}
//************************** END of LCD_PutChar *****************************//

void LCD_WriteString(const char *str)
{
//        LCDdelayms(1);
        char ps;
        ps = *str;               
        while(ps>0)               
        {
                str++;                       
                if (ps==0) break;
                LCDdelayms(1);
                LCD_DAT(ps);               
            ps = *str;               
        }       
}
//*********************** END OF LCD_Writestring ****************************//



void LCD_Gotoxy(char x, char y)
{
        char tg;
        LCDdelayms(5);
    switch (y)
        {
                case 1:tg = 0x80+x;
                        break;
                case 2:tg = 0xC0+x;
                        break;
    }
        LCD_CMD(tg);
}
//************************* END OF LCD_Gotoxy *******************************//

void LCD_Clear(void)
{
        LCD_CMD(LCD_CLEAR);
}

void SystemInit(void)
{
        //Init IO
        TRISB = TRISB & 0xFF00;                //RB0..RB7 Output.
        TRISFbits.TRISF6 = 0;               
        TRISFbits.TRISF2 = 0;               
        TRISFbits.TRISF3 = 0;               
        LATB = 0xFF00;
        LATFbits.LATF6 = 0;               
        LATFbits.LATF2 = 0;
        LATFbits.LATF3 = 0;               
                //InitLCD
        InitLCD();
}
//******************************* End of SystemInit *************************//

int main(void)
{
        SystemInit();
        LCD_Gotoxy(1,1);        //Nhay den vi tri cot 1, dong 1.
        LCD_WriteString("picvietnam");       
        LCDdelayms(10);
        LCD_Gotoxy(3,2);        //Nhay den vi tri cot 3, dong 2.
        LCD_WriteString("dspic");
       
        while(1);                //Dung chuong trinh.
}
//********************************* End of Main *****************************//


namqn 26-03-2009 01:27 AM

Chắc gì hàm LCD_WriteString() của bạn chạy đúng ý đồ (có chắc là bạn thay đổi được giá trị của tham số str hay không). Sao bạn không thử hàm lcd_putstr() của bạn tungtuantu ở trang 2 của luồng này (code đó đã thử nghiệm rồi).

Bạn nên thử xuất 1 ký tự duy nhất ra vị trí hiện tại trước, rồi thử di chuyển con trỏ, sau đó thử xuất 1 chuỗi ký tự với một hàm đáng tin cậy.

Các chú thích của bạn khi gọi LCD_gotoxy() cũng không chính xác đâu, cột 1 ứng với x = 0 đấy.

Thân,

silvadk2 26-03-2009 02:20 AM

hic, em đã thử với cả hàm lcd_putstr() rồi mà ko được. Với lại, cái hàm LCD_WriteString() em đã dùng ở chế độ 4 bit, chạy ngon mà. Có khi nào do phần cứng không bác nhỉ .

namqn 26-03-2009 05:16 AM

Trích:

Nguyên văn bởi silvadk2 (Post 24013)
hic, em đã thử với cả hàm lcd_putstr() rồi mà ko được. Với lại, cái hàm LCD_WriteString() em đã dùng ở chế độ 4 bit, chạy ngon mà. Có khi nào do phần cứng không bác nhỉ .

Vậy sơ đồ phần cứng của bạn ra sao? Tôi nghĩ rằng bạn đã hiện thực thành công ở chế độ 4 bit thì module LCD và mạch ứng dụng PIC của bạn đã ổn rồi. Tuy nhiên, nếu bạn muốn chúng tôi xem lại mạch nguyên lý cho bạn thì bạn cứ post sơ đồ lên.

Thân,

namqn 26-03-2009 05:35 AM

Trích:

Nguyên văn bởi silvadk2 (Post 24013)
hic, em đã thử với cả hàm lcd_putstr() rồi mà ko được. Với lại, cái hàm LCD_WriteString() em đã dùng ở chế độ 4 bit, chạy ngon mà. Có khi nào do phần cứng không bác nhỉ .

Tôi vừa xem lại code của bạn, để dùng các chân RB0..RB7 như ngõ ra digital thì bạn phải bật 8 bit thấp của thanh ghi ADPCFG lên '1' (ADPCFG = ADPCFG | 0x00FF chẳng hạn) trước khi dùng các chân này cho giao tiếp với LCD.

Thân,

silvadk2 26-03-2009 12:05 PM

hic, em thử rồi mà vẫn ko được là sao nhỉ ?

silvadk2 26-03-2009 01:08 PM

Oa oa anh ơi, được rồi . Ha ha, thank anh nhiều lắm . May quá, em sửa mãi mà ko được, giờ mới được.

silvadk2 27-03-2009 11:32 AM

à, em còn 1 vấn đề là, em ghi giá trị đọc được từ ADC vào biến ADCvalue, sau đó, em dùng hàm chuyển đổi kiểu :
sprintf(Nhietdo, "%d",ADCvalue );
rồi dùng lệnh lcd_putstr(Nhietdo) (Hàm của anh Nam viết ở trang 2) để hiển thị lên LCD mà ko thấy gì cả. Anh xem hộ em mới

namqn 27-03-2009 05:13 PM

Trích:

Nguyên văn bởi silvadk2 (Post 24068)
à, em còn 1 vấn đề là, em ghi giá trị đọc được từ ADC vào biến ADCvalue, sau đó, em dùng hàm chuyển đổi kiểu :
sprintf(Nhietdo, "%d",ADCvalue );
rồi dùng lệnh lcd_putstr(Nhietdo) (Hàm của anh Nam viết ở trang 2) để hiển thị lên LCD mà ko thấy gì cả. Anh xem hộ em mới

Bạn khai báo Nhietdo như thế nào?

Thân,

ltpbkis 31-03-2009 05:16 PM

Nhờ các bác xem dùm!
 
Em code lại chương trình của bác Tungtuantu, thay RW-RB6; RS-RB7; EN-RC15; RD0-DB4; RD1-DB5; RD2-DB6; RD3-DB7
Em sử dụng thạch anh 7.3728, lCD của em la C1602a, chân của DSpic em nối trực tiếp với chân của LCD.
Em thay đổi chương trình lại như sau. Nhưng khi nạp vào thì mạch ko chạy.
Các bác xem dùm em với. Em mới bước chân vào nghề....
Em có làm gì sai ko các bác??????????


Code:

#include "p30f4011.h"

        _FOSC(CSW_FSCM_OFF & FRC_PLL16);               
        _FWDT(WDT_OFF);
        _FBORPOR(MCLR_EN & PBOR_OFF & PWMxL_ACT_HI & PWMxH_ACT_HI);
        _FGS(CODE_PROT_OFF);

//------------------------------------------------------------------------------
//Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)

#define        ms_count        125                        //So dem tuong ung voi 1 ms, cho timer 1


#define        LCD_EN        _LATC15               
#define        LCD_RW        _LATB6                       
#define        LCD_RS        _LATB7                       
               
#define LCD_D4  _LATD0                //Cac tin hieu Data cho LCD, chan (D4..D7)
#define LCD_D5  _LATD1
#define LCD_D6  _LATD2
#define LCD_D7  _LATD3
       
#define        TRIS_LCD_D4        _TRISD0        //Tristate cua cac tin hieu Data cho LCD
#define        TRIS_LCD_D5        _TRISD1
#define        TRIS_LCD_D6        _TRISD2
#define        TRIS_LCD_D7        _TRISD3

#define        LCD_clear        0x01                //Xoa man hinh LCD
#define        LCD_home        0x02                //Tro ve dau dong
#define        LCD_normal        0x06                //Che do nhap du lieu binh thuong
#define        LCD_normal_s        0x07        //Che do nhap du lieu binh thuong, dich man hinh
#define        LCD_off        0x08                //Tat man hinh
#define        LCD_on                0x0C                //Bat man hinh
#define        LCD_on_crsr 0x0E                //Bat man hinh va con tro
#define        LCD_on_blink 0x0F                //Bat man hinh va con tro (nhap nhay)
#define        LCD_4b2l        0x28                //Che do 2 dong, giao tiep 4 bit du lieu
#define        LCD_homeL1        0x80                //Ve dau dong 1
#define        LCD_homeL2        0xC0                //Ve dau dong 2
#define lcd_line_two 0x40

//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);                                //Khoi tao cac cong I/O
void Delay_ms(unsigned int);                //Tao tre n ms
void Init_LCD(void);                                //Khoi tao LCD
void LCD_cmd4(unsigned char);                //Xuat lenh ra LCD qua giao tiep 4-bit
void LCD_dat4(unsigned char);                //Xuat du lieu ra LCD qua giao tiep 4-bit
void lcd_putstr(char *buffer);                //Xuat 1 ky tu hay 1 chuoi ky tu
void lcd_gotoxy(int x, int y );                //Nhay den cot x, hang y


//------------------------------------------------------------------------------
//Chuong trinh chinh
void main()
{
        _TRISE3 = 0;
                                       
        Init_PORTS();                                //Khoi tao cac cong I/O
        Init_LCD();                                        //Khoi tao LCD       
    lcd_putstr("NGUYEN THE TUNG");
        lcd_gotoxy(4,2);
        lcd_putstr("DTD45-DH1");
        while (1)
        {       
                _LATE3=1;
                Delay_ms(250);                //Vong lap chinh
                _LATE3=0;
                Delay_ms(250);
        }
}


//Chuong trinh con khoi tao cac cong I/O, de noi voi LED
//------------------------------------------------------------------------------
void Init_PORTS(void)
{
        LCD_D4 = 0;                                //Xoa cac bit chot du lieu LCD
        LCD_D5 = 0;
        LCD_D6 = 0;
        LCD_D7 = 0;
       
        TRIS_LCD_D4 = 0;                //Cac chan du lieu LCD la ngo ra
        TRIS_LCD_D5 = 0;
        TRIS_LCD_D6 = 0;
        TRIS_LCD_D7 = 0;
       
        LCD_EN = 0;
        _TRISC15 = 0;                        //RE8 la ngo ra, noi vao Enable cua LCD
        LCD_RW = 0;
        _TRISB6 = 0;                        //RD0 la ngo ra, noi vao R/W cua LCD
        LCD_RS = 0;
        _TRISB7 = 0;                        //RD1 la ngo ra, noi vao Reset cua LCD
}

//Chuong trinh con delay bang timer 1, tre n ms
//TMR1 duoc dung de dem so ms troi qua, o muc xung 8 Mips (fcy = 8 MHz)
//------------------------------------------------------------------------------
void Delay_ms(unsigned int n)
{
        TMR1 = 0;                                        //Xoa so dem trong TMR1
        T1CON = 0x0020;                                //Dung fcy lam clock, prescale = 1:64, tat Timer 1
        PR1 = n*ms_count;                        //Dat nguong tran vao PR1                                                       
        T1CONbits.TON = 1;                        //Bat timer 1
        while (!_T1IF );                        //Cho den khi het thoi gian cho
        _T1IF = 0;                                        //Xoa co ngat cua Timer 1
        T1CONbits.TON = 0;                        //Tat timer 1
       
}

//Chuong trinh con khoi tao module LCD
//------------------------------------------------------------------------------
void Init_LCD(void) {
        LCD_cmd4(LCD_4b2l);                        //Dat che do giao tiep 4-bit, man hinh 2 dong
        Delay_ms(1);
        LCD_cmd4(LCD_off);                        //Tat man hinh
        Delay_ms(1);
        LCD_cmd4(LCD_normal);                //Che do nhap du lieu binh thuong
        Delay_ms(1);
        LCD_cmd4(LCD_on);                        //Bat man hinh, hien con tro nhap nhay
        Delay_ms(1);
        LCD_cmd4(LCD_clear);                //Xoa man hinh
        Delay_ms(5);

}

//Chuong trinh con xuat lenh o che do 4 bit
//------------------------------------------------------------------------------
void LCD_cmd4(unsigned char cmd) {
        unsigned temp1, i;
        LCD_RW = 0;
        LCD_RS = 0;                                        //Dat che do xuat lenh
        temp1 = cmd >> 4;                        //Lay 4 bit cao
        LCD_D4 = temp1 & 1;                        //Xuat 4 bit cao
        LCD_D5 = (temp1 & 2) >>1;
        LCD_D6 = (temp1 & 4) >>2;
        LCD_D7 = (temp1 & 8) >>3;
        LCD_EN = 1;                                        //Tao xung Enable
        for (i = 0; i < 2; i++);        //keo dai toi thieu 1 us
        LCD_EN = 0;
        temp1 = cmd & 0x0F;                        //Lay 4 bit thap
        LCD_D4 = temp1 & 1;                        //Xuat 4 bit thap
        LCD_D5 = (temp1 & 2) >>1;
        LCD_D6 = (temp1 & 4) >>2;
        LCD_D7 = (temp1 & 8) >>3;
        LCD_EN = 1;                //Tao xung Enable
        for (i = 0; i < 2; i++);        //keo dai toi thieu 1 us
        LCD_EN = 0;
}

//Chuong trinh con xuat du lieu o che do 4 bit
//------------------------------------------------------------------------------
void LCD_dat4(unsigned char dat) {
        unsigned temp2, i;
        LCD_RW = 0;
        LCD_RS = 1;                                        //Dat che do xuat du lieu
        temp2 = dat >> 4;                        //Lay 4 bit cao
        LCD_D4 =  temp2 & 1;                //Xuat 4 bit cao
        LCD_D5 = (temp2 & 2) >>1;
        LCD_D6 = (temp2 & 4) >>2;
        LCD_D7 = (temp2 & 8) >>3;
        LCD_EN = 1;                                        //Tao xung Enable
        for (i = 0; i < 2; i++);        //keo dai toi thieu 1 us
        LCD_EN = 0;
        temp2 = dat & 0x0F;                        //Lay 4 bit thap
        LCD_D4 =  temp2 & 1;                //Xuat 4 bit thap
        LCD_D5 = (temp2 & 2) >>1;
        LCD_D6 = (temp2 & 4) >>2;
        LCD_D7 = (temp2 & 8) >>3;
        LCD_EN = 1;                                        //Tao xung Enable
        for (i = 0; i < 2; i++);        //keo dai toi thieu 1 us
        LCD_EN = 0;
}
//Chuong trinh con xuat 1 ky tu hay 1 chuoi ky tu
//------------------------------------------------------------------------------
void lcd_putstr(char *buffer)
{

    while(*buffer != '\0')
    {
        LCD_dat4(*buffer);        /* calling another function */
                                /* to write each char to the lcd module */
        buffer++;
                Delay_ms(1);
               
    }
}
//Chuong trinh con nhay den cot x, dong y
//------------------------------------------------------------------------------
void lcd_gotoxy(int x, int y)
{
        int address;
       
        if(y != 1) address = lcd_line_two;
        else address=0;
       
        address += x-1;
        LCD_cmd4( 0x80 | address);
        Delay_ms(1);
}



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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam