标题: 带字库的lcd12864液晶驱动c51程序 [打印本页]

作者: hongniu    时间: 2015-6-23 23:50
标题: 带字库的lcd12864液晶驱动c51程序
#include<reg52.h>

#include<stdlib.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar xian,flag;
uint time=0;
#define Lcd_data P0
sbit RS  =  P2^6;             //(数据命令)寄存器选择输入
sbit RW  =  P2^5;             //液晶读/写控制
sbit EN  =  P2^7;             //液晶使能控制
sbit PSB =  P3^2;             //串/并方式控制

uchar code dis1[]={"    长恨歌    "};
uchar code dis2[]={"在天愿作比翼鸟"};
uchar code        dis3[]={"在地愿为连理枝"};
uchar code dis4[]={"自古多情空余恨"};
uchar code dis5[]={"此恨绵绵无绝期"};

void delay(uint x)
{
    uint i,j;
        for(i=x;i>0;i--)
           for(j=110;j>0;j--);
}


//写指令到LCD
void write_com(uchar com)
{
        RS=0;
        RW=0;
        EN=0;
        P0=com;
        delay(1);
        EN=1;
        delay(1);
        EN=0;
}

//写指令到LCD
void write_data(uchar dat)
{
         RS=1;
         RW=0;
         EN=0;
         P0=dat;
         delay(1);
         EN=1;
         delay(1);
         EN=0;
}

void lcd_pos(uchar X,uchar Y)
{
     uchar pos;
         if(X==0)X=0x80;
         else if(X==1)X=0x90;
         else if(X==2)X=0x88;
         else if(X==3)X=0x98;
         pos=X+Y;
         write_com(pos);
}

void display(uchar p[],uchar a)
{
     uchar*display1;
     display1=p;
         lcd_pos(a,0);
     while((*display1)!='\0')
      {
                 write_data(*display1);
                 display1++;
      }
}

void init()
{
      TMOD=0x02;
          EA=1;
          ET0=1;
          TH0=6;
          TL0=6;
      TR0=1;
          time=0;
          xian=0;
}

void lcd_init()
{
    PSB=1;//并口方式
        write_com(0x30); //设置8位数据
        delay(5);
        write_com(0x0c);//显示开,光标关
        delay(5);
        write_com(0x01); //清除显示内容
        delay(5);
}

main()
{
         init();
         delay(10);
         lcd_init();
         while(1)
         {
                 switch(xian)
                        {
                            case 0:display(dis1,0); break;
                                case 1:display(dis2,1); break;
                                case 2:display(dis3,2); break;
                                case 3:display(dis4,3); break;
                                case 4:display(dis5,0); break;goto a;
                                default:break;
                        }
        }
        a:
        while(1);          
}


void timer0() interrupt 1
{
      time++;
          if(time==4000)
           {
              time=0;
                  xian++;
              if(xian==5)xian=0;
           }
}







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1