- #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)
- {
-
- }
- }
复制代码
|