- #include <pic.h> //調用頭文件,可以去PICC軟件下去查找PIC16F87XA單片機的頭文件
- __CONFIG(XT&WDTDIS&LVPDIS);
- //定義配置字,晶振類型:XT,關閉開門狗,禁止低電壓編程
- #define Rs RB0 //并行數據/控制字選擇 H:數據 L:控制字
- #define RW RB1 //并行讀/寫選擇 H:讀 L:寫
- #define E RB2 //并行讀寫使能 H有效,下降沿鎖定數據
- #define Psb RB3 //串口,并口選擇 H:并口 L:串口(開發板上引腳標識為CS1)
- #define Rst RB5 //復位引腳 L:液晶復位
- //---------------------------------------
- //名稱: 延時函數
- //-----------------------------------------
- void delay(unsigned int t)
- {
- unsigned int i,j;
- for(i=0;i<t;i++)
- {
- for(j=0;j<10;j++)
- {
- asm("NOP");
- }
- }
- }
- //---------------------------------------
- //名稱: 數據總線處理函數
- //ND118開發板中,因為布線的原因液晶的8位數據總線和單片機的8位數據線
- //是反的,所以需要調換過來,即DB0-RD7、DB1-RD6。。。。DB7-RD0
- //-----------------------------------------
- void write_bus(unsigned char buf)
- {
- if(buf&0x01) RD7=1;
- else RD7=0;
- if(buf&0x02) RD6=1;
- else RD6=0;
- if(buf&0x04) RD5=1;
- else RD5=0;
- if(buf&0x08) RD4=1;
- else RD4=0;
- if(buf&0x10) RD3=1;
- else RD3=0;
- if(buf&0x20) RD2=1;
- else RD2=0;
- if(buf&0x40) RD1=1;
- else RD1=0;
- if(buf&0x80) RD0=1;
- else RD0=0;
- }
- //---------------------------------------
- //名稱: 寫命令字節到12864函數
- //-----------------------------------------
- void write_com(unsigned char cmdcode)
- {
- unsigned int ii=20000;
- Rs=0; //設置該字節數據為命令代碼
- RW=1; //設置此次操作為讀
- E=1; //使能
- TRISD=0B11111111; //RD設置為輸入
- while((PORTD&0X01)&&(ii>0)) //讀忙狀態,不忙時退出
- {
- ii--;
- }
- E=0; //失能
- TRISD=0B00000000; //RD設置為輸出
- Rs=0; //設置該字節數據為控制命令
- RW=0; //設置此次操作為讀寫
- write_bus(cmdcode); //通過數據總線處理函數將命令字寫進總線中去
- E=1; //使能寫
- asm("NOP"); //略加延遲
- asm("NOP");
- asm("NOP");
- E=0; //失能寫
- }
- //---------------------------------------
- //名稱: 寫數據字節到12864函數
- //-----------------------------------------
- void write_data(unsigned char Rsspdata)
- {
- unsigned int ii=20000;
- Rs=0; //設置該字節數據為命令代碼
- RW=1; //設置此次操作為讀
- E=1; //使能
- TRISD=0B11111111; //RD設置為輸入
- while((PORTD&0X01)&&(ii>0)) //讀忙狀態,不忙時退出
- {
- ii--;
- }
- E=0; //失能
- TRISD=0B00000000; //RD設置為輸出
- Rs=1; //設置該字節數據為數據
- RW=0; //設置此次操作為讀寫
- write_bus(Rsspdata); //通過數據總線處理函數將命令字寫進總線中去
- E=1; //使能寫
- asm("NOP"); //略加延遲
- asm("NOP");
- asm("NOP");
- E=0; //失能寫
- }
- //---------------------------------------
- //名稱: 寫地址函數
- //輸入參數:x,y:顯示字符串的位置,x:0-7,y:0-3
- //-----------------------------------------
- void write_xy(unsigned char x,unsigned char y)
- {
- unsigned char address;
- switch(y){
- case 0:address=0x80+x;break; //第一行的首地址是0x80
- case 1:address=0x90+x;break; //第二行的首地址是0x90
- case 2:address=0x88+x;break; //第三行的首地址是0x88
- case 3:address=0x98+x;break; //第四行的首地址是0x98
- default:address=0x80+x;
- }
- write_com(address);
- }
- //---------------------------------------
- //名稱: 初始化LCD屏
- //-----------------------------------------
- void init_lcd(void)
- {
- Rst=0; //復位液晶
- delay(250); //加些延時
- delay(250);
- Rst=1; //復位結束
- delay(250); //加些延時
- Psb=1; //選擇8bit并口
-
- write_com(0x30); //基本指令集
- write_com(0x0c); //顯示開
- write_com(0x06); //光標右移,整體顯示不移動
- write_com(0x01); //清除顯示(清零DDRAM)
- delay(250);
-
- }
- //---------------------------------------
- //名稱: 指定地址中英文字符串顯示函數
- //-----------------------------------------
- void write_string(unsigned char x,unsigned char y,const unsigned char *s)
- {
- write_xy(x,y); //先寫入地址參數
- while(*s) //只要字符串沒寫完就繼續寫
- {
- write_data(*s); //寫入一個字符串數據
- s++; //指針轉到下一個
- delay(10);
- }
- }
- //---------------------------------------
- //名稱: 整行中英文字符串顯示函數
- //-----------------------------------------
- void lcd12864_dis_oneline(unsigned char line,const unsigned char *p)
- {
- unsigned char c;
- switch(line%4)
- {
- case 0:
- write_com(0x80); //第一行的首地址為0x80
- for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
- {
- write_data(*p);
- p++;
- if(*p==0)
- {
- break;
- }
- }
- break;
- case 1:
- write_com(0x90); //第二行的首地址為0x90
- for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
- {
- write_data(*p);
- p++;
- if(*p==0)
- {
- break;
- }
- }
- break;
- case 2:
- write_com(0x88); //第三行的首地址為0x88
- for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
- {
- write_data(*p);
- p++;
- if(*p==0)
- {
- break;
- }
- }
- break;
- case 3:
- write_com(0x98); //第四行的首地址為0x98
- for(c=0;c<16;c++) //將本行的16個字符全部寫進去,漢字占兩個字符位
- {
- write_data(*p);
- p++;
- if(*p==0)
- {
- break;
- }
- }
- break;
- default : break;
- }
- }
- //---------------------------------------
- //名稱: 主函數
- //-----------------------------------------
- void main(void)
- {
- TRISB=0B11000000; //RB0-5設置為輸出
- TRISD=0B00000000; //RD設置為輸出
- init_lcd(); //初始化12864
- write_string(0,0,"XXXX電子有限");
- write_string(0,1,"公司");
- write_string(0,2,"MovingChip.com");
- write_string(0,3,"0574-86878555");
- while(1)
- {
-
- }
- }
復制代碼
|