![]() |
|
Tài trợ cho PIC Vietnam |
||||||||
| dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC |
![]() |
|
|
Ðiều Chỉnh | Xếp Bài |
|
|
|
|
#1 |
|
Đệ tử 6 túi
Tham gia ngày: Apr 2006
Bài gửi: 125
: |
Lệnh LCD_CMD(LCD_4B2L); chỉ là một lệnh gọi hàm mà tham số vào là LCD_4B2L, nghĩa là send đến LCD mã lệnh LCD_4B2L đây là một mã lệnh đã được định nghĩa trước bằng lệnh #define LCD_4B2L gia_tri; còn giá trị này bằng bao nhiêu thì bạn phải đọc lại phần LCD
|
|
|
|
|
|
#2 |
|
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 42
: |
uh, mình hiểu rồi, cảm ơn bạn nha !
|
|
|
|
|
|
#3 |
|
Đệ tử 1 túi
Tham gia ngày: Sep 2007
Bài gửi: 12
: |
Mình viết đoạn code này để xuất một chuỗi kí tự và số lên trên máy tính, quá trình truyền là ok. Tuy nhiên, khi dùng hàm delay_us hay delay_ms qua trình truyền lại không xảy ra.
Đây là code : #include<p33fj256gp710.h> #include<stdio.h> _FOSCSEL(FNOSC_FRC); // Internal FRC oscillator _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_NONE); // Clock Switching is enabled and Fail Safe Clock Monitor is disabled // OSC2 Pin Function: OSC2 is Clock Output // Primary Oscillator Mode: XT Crystal //unsigned int a,b,c,d; #define ms_count 125 ; unsigned int time_out,m,x,y; unsigned char sbuf[200],c='C',t='T'; void __attribute__ ((interrupt, no_auto_psv)) _U1RXInterrupt(void) { LATA = U1RXREG; IFS0bits.U1RXIF = 0; //interrupt request has not occurred } void __attribute__ ((interrupt, no_auto_psv)) _U1TXInterrupt(void) { IFS0bits.U1TXIF = 0; } void InitClock() { PLLFBD = 38; // M = 40 CLKDIVbits.PLLPOST = 0; // N1 = 2 CLKDIVbits.PLLPRE = 0; // N2 = 2 OSCTUN = 0;//khong su dung oscillator tuning register RCONbits.SWDTEN = 0; // disabe watch dog timer // Clock switch to incorporate PLL __builtin_write_OSCCONH(0x01); // Initiate Clock Switch to FRC with PLL (NOSC=0b001) // luu y : doc thanh ghi OSCCON de thay __builtin_write_OSCCONL(0x01); // Start clock switching //ghi lan luot vao 8 bit cao va thap cua OSCCON while (OSCCONbits.COSC != 0b001); // Wait for Clock switch to occur while(OSCCONbits.LOCK != 1) {}; //pll lock status bit } void InitUART1() { // configure U2MODE U1MODEbits.UARTEN = 0; // Bit15 TX, RX DISABLED, ENABLE at end of func //U2MODEbits.notimplemented; // Bit14 U1MODEbits.USIDL = 0; // Bit13 Continue in Idle U1MODEbits.IREN = 0; // Bit12 No IR translation U1MODEbits.RTSMD = 0; // Bit11 Simplex Mode //U1MODEbits.notimplemented; // Bit10 U1MODEbits.UEN = 0; // Bits8,9 TX,RX enabled, CTS,RTS not U1MODEbits.WAKE = 0; // Bit7 No Wake up (since we don't sleep here) U1MODEbits.LPBACK = 0; // Bit6 No Loop Back U1MODEbits.ABAUD = 0; // Bit5 No Autobaud (would require sending '55') U1MODEbits.URXINV = 0; // Bit4 IdleState = 1 (for dsPIC) U1MODEbits.BRGH = 0; // Bit3 16 clocks per bit period U1MODEbits.PDSEL = 0; // Bits1,2 8bit, No Parity U1MODEbits.STSEL = 0; // Bit0 One Stop Bit // Baud Rate Generator is for 9600. // See section 19.3.1 of datasheet. // U1BRG = (Fcy/(16*BaudRate))-1 // U1BRG = (37M/(16*9600))-1 // U1BRG = 240 U1BRG = 239; // 40Mhz osc, 9600 Baud, baud rate = Fcy/[16x(UxBRG+1)] // Load all values in for U1STA SFR U1STAbits.UTXISEL1 = 0; //Bit15 Int when Char is transferred (1/2 config!) U1STAbits.UTXINV = 0; //Bit14 N/A, IRDA config U1STAbits.UTXISEL0 = 0; //Bit13 Other half of Bit15 //U2STAbits.notimplemented = 0; //Bit12 U1STAbits.UTXBRK = 0; //Bit11 Disabled U1STAbits.UTXEN = 0; //Bit10 TX pins controlled by periph U1STAbits.UTXBF = 0; //Bit9 *Read Only Bit* U1STAbits.TRMT = 0; //Bit8 *Read Only bit* U1STAbits.URXISEL = 0; //Bits6,7 Int. on character recieved U1STAbits.ADDEN = 0; //Bit5 Address Detect Disabled U1STAbits.RIDLE = 0; //Bit4 *Read Only Bit* U1STAbits.PERR = 0; //Bit3 *Read Only Bit* U1STAbits.FERR = 0; //Bit2 *Read Only Bit* U1STAbits.OERR = 0; //Bit1 *Read Only Bit* U1STAbits.URXDA = 0; //Bit0 *Read Only Bit* IPC7 = 0x4400; // Mid Range Interrupt Priority level, no urgent reason IFS0bits.U1TXIF = 0; // Clear the Transmit Interrupt Flag IEC0bits.U1TXIE = 1; // Enable Transmit Interrupts IFS0bits.U1RXIF = 0; // Clear the Recieve Interrupt Flag IEC0bits.U1RXIE = 1; // Enable Recieve Interrupts U1MODEbits.UARTEN = 1; // And turn the peripheral on U1STAbits.UTXEN = 1; } int main(void) { InitClock(); // This is the PLL settings InitUART1(); // Initialize UART2 for 9600,8,N,1 TX/RX while(1){ // The ever versatile Infinite Loop! sprintf(sbuf,"%c%c %i %i %i %i %i %i \n",'T','C',20,40,40,60,30,10); putsUART1(sbuf); } } /************************************************** ************************* * Function Name : putsUART1 * * Description : This function puts the data string to be transmitted * * into the transmit buffer (till NULL character) * * Parameters : unsigned int * address of the string buffer to be * * transmitted * * Return Value : None * ************************************************** *************************/ void putsUART1(unsigned int *buffer) { char * temp_ptr = (char *) buffer; /* transmit till NULL character is encountered */ if(U1MODEbits.PDSEL == 3) /* check if TX is 8bits or 9bits */ { while(*buffer != '\0') { while(U1STAbits.UTXBF); /* wait if the buffer is full */ U1TXREG = *buffer++; /* transfer data word to TX reg */ delay_us(100); } } else { while(*temp_ptr != '\0') { while(U1STAbits.UTXBF); /* wait if the buffer is full */ U1TXREG = *temp_ptr++; /* transfer data byte to TX reg */ delay_us(100); } } } /************************************************** ***************************************** //Function: void Init_TMR1(void) //Input: None //Output: Setup Parameter to Timer1 Operate // TMR1 use for delay ************************************************** *****************************************/ void Init_TMR1(void) { T1CONbits.TON=0; //Stop Timer1 T1CONbits.TGATE=0; //Disable Gated Timer mode T1CONbits.TCKPS=2; //Select Prescale 1:1 T1CONbits.TCS=0; //Internal clock PR1=ms_count; _T1IF=0; _T1IE=1; TMR1=0; } /************************************************** ***************************************** //Function: void delay_us(unsigned int n) //Input: n: n us to delay //Output: Delay n us ************************************************** *****************************************/ void delay_us(unsigned int n) { PR1=n*ms_count; time_out=0; T1CONbits.TON=1; while(time_out==0); T1CONbits.TON = 0; TMR1=0; } /************************************************** ***************************************** //Function: void delay_ms(unsigned int n) //Input: n: n ms to delay //Output: Delay n ms ************************************************** *****************************************/ void delay_ms(unsigned int n) { unsigned int i; i=0; while(i<=n) { delay_us(1000); i++; } } void _ISR _T1Interrupt(void) { _T1IF = 0; //Clear Timer1 flag time_out = 1; } |
|
|
|
|
|
#4 | |
|
Trưởng lão PIC bang
|
Trích:
Bạn có hàm Init_TMR1() trong source code, nhưng không hề gọi nó trong main(), vậy Timer 1 sẽ được thiết lập ra sao? Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
|
|
|
|
|
#5 |
|
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 42
: |
. 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 ạ. |
|
|
|
|
|
#6 | |
|
Trưởng lão PIC bang
|
Trích:
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
|
|
|
|
|
#7 |
|
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 42
: |
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.
|
|
|
|
|
|
#8 |
|
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 42
: |
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 ! |
|
|
|
|
|
#9 | |
|
Trưởng lão PIC bang
|
Trích:
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
|
|
|
|
|
#10 |
|
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 42
: |
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 *****************************//
thay đổi nội dung bởi: namqn, 26-03-2009 lúc 01:28 AM. |
|
|
|
|
|
#11 |
|
Trưởng lão PIC bang
|
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,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
|
|
|
|
#12 |
|
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 42
: |
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ỉ .
|
|
|
|
|
|
#13 | |
|
Trưởng lão PIC bang
|
Trích:
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
|
|
|
|
|
#14 | |
|
Trưởng lão PIC bang
|
Trích:
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
|
|
|
|
|
#15 |
|
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 42
: |
hic, em thử rồi mà vẫn ko được là sao nhỉ ?
|
|
|
|
![]() |
| Tags |
| alphanumeric lcd, input read |
| Ðiều Chỉnh | |
| Xếp Bài | |
|
|
Similar Threads
|
||||
| Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
| Học CCS thông qua Tutorial PICVIETNAM | FFGmember | Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) | 105 | 08-09-2017 04:12 PM |
| dsPIC Tutorial 2-Các kỹ thuật cơ bản | namqn | dsPIC - Bộ điều khiển tín hiệu số 16-bit | 33 | 17-10-2013 11:09 PM |
| dsPIC Tutorial 5-Module ADC và MCPWM | namqn | dsPIC - Bộ điều khiển tín hiệu số 16-bit | 83 | 12-09-2013 10:33 PM |
| dsPIC Tutorial 1-Tạo và biên dịch một project (ASM30) | namqn | dsPIC - Bộ điều khiển tín hiệu số 16-bit | 16 | 22-08-2012 12:35 AM |
| dsPIC Tutorial 4-Module UART và I2C | namqn | dsPIC - Bộ điều khiển tín hiệu số 16-bit | 76 | 09-05-2012 10:55 AM |