PDA

View Full Version : LCD nối vào PORTB có được không?


hang1988
25-02-2010, 05:31 PM
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

#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,