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

2019-11-09来源: 51hei关键字:PIC单片机  驱动LCD12864  显示字符

#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  显示字符 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479504.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:dsPIC30F6014 CAN总线发送功能+DS18B20温度采集
下一篇:PIC单片机ad采样在LCD上显示

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

PIC单片机入门指南
;    把最下面的框钩上后点保存这时看到文本框内的字变成了蓝色了。开始编写程序最后点上面中间的那个红色的图标编译,在项目目录里面就会有个hex的文件,最后下载到单片机PIC10F200里面就可以用了!
发表于 2019-11-14
PIC单片机入门指南
喜欢单片机的同学快来看啊,过来人的经验告白
今天星期六,由于现在处于淡季,星期日不加班,一大早起来就拿着自己新买的移动硬盘把办公室的PIC资料考了回来,在自己寝室的电脑上学开了,既然要努力学就不能一天口号,两天行动。我做好了充分的准备,要把握分分秒秒。单片机的学习开始是个枯燥的过程,慢慢的熔入起中就会发现其中的乐趣。举个很贴进的例子,当你家的电器全是自己搞的可以遥控的,比如一进门,灯全亮了,在按下遥控,电视,空调全开了,晚上睡觉都不用当心忘记灯没关,只要遥控一按,就OK了,这不是很好吗?这只是一个小小的例子,其实学会单片机还有好多有意思的地方。在学习单片机时,首先要做的不是去买书,去看书,先要搭建一个学习平台,好比要上网就好有IP一样,所以一个平台的搭建是很有必要
发表于 2019-11-14
超声波PIC单片机C程序
单片机源程序如下:////////////////////////////////////////////////////////////////////////////////////     PIC16F877 + HC-SR04 + LCD03 example//     Written October 2008 , using HITECH PIC16 compiler// //                 Note - assumes a 20MHz crystal, which is
发表于 2019-11-13
pic单片机控制电机启动、转动、停止C语言程序
#include <pic.h>#define MOTOR   RB2void DELAY(unsigned int);    main(void){char   A;    MOTOR=0;    OPTION=0b00000000;      //设定RB0为下降沿中断    TRISB=0b00000001;           //设定RB0为输入,RB2为输出 
发表于 2019-11-13
PIC单片机开发板之矩阵键盘扫描(if()else嵌套方式)
 /*为自已写的矩阵键盘检测+数码管显示+蜂鸣器响采用if().....else嵌套方式;编译通过,却后二列显示不出来(你找出来了吗?一个不算问题的问题)*///----------------------------------------------------------------#include <pic.h>#define uint unsigned int#define uchar unsigned char__CONFIG(0x3B31);const unsigned char table[] = {0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x07
发表于 2019-11-13
PIC单片机开发板之矩阵键盘扫描(if()else嵌套方式)
PIC单片机的常见问题
    1、PIC单片机振荡电路中如何选择晶体?   对于一个高可靠性的系统设计,晶体的选择非常重要,尤其设计带有睡眠唤醒(往往用低电压以求低功耗)的系统。这是因为低供电电压使提供给晶体的激励功率减少,造成晶体起振很慢或根本就不能起振。这一现象在上电复位时并不特别明显,原因时上电时电路有足够的扰动,很容易建立振荡。在睡眠唤醒时,电路的扰动要比上电时小得多,起振变得很不容易。在振荡回路中,晶体既不能过激励(容易振到高次谐波上)也不能欠激励(不容易起振)。晶体的选择至少必须考虑:谐振频点,负载电容,激励功率,温度特性,长期稳定性。    2、如何判断电路中晶振是否被过分驱动? 
发表于 2019-11-12
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved