原创 12864液晶的基本操作

2010-5-14 16:49 3170 4 5 分类: MCU/ 嵌入式

我使用的12864液晶是st7920的主控,带字库,所以文本操作很容易,但是使用绘图功能有点麻烦绘图功能有点麻烦。下面这个是12864液晶的最基础的操作


9d4440e3-0d90-4a27-b9cd-e7c4df016b5a.jpg


4fa51efc-e26c-4e87-bce7-ad16e780f504.jpg


 


下面是程序,使用STC12C5A60S2,12M晶振。


这只是一个c文件,使用时请自行添加相关的函数


#include <reg52.h>
#include <LCM12864.h>
#include <intrins.h>


sbit LCM12864_RS = P0^5;
sbit LCM12864_E = P0^7;
sbit PSB = P3^7;
sbit LCM12864_RES = P3^6;
sbit LCM12864_RW = P0^6;


//IO口对调,因P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
unsigned char Convert(unsigned char In_Date)
{
    unsigned char i, Out_Date = 0, temp = 0;
    for(i=0; i<8; i++)
    {
        temp = (In_Date >> i) & 0x01;
        Out_Date |= (temp << (7 - i));
    }
    return Out_Date;
}


//向12864中写入一个字节
void LCM12864_wr_Byte(unsigned char dat)
{
 LCM12864_RW = 0;
 LCM12864_RS = 1;
 LCM12864_E = 0;
 LCM12864_E = 1;
 P2 = Convert(dat);
 _nop_();_nop_();_nop_();
 LCM12864_E = 0;
 LCM12864_RW = 1;
}


//向12864中写入一个命令
void LCM12864_wr_Cmd(unsigned char com)
{
 LCM12864_RW = 0;
 LCM12864_RS = 0;
 LCM12864_E = 0;
 LCM12864_E = 1;
 P2 = Convert(com);
 _nop_();_nop_();_nop_();
 LCM12864_E = 0;
}


//初始化12864液晶字符输入
void Init_12864Word()

 int i;    //LCD显示文字(基本)初始化
 PSB = 1;
 LCM12864_RS = 0;
 LCM12864_RES = 1;
 LCM12864_wr_Cmd(Basic_Fun);  //基本指令功能设定
 for(i=60;i>0;i--);
 LCM12864_wr_Cmd(Basic_Fun);
 for(i=60;i>0;i--);
 LCM12864_wr_Cmd(0x0c);  //整体显示,关游标,不反白
 for(i=60;i>0;i--);
 LCM12864_wr_Cmd(0x01);  //清除显示
 for(i=1000;i>0;i--);
 LCM12864_wr_Cmd(0x02);  //地址复位
 for(i=60;i>0;i--);
 LCM12864_wr_Cmd(0x06);  //游标右移
 for(i=60;i>0;i--);
 
}


//将12864液晶GRAM清零
void Clear_GRAM()
{
 char i,j;
 for(i=0;i<32;i++)
 {
  LCM12864_wr_Cmd(0x80+i);
  LCM12864_wr_Cmd(0x80);
  for(j=0;j<32;j++)
  {
   LCM12864_wr_Byte(0x00);
  }
 }
}


void Init_Graphic(void)           //LCD显示图片(扩展)初始化程序
{
 char i;           
 PSB=1;                 //设置为8BIT并口工作模式
 for(i=20;i>0;i--);              //延时
 LCM12864_RES=0;                 //复位
    for(i=20;i>0;i--);          //延时
 LCM12864_RES=1;                 //复位置高


 LCM12864_wr_Cmd(0x36);  //扩展指令,绘图显示
 for(i=2;i>0;i--);
 LCM12864_wr_Cmd(0x01);  //清除显示
 for(i=2;i>0;i--);
 LCM12864_wr_Cmd(0x02);  //地址复位
 for(i=2;i>0;i--);
 LCM12864_wr_Cmd(0x06);  //游标右移
 for(i=2;i>0;i--);
 LCM12864_wr_Cmd(0x0c);  //整体显示,关游标,不反白
 for(i=2;i>0;i--);
}


//向12864液晶某一行,某一列写入一个数据
void LCM12864_wr_Data(unsigned char row,unsigned char col,unsigned char dat)
{
 switch(row)
 {
  case 1: LCM12864_wr_Cmd(0x80+col-1);LCM12864_wr_Byte(dat);break;
  case 2: LCM12864_wr_Cmd(0x90+col-1);LCM12864_wr_Byte(dat);break;
  case 3: LCM12864_wr_Cmd(0x88+col-1);LCM12864_wr_Byte(dat);break;
  case 4: LCM12864_wr_Cmd(0x98+col-1);LCM12864_wr_Byte(dat);break;
 }
}


//向12864液晶某一行,某一列写入一个字符串
void LCM12864_wr_String(unsigned char row,unsigned char col,unsigned char code *dat)

 unsigned char i;
 switch(row)
 {
  case 1: LCM12864_wr_Cmd(0x80+col-1);
    for(i=0;i<16;i++)
    {
     if(*dat=='\0')
      break;
     LCM12864_wr_Byte(*dat);
     dat++;
     
     
    }
    break;
  case 2: LCM12864_wr_Cmd(0x90+col-1);
    for(i=0;i<16;i++)
    {
     if(*dat=='\0')
      break;
     LCM12864_wr_Byte(*dat);
     dat++;
     
    }
    break;
  case 3: LCM12864_wr_Cmd(0x88+col-1);
    for(i=0;i<16;i++)
    {
     if(*dat=='\0')
      break;
     LCM12864_wr_Byte(*dat);
     dat++;
     
    }
    break;
  case 4: LCM12864_wr_Cmd(0x98+col-1);
    for(i=0;i<16;i++)
    {
     if(*dat=='\0')
      break;
     LCM12864_wr_Byte(*dat);
     dat++;
     
    }
    break;
 }
}


//向12864液晶写入一个图形,(整屏显示)
void LCM12864_wr_Graphic(unsigned char code *dat)
{
 int i,j;    
 for(i=0;i<32;i++)    //写上半屏
 {   
  LCM12864_wr_Cmd(0x80+i);  //写垂直坐标RAM地址
  LCM12864_wr_Cmd(0x80);  //写水平坐标RAM地址
  for(j=0;j<16;j++)
  {
   LCM12864_wr_Byte(*dat);
   dat++;
  }
 }
 for(i=0;i<32;i++)    //写下半屏
 {
 
  LCM12864_wr_Cmd(0x80+i); 
  LCM12864_wr_Cmd(0x88);
  for(j=0;j<16;j++)
  {
   LCM12864_wr_Byte(*dat);
   dat++;
  }
 }
}


 


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2015-9-7 18:24

写的很详细,再加上数组显示部分就更全啦,谢谢分享,值得尊敬!
相关推荐阅读
用户240939 2010-06-13 17:24
SAA3010红外解码
SAA3010的红外解码。SAA3010是遥控器中常用的红外编码芯片,采用的是PHILIPS的RC-5协议。一个全码包括 2位起始位+1位控制位+5位系统位+6位数据位.采用双相位编码发送。发送一位的...
用户240939 2010-05-15 20:25
STC12C5A60S2的ADC转换
今天下午把STC12C5A60S2的ADC转换函数写了,查询法只要检查ADC_FLAG是否为1,再进行相关程序就行了。下面这个是用中断法。这是STC技术手册上提供的中断号,直接在PDF上复制过来的,显...
用户240939 2010-05-15 19:50
STC12C5A60S2看门狗的应用
什么是看门狗(watchdog)看门狗,又叫 watchdog timer,是一个定时器电路, 一般有一个输入,叫喂狗,一个输出到MCU的RST端,MCU正常工作的时候,每隔一端时间输出一个信号到喂狗...
我要评论
1
4
关闭 站长推荐上一条 /3 下一条