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)
-   -   LCD nối vào PORTB có được không? (http://www.picvietnam.com/forum/showthread.php?t=5852)

hang1988 25-02-2010 05:31 PM

LCD nối vào PORTB có được không?
 
Em giao tiếp LCD 4 bit với PIC30F4011 như sau : D4 đến D7 nối tương đương với RB0 đến RB3. Còn EN với RB4, RW với RB5, RS với RB6. Em làm hoài mà ko được? làm theo ví dụ của anh Nam với các chân khác thì được khi lắp vào chân này ko được? Mong các anh giúp!
Thạch anh ngoài 10Mhz

Code:

#include <p30f4011.h>
#include <string.h> // Thu vien chuoi ki tu chuoi ki tu
#include <stdio.h>
#include <libpic30.h>


//------------------------------------ConFig cho DsPic-------------------
        _FOSC(CSW_FSCM_OFF & XT_PLL8);
        _FWDT(WDT_OFF);
        _FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
        _FGS(CODE_PROT_OFF);
        //_FOSC(CSW_FSCM_OFF & FRC_PLL8);
        //        _FWDT(WDT_OFF);
        //        _FBORPOR(PBOR_OFF & MCLR_EN & PWMxL_ACT_HI & PWMxH_ACT_HI);
        //        _FGS(CODE_PROT_OFF);
//-----------------------------------------------------------------------
#define ms_count 125
#define EN                        LATBbits.LATB4
#define EN_tris        TRISBbits.TRISB4
#define RW                        LATBbits.LATB5
#define RW_tris                TRISBbits.TRISB5
#define RS                        LATBbits.LATB6
#define RS_tris                TRISBbits.TRISB6

#define LCD_data        LATB
#define LCD_tris        TRISB

#define LCD_clear                0x01
#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 va dich man hinh
#define LCD_off                        0x08
#define LCD_on                        0x0C
#define LCD_on_blink        0x0F // bat man hinh va con tro nhap nhay
#define LCD_chedo                0x28 // che do man hinh 2 dong giao tiep 4 bit
#define LCD_homeL1                0x80 // ve dau dong 1
#define LCD_homeL2                0xC0 // Ve dau dong 2

unsigned char time_out;
void Init_Port(void);
void Init_TMR1(void);
void Delay_ms(unsigned int n);
void LCD_cmd(unsigned char cmd);
void LCD_export(unsigned char export);
void LCD_position(char x , char y);
void LCD_WriteString(const char *str);

int main()
        {
                Init_TMR1();
                Init_Port();               
                Init_LCD();
                LATFbits.LATF1=1;
                TRISFbits.TRISF1=0;

        while(1)
                {
                        LCD_Position(1,1);       
                        LCD_WriteString("Pic");
                        Delay_ms(1);
                //        LCD_Position(2,4);
                        //LCD_WriteString("Welcome!");
                //        Delay_ms(1);
LATFbits.LATF1=0;
__delay32(900000);
LATFbits.LATF1=1;
__delay32(900000);
                        }
}

void Init_TMR1(void)
        {
                TMR1=0; // xoa dem trong timer
                PR1 = ms_count;
                _T1IF = 0;
                T1CON = 0x0020; // 1:64
            _T1IE=1; // cho phep ngat timer
        } 
void Init_Port(void)
        {
                LCD_data &= 0xFFF0;
                LCD_tris = 0xFFF0; // Chan du lieu LCD la ngo ra
                EN = 0;
                EN_tris = 0;       
                RW = 0;
                RW_tris = 0;
                RS = 0;
            RS_tris = 0;
        }
void Delay_ms(unsigned int n)
        {
        __delay32(1000*n);
//        PR1=n*ms_count;
                //time_out=0;
                //T1CONbits.TON=1; // bat timer 1
                //while(time_out==0);
                //T1CONbits.TON=0;
                //TMR1 = 0;
        }
void Init_LCD(void)
        {
                LCD_cmd(LCD_chedo);
                Delay_ms(1);
                LCD_cmd(LCD_off);
                Delay_ms(1);
                LCD_cmd(LCD_normal);
                Delay_ms(1);
                LCD_cmd(LCD_on_blink);
                Delay_ms(1);
                LCD_cmd(LCD_clear);
                Delay_ms(1);
        }
void LCD_cmd(unsigned char cmd)
        {
                unsigned temp1,i;
                RW = 0;
                RS=0;
                temp1 = LCD_data & 0xFFF0;
                LCD_data = temp1|(cmd>>4); // Xuat 4 bit cao
                EN = 1;
                for(i=0;i<2;i++);
                EN=0;
                temp1 = LCD_data & 0xFFF0;
                LCD_data = temp1|(cmd & 0x0F);
                EN = 1;
                for(i=0;i<2;i++);
                EN = 0;
        }
void LCD_export(unsigned char export)
        {
                unsigned temp2,i1;
                RW=0;
                RS=1;
                temp2 = LCD_data & 0xFFF0;
                LCD_data = temp2|(export>>4); // Xuat 4 bit cao
                EN = 1;
                for(i1=0;i1<2;i1++);
                EN=0;
                temp2 = LCD_data & 0xFFF0;
                LCD_data = temp2|(export&0x0F);
                EN = 1;
                for(i1=0;i1<2;i1++);
                EN = 0;
        }
void _ISR _T1Interrupt(void)
        {
                _T1IF = 0 ; // xoa co ngat
                time_out = 1;
        }
void LCD_Position(char x, char y)
        {
                                if(x==1)
                        {
                                LCD_cmd(LCD_homeL1+y-1);
                                Delay_ms(10);
                        }
                else
                        {
                                LCD_cmd(LCD_homeL2+y-1);
                                Delay_ms(10);
                        }
        return;
        }
void LCD_WriteString(const char *str)
{

        char ps;
        ps = *str;               
        while(ps>0)               
        {
                str++;                       
                if (ps==0) break;
                Delay_ms(1);
                LCD_export(ps);               
            ps = *str;               
        }
}


namqn 25-02-2010 10:19 PM

Nếu dùng port B thì bạn phải tắt chức năng analog (mặc định) của các chân này, bằng cách bật các bit 0 đến 6 của thanh ghi ADPCFG.

Thân,


Múi giờ GMT. Hiện tại là 09:51 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