找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1840|回复: 1
打印 上一主题 下一主题
收起左侧

12860驱动程序

[复制链接]
跳转到指定楼层
楼主
ID:119983 发表于 2016-5-11 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
12860驱动程序
#include "stdio.h"
#include "regdefs.h"
#include "intrins.h"
#include "user.h"
#include "LCM6059B.h"

#define UINT8  unsigned char         // 0~255
#define UINT16 unsigned short int    // 0~65535
#define INT8   signed int

//////////// LCD Control Command ////////////
#define DISPLAY_ON               0xaf
#define DISPLAY_OFF              0xae
#define DISPLAY_ALL_POINT_ON     0xa4
#define DISPLAY_ALL_POINT_OFF    0xa5
#define DISPLAY_START_LINE_SET   0x40  //line (0~3f)
#define PAGE_ADDRESS_SET         0xb0  //page (0~8)
#define COLUMN_HIGH_SET          0x10  //high 4 bits
#define COLUMN_LOW_SET           0x0f  //low  4 bits
#define DISPLAY_RD_WR_MODIFY     0xe0
#define DISPLAY_RD_WR_MODIFY_END 0xee
#define DISPLAY_CONTTAST_LEVEL   0x81  //level (0~3f)
#define ADC_DIR_SELECT           0xa0
#define DISPLAY_NORMAL                 0xa6
#define DISPLAY__REVERSE         0xa7
#define LCD_BIAS_SET             0xa2  //1/9,0        1/7,1
#define LCD_RESET                0xe2
#define COM_OUTPUT_SET           0xC0  //mode 0x00, 0x08
#define POWER_CTRL_SET           0x20  //mode 0x08,0x2c,0x2e,0x2f
#define BOOST_RATIO_SET          0xf8  //0x00,0x01,0x02,0x3
#define VO_CTRL_SET              0x20  //Rb/Ra(0~7)
#define OP_NOP                   0xe3  //空操作
//////////// MCU IO configuration ////////////
#define LCD_PORT_CFG    sfr_GP_CONTROL1         &=(~0x01)  //bit0
#define        LCD_PORT_OUT    sfr_GPIOA_DIRECTION &=(~0xff);
#define LCD_PORT_IN     sfr_GPIOA_DIRECTION |=0xff;
#define LCD_PORT        sfr_GPIOA_DATA
// LCD_EN GPIOE_6
// LCD_WR GPIOE_5
#define LCD_WR_EN_OUT   sfr_GPIOE_DIRECTION &=(~0x60)       
#define LCD_EN_SET(x)   x?(sfr_GPIOE_DATA|=0x40):(sfr_GPIOE_DATA&=(~0x40))
#define LCD_WR_SET(x)   x?(sfr_GPIOE_DATA|=0x20):(sfr_GPIOE_DATA&=(~0x20))
//LCD_A0  GPIOC_4           H->data ,L-> cmd
#define LCD_A0_OUT      sfr_GPIOC_DIRECTION &=(~0x10)
#define LCD_A0_SET(x)   x?(sfr_GPIOC_DATA|=0x10):(sfr_GPIOC_DATA&=(~0x10))
//LCD_RST GPIOC_3      
//LCD_CS  GPIOC_2
//sfr_EXT_INT_xF6  bit7
#define LCD_RST_CS_CFG  sfr_EXT_INT_xF6 &=(~0x80)
#define LCD_RST_CS_OUT  sfr_GPIOC_DIRECTION &=(~0x0c)
#define LCD_RST_SET(x)  x?(sfr_GPIOC_DATA|=0x08):(sfr_GPIOC_DATA&=(~0x08))
#define LCD_CS_SET(x)   x?(sfr_GPIOC_DATA|=0x04):(sfr_GPIOC_DATA&=(~0x04))
UINT8   ContrastLevel;              // for contrast setting level

void DelayMs(UINT16 m)
{ //12MHZ
     UINT16 jj;
     UINT16 ii;

     for (ii=0; ii<m; ii++)
        for (jj=0; jj<109; jj++);
}
BOOL CheckBusy(void)
{
         LCD_RST_CS_CFG;
         LCD_RST_CS_OUT;
         LCD_PORT_CFG;
         LCD_PORT_OUT;
         LCD_A0_OUT;
         LCD_WR_EN_OUT;
         LCD_A0_SET(0);               //命令通道选通
         LCD_WR_SET(1);               //设置读状态
         LCD_CS_SET(0);
         LCD_PORT=0x80;
         LCD_EN_SET(1);
         LCD_PORT_IN;
         _nop_();
         if (LCD_PORT&0x80) return(0);
         else return(1);
}
void SendCmd(UINT8 Cmd)
{//
     Hal_DisableAllInts();        //为了时序完整性,禁止中断
     LCD_RST_CS_CFG;                //根据MCU的不同,有可能要配置GPIO
         LCD_PORT_CFG;
         LCD_RST_CS_OUT;
         LCD_PORT_OUT;
     LCD_A0_OUT;
         LCD_WR_EN_OUT;                  
         LCD_A0_SET(0);                    // 设置指令通道      
         LCD_WR_SET(0);                        // 设置写状态         
         LCD_CS_SET(0);                        // Chip select
         LCD_PORT=Cmd;                    // 发送命令
         LCD_EN_SET(1);
         _nop_();
         LCD_EN_SET(0);
         LCD_CS_SET(1);
         Hal_EnableAllInts();   //中断开
}

void SendData(UINT8 DData)
{
     Hal_DisableAllInts();
         //CheckBusy()
     LCD_RST_CS_CFG;
         LCD_RST_CS_OUT;
         LCD_PORT_CFG;
         LCD_PORT_OUT;
     LCD_A0_OUT;
         LCD_WR_EN_OUT;
         LCD_A0_SET(1);                      //设置数据通道
         LCD_WR_SET(0);
         LCD_CS_SET(0);
         LCD_PORT=DData;             //发送数据
         LCD_EN_SET(1);
         _nop_();
         LCD_EN_SET(0);
         LCD_CS_SET(1);
         Hal_EnableAllInts();
}

UINT8 ReadData()
{
     UINT8 DData;
         LCD_RST_CS_CFG;
         LCD_RST_CS_OUT;
     LCD_PORT_CFG;
         LCD_PORT_OUT;
     LCD_A0_OUT;
         LCD_WR_EN_OUT;
         LCD_A0_SET(1);                   //数据通道选通
         LCD_WR_SET(1);               //设置读状态
         LCD_CS_SET(0);
         LCD_PORT=0xff;
         LCD_EN_SET(1);
         LCD_PORT_IN;
         _nop_();
         DData=LCD_PORT;
         LCD_EN_SET(0);
         LCD_CS_SET(1);
     return(DData);       // 返回数据值
}

void DrawDots2(UINT8 x,UINT8 y,UINT8 flg)
{// 坐标(x,y),x为列地址,y为行地址
     UINT8 p,m;
     p=y/8;
     SendCmd(p|PAGE_ADDRESS_SET);       // 设置页地址
     SendCmd((x>>4)|COLUMN_HIGH_SET);  // 设置列地址高4位
     SendCmd(x&COLUMN_LOW_SET);       // 设置列地址低4位
     SendCmd(DISPLAY_RD_WR_MODIFY);         // 设置修改写模式
     y=y%8;
     m=0x01;
     y=m<<y;                 /列地址不进行加1
     m=ReadData();          // 空读操作
     m=ReadData();          // 读第m列数据
     SendCmd(OP_NOP);         // 空操作
         if (flg)               //实点
         {
        m|=y;
         }
         else                         //虚点
         {
            m&=(~y);
         }
     SendData(m);             // 写数据
     SendCmd(DISPLAY_RD_WR_MODIFY_END);        
}

void PrintAscii(UINT8 x,UINT8 y,UINT8 *pstr)
{ //(x,y)为坐标
     UINT8 ii,jj;
         UINT16 addr;
         if ((y%8)==0)                              
         {   
            SendCmd(y|PAGE_ADDRESS_SET);           
        SendCmd((x>>4)|COLUMN_HIGH_SET);        
        SendCmd(x&COLUMN_LOW_SET);            
        while (*pstr)
        {
             addr=*pstr++;                      // 取字符代码
             addr=(addr-0x20)*8;                // 计算字符字模起始地址
             for (jj=0;jj<6;jj++)               
             {
                  SendData(ASCIITAB[addr+jj]);  //  写字模数据
             }
        }
         }
         else                                                           //如否, 由于是跨页操作,则采用描点方式
         {
                      while (*pstr)                           //非0
                          {
                               addr=*pstr++;           // 取字符代码
                   addr=(addr-0x20)*8;     // 计算字符字模起始地址
                                   for (jj=0;jj<6;jj++)           //6*8点阵字符
                                   {
                                    for (ii=0;ii<8;ii++)
                                        {
                                             DrawDots2(x+jj,y+ii,((ASCIITAB[addr+jj]>>ii)&0x01));
                                        }
                                   }
                                   x+=6; //        描完一个字,地址加6
                          }                               
         }

}

void PrintChar2(UINT8 x, UINT8 y,UINT8 *pstr)
{// 坐标(x,y),x为水平方向像素列;y为垂直方向字符行(8点像素/行)
     UINT8 jj,ii;
     UINT16 addr;
         addr=*pstr++;             // 取字符代码
     addr=(addr-0x20)*8;       // 计算字符字模起始地址
         for (jj=0;jj<6;jj++)           //6*8点阵字符
         {
                  for (ii=0;ii<8;ii++)
                  {
                          DrawDots2(x+jj,y+ii,((ASCIITAB[addr+jj]>>ii)&0x01));
                  }
         }
}


void PrintText(UINT8 x, UINT8 y,UINT16 *pstr)
{// 坐标(x,y),x为水平方向像素列;y为垂直方向字符行(8点像素/行)
     UINT16 addr;
     UINT8 jj;
         UINT16 Index,ii;
         BOOL IsASCII=FALSE;
         UINT8 n,ch;
     while(*pstr)
     {
            if (*pstr<0x8000 && *pstr!=0x2300/*#*/)        //是否是ASCII码
                {
                    ch=(UINT8)(*pstr>>8);
                        PrintChar2(x,y+4,&ch);          //地址调整
                        x+=6;
                        ch=(UINT8)(*pstr);
                        PrintChar2(x,y+4,&ch);          //地址调整
                        pstr++;
                        x+=6;
                }
                else{

               ii=0;
               while(1)        //查找机内码
                    {
                      if (GBK16TAB[ii]==(*pstr>>8) && GBK16TAB[ii+1]==(*pstr&0xff))
                          {  
                            Index=ii;
                                break;
                          }
                        ii+=34;
                        if (ii>=500-32) break;           //避免溢出
                        if (*pstr==0x2300/*#*/) break;                        
                  }
                  if (*pstr==0x2300/*#*/) break;
          addr=Index+2;                 // 取得字模存储首地址
                  for (n=0;n<2;n++)  //
          {       
                  for (jj=0; jj<16;jj++) //先左后右,共width点
                      {
                          for (ii=0;ii<8;ii++)  //先描上后下,共8点
                          {
                                   DrawDots2(x,y+ii,((GBK16TAB[addr+jj]>>ii)&0x01));
                          }
                              x++;
                      }
                  y+=8;
                          x-=16;
                          addr+=16;                        
          }
                  x+=16;
                  y-=16;
                  pstr++;
                }
    }       
}

void LCD_SetContrast(BOOL bhv)
{
     if (bhv)
         {
        if (ContrastLevel>0x3f) ContrastLevel++;  
         }
         else
         {
            if (ContrastLevel>0x00) ContrastLevel--;
         }
     SendCmd(DISPLAY_CONTTAST_LEVEL);  
     SendCmd(ContrastLevel);         
         return;
}
void ShowBMP(UINT8 x,UINT8 y,UINT8 width,UINT8 hight,UINT8 bmp[])
{// (x,y)为图像显示开始坐标
     UINT8 ii,jj,page,Index;
         Index=0;
         page=0;
     while(page<hight)
     {       
             for (jj=0; jj<width;jj++) //先左后右,共width点
                 {
                     for (ii=0;ii<8;ii++)  //先描上后下,共8点
                     {
                             DrawDots2(x,y+ii,((bmp[Index]>>ii)&0x01));
                     }
                         x++;
                         Index++;
                 }
             y+=8;
                 x-=width;
                 page+=8;                           
     }
}

void DrawLine(UINT8 x1,UINT8 y1,UINT8 x2,UINT8 y2)
{//坐标(x1,y1)为线起始地址坐标;坐标(x2,y2)为线终止地址坐标
     UINT8 temp;
     INT8 Xt,Yt,err=0;
     if (y1>y2)
     {
        temp=x1; x1=x2; x2=temp;
        temp=y1; y1=y2; y2=temp;
     }
     DrawDots2(x1,y1,1);
     Xt=x2-x1;
     Yt=y2-y1;
     if (Xt>=0)
     {
        if (Yt>Xt)//k>1
        {
           while (y1<y2)
           {
               if (err<0)
               {
                  x1=x1+1;
                  y1=y1+1;
                  err=err+Yt-Xt;
               }
               else        //err>=0
               {
                  y1=y1+1;
                  err=err-Xt;
               }
               DrawDots2(x1,y1,1);
           }
       }
       else  // 0<=k=<1
       {
          if (Yt==0) y1=y1-1;
          while (x1<x2)
          {
              if (err<0)
              {
                 x1=x1+1;
                 err=err+Yt;
              }
              else
              {
                 y1=y1+1;
                 x1=x1+1;
                 err=err+Yt-Xt;
              }
              DrawDots2(x1,y1,1);
         }
      }

    }
    else
    {
       Xt=x1-x2;  
       if (Yt>Xt)//k<-1
       {
          while (y1<y2)
          {
             if (err<0)
             {
                 x1=x1-1;
                 y1=y1+1;
                 err=err+Yt-Xt;
             }
             else
             {
                 y1=y1+1;
                 err=err-Xt;
             }
             DrawDots2(x1,y1,1);
        }
    }
    else       //0>k>=-1
    {
       if (Yt==0) y1=y1-1;
       while (x1>x2)
      {
          if (err<0)
          {
              x1=x1-1;
              err=err+Yt;
          }
          else
          {
              x1=x1-1;
              y1=y1+1;
              err=err+Yt-Xt;
          }   
          DrawDots2(x1,y1,1);
       }
     }
  }   
}
void ClearAllRAM()
{
     UINT16 i,j;
     for (i=0;i<8;i++)            //写8页
     {
          SendCmd(i|PAGE_ADDRESS_SET);      
          SendCmd(0x10);         
          SendCmd(0x00);         
          for (j=0;j<132;j++)     
          {
             SendData(0);        
          }
     }
}
void InitLCM6059B(void)
{
     LCD_RST_CS_CFG;
         LCD_RST_CS_OUT;
         LCD_RST_SET(0);
         DelayMs(10);
         LCD_RST_SET(1);
         DelayMs(10);
     ContrastLevel=0x21;                // 对比度参数初始化设置
     SendCmd(DISPLAY_ON);               // 开显示
     SendCmd(DISPLAY_START_LINE_SET|0); // 设置显示起始行=0
     SendCmd(ADC_DIR_SELECT);           // RAM列地址与列驱动同顺序
     SendCmd(DISPLAY_NORMAL);           // 正向显示
     SendCmd(DISPLAY_ALL_POINT_ON);     // 显示全亮功能关闭
     SendCmd(LCD_BIAS_SET|0);           // LCD偏压比为1/9
     SendCmd(COM_OUTPUT_SET|0x08);      // 行驱动方向为反向
     SendCmd(POWER_CTRL_SET|0x0f);      // 启用内部LCD驱动电源
         SendCmd(VO_CTRL_SET|0x05);                        // 电阻比
     SendCmd(BOOST_RATIO_SET);
         SendCmd(0x00);                     // 倍压设置为4X  
     SendCmd(DISPLAY_CONTTAST_LEVEL);
         SendCmd(0x21);                     // 设置对比度
         ClearAllRAM();
         return;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2016-5-11 16:57 | 只看该作者

#include "regdefs.h"

#include "user.h"
#include "LCM6059B.h"
这个几个头文件能否打包分享一下呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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