|
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 |
31-01-2013, 04:33 PM | #3 |
Đệ tử 1 túi
Tham gia ngày: Nov 2010
Bài gửi: 23
: |
Bạn tham khảo code này nhé. chip của bạn và chíp của mình gần giống nhau. Bạn chỉ cần thay đổi chân kết nối nữa là dc
#include "p33FJ64MC802.h" _FOSCSEL(FNOSC_FRC); _FOSC(FCKSM_CSECMD&OSCIOFNC_OFF&POSCMD_NONE); _FICD(ICS_PGD1&JTAGEN_OFF); _FWDT(FWDTEN_OFF); #define LCD_RS LATBbits.LATB13 #define LCD_RW LATBbits.LATB14 #define LCD_E LATBbits.LATB15 #define LCD_D4 LATBbits.LATB2 #define LCD_D5 LATBbits.LATB3 #define LCD_D6 LATBbits.LATB4 #define LCD_D7 LATBbits.LATB5 #define LED LATBbits.LATB12 // DINH NGHIA CAC CHE DO HOAT DONG CUA 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_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_OSOC(void); void Init_PORTS(void); void Delay_ms(unsigned long i_ms); void Init_LCD(void); void LCD_OK(void); void LCD_CMD(unsigned char cmd); void LCD_DATA (unsigned char dat); void lcd_putstr(char *buffer); void lcd_gotoxy(int x, int y); void khoi_tao(void); void LCD_IN_INTER(unsigned int d); void LCD_IN_FLOAT( float d); //--------CHUONG TRINH CHINH------------------------------------------------------------------------------------------- int main (void) { Init_OSOC(); Delay_ms(1000); khoi_tao(); while(1) //Vong lap chinh { LED =1; Delay_ms(1000); LED=0; Delay_ms(1000); } } //--------Chuong trinh con khoi tao TRANG THAI BAN DAU---------------------------------------------------------- void khoi_tao(void) { Init_PORTS(); //Khoi tao cac cong I/O Init_LCD(); //Khoi tao LCD lcd_gotoxy(4,1); lcd_putstr("HELLO"); lcd_gotoxy(1,2); lcd_putstr("XIN CHAO"); } //--------------------------------------------------------------------------------------------------------- void Init_OSOC(void) { //Config FCy=40MHz PLLFBD=43; // M=45 CLKDIVbits.PLLPOST=0; // N2=2 CLKDIVbits.PLLPRE=0; // N1=2 OSCTUN=0; // Disable Watch Dog Timer RCONbits.SWDTEN=0; // N1=2 __builtin_write_OSCCONH(0x01); __builtin_write_OSCCONL(0x01); while(OSCCONbits.COSC != 0b001); // Wait for PLL to lock while(OSCCONbits.LOCK!=1) {}; } //------------------------------------------------------------------------------------------------------ void Init_PORTS(void) { ADPCFG = 0xffff; // all digital // All port is digital pin. PMD1=0xffff; PMD2=0xffff; PMD3=0xffff; TRISBbits.TRISB2 = 0; //LCD_D4 TRISBbits.TRISB3 = 0; //LCD_D5 TRISBbits.TRISB4 = 0; //LCD_D6 TRISBbits.TRISB5 = 0; //LCD_D7 TRISBbits.TRISB13 = 0; //LCD_RS TRISBbits.TRISB14 = 0; //LCD_RW TRISBbits.TRISB15 = 0; //LCD_E TRISBbits.TRISB12 = 0; // led } //------------------------------------------------------------------------------ void Delay_ms(unsigned long i_ms) { unsigned long i,j; for(i=0;i<i_ms;i++) { for(j=0;j<1750;j++) asm("clrwdt"); } } //--------------------------------------------------------------------------------------------------------- void Init_LCD(void) { LCD_CMD(0x02); //Dat che do giao tiep 4-bit, man hinh 2 dong Delay_ms(1); LCD_CMD(0x2C); //Tat man hinh Delay_ms(1); LCD_CMD(0x0C); //Che do nhap du lieu binh thuong Delay_ms(1); LCD_CMD(0x06 ); //Bat man hinh, hien con tro nhap nhay Delay_ms(1); LCD_CMD(0x01); //Xoa man hinh Delay_ms(9); } //--------------------------------------------------------------------------------------------------------- void LCD_OK(void) { unsigned u; LCD_E = 1; //Tao xung Enable for (u = 0; u < 2; u++); //keo dai toi thieu 1 us LCD_E = 0; } //---------chuong trinh xuat lenh che do 4 bit-------------------------------------------------------------------------------- void LCD_CMD(unsigned char cmd) { unsigned temp1; 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_OK(); 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_OK(); Delay_ms(5); } //----------Chuong trinh con ghi mot ky tu o che do 4 bit-------------------------- void LCD_DATA (unsigned char dat) { unsigned temp2; 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_OK(); 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_OK(); Delay_ms(5); } //-----------Chuong trinh con hien thi 1 chuoi ky tu-------------------------------------------------------------------- void lcd_putstr(char *buffer) { while(*buffer != '\0') { LCD_DATA(*buffer); /* calling another function */ /* to write each char to the lcd module */ buffer++; Delay_ms(2); } } //-----------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_CMD( 0x80 | address); Delay_ms(2); } //=======gui so nguyen len lcd============================== void LCD_IN_INTER(unsigned int d) { unsigned i,j,k,l; l=d/1000;//nghin k=(d%1000)/100;//tram j=((d%1000)%100)/10;//chuc i=((d%1000)%100)%10;//donvi LCD_DATA(0x30+l); LCD_DATA(0x30+k); LCD_DATA(0x30+j); LCD_DATA(0x30+i); } //=======giu so thuc len lcd============================= void LCD_IN_FLOAT( float d) { unsigned int e, i,j,k,l; // d=round(d,1); e=(int)(d*10); l=e/1000;//nghin k=(e%1000)/100;//tram j=((e%1000)%100)/10;//chuc i=((e%1000)%100)%10;//donvi LCD_DATA(0x30+l); LCD_DATA(0x30+k); LCD_DATA(0x30+j); lcd_putstr("."); LCD_DATA(0x30+i); } |
|
|