×
单片机 > 单片机程序设计 > 详情

PIC单片机驱动LCD12864显示字符源代码

发布时间:2020-06-18 发布时间:
|

#include       //调用头文件,可以去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

{

  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)

{  


}  

}


关键字:PIC单片机  驱动LCD12864  显示字符


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会