查看: 756|回复: 0
打印 上一主题 下一主题

12864液晶显示驱动程序。

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-24 15:28:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#include <intrins.h>
sbit RS = P0^0;
sbit RW = P0^1;
sbit E = P0^2;
sbit PSB = P0^6;          //串并口选择
sbit RES = P0^7;

#define FIRST_ADDR 0       //定义字符/汉字显示起始位置
//延时子程序
void delay(unsigned int t)
{  unsigned int i,j;
   for(i=0;i<t;i++)
      for(j=0;j<10;j++)
         ;
}
//测忙
void chk_busy()
{  RS=0;
   RW=1;
   E=1;
   while((P1&0x80)==0x80);
   E=0;
}
//读数据
unsigned char lcdrd()
{  unsigned char i;
  // P3=0xFB;
   RS=1;RW=1;E=1SB=1;RES=1;
   _nop_();
   E=1;
   delay(5);
   i=P1;
   _nop_();
   E=0;
   return i;
}
//写数据
void lcdwd(unsigned char dispdata)
{  chk_busy();
   _nop_();
   RS=1;
   RW=0;
   E=1;
   P1=dispdata;
   delay(5);
   _nop_();
   E=0;
   _nop_();
   P1=0xff;
}
//写指令代码
void lcdwc(unsigned char cmdcode)
{  chk_busy();
   _nop_();
   RS=0;
   RW=0;
   E=1;
   P1=cmdcode;
   delay(5);
   _nop_();
   E=0;
   _nop_();
   P1=0xff;
}
//初始化
void lcdreset()
{  delay(2000);
   lcdwc(0x30);       //选择基本指令集
   lcdwc(0x30);       //选择8bit数据流
   delay(5);
   lcdwc(0x0c);       //开显示(无游标、不反白)
   delay(5);
   lcdwc(0x01);       //清除显示,并且设定地址指针为00H
   delay(5);
   lcdwc(0x06);       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}
void hzkdis(unsigned char code *s)
{  while(*s>0)
   {  lcdwd(*s);
      s++;
      delay(500);
   }
}
void hzklib()
{  lcdwc(0x80+FIRST_ADDR);
   hzkdis("少小离家老大回,");
   lcdwc(0x90+FIRST_ADDR);
   hzkdis("乡音无改鬓毛衰。");
   lcdwc(0x88+FIRST_ADDR);
   hzkdis("儿童相见不相识,");
   lcdwc(0x98+FIRST_ADDR);
   hzkdis("笑问客从何处来。");
}
//整屏显示
//当ii=0时显示上面128×32
//当ii=8时显示下面128×32
void lcdfill(unsigned char disdata)
{  unsigned char x,y,ii;
   for(ii=0;ii<9;ii+=8)
      for(y=0;y<0x20;y++)
         for(x=0;x<8;x++)
         {  lcdwc(0x36);
            lcdwc(y+0x80);        //行地址
            lcdwc(x+0x80+ii);     //列地址
            lcdwc(0x30);
            lcdwd(disdata);
            lcdwd(disdata);
         }
}
main()
{
   RES=0;
   _nop_();
   RES=1;
   while(1)
   {
      P2=0x00;
      PSB=1;
      RW=0;
      lcdreset();       //初始化LCD屏
      lcdwc(0x01);
      delay(1000);
      lcdfill(0xff);
      delay(6000);
      lcdfill(0);
      lcdwc(0x01);
      delay(1000);
      hzklib();
      delay(4000);
   }
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表