设为首页 收藏本站
查看: 1564|回复: 0

[经验分享] OCM12864驱动程序说明

[复制链接]

尚未签到

发表于 2015-11-9 12:50:58 | 显示全部楼层 |阅读模式
  //#include "hal.h"
#include "hal_types.h"
#include "LCD128_64.h"
#include "Font.h"
  #ifdef LCD_SUPPORTED
/****************************************************
* B) Command Table per device *
****************************************************/
#define  DisplayOff  0xAE     //关闭lcd  lcd display off
#define  DisplayOn  0xAF     //打开lcd  lcd display on
#define  DisplayStart  0x40     //设置显示开始列位置 set the display RAM display start line address
#define  PageAddr  0xB0     //设置显示开始页位置 set the display RAM page address
#define  ColAddrHi  0x10     //设置显示位置列高地址 set the most significant 4 bits of the display RAM column address
#define  ColAddrLo  0x00     //设置显示位置列低地址 set the least significant 4 bits of the display RAM column address
#define  SegRemapOff  0xA0     // ADC select  normal  正常显示 set the display RAM address SEG output correspondence
#define  SegRemapOn  0xA1     // ADC select  reverse 反黑显示
#define  NormalDisp  0xA6    //lcd 正常显示 set the lcd display normal
#define  ReverseDisp  0xA7    //lcd 反向显示 set the lcd display reverse
#define  ExitEntireD  0xA4    //设置整个屏幕显示 正常显示 display all points :normal display
#define  EntEntireD  0xA5    //全部显示    display all points :all points on
#define  EnterRMW  0xE0    //进入Read/Modify/Write模式,列地址增量  column address increment at write +1,at read 0;
#define  ExitRMW  0xEE    //退出RMW     clear read/modify/write
#define  SWRest   0xE2   //内部复位    internal reset
#define  ComRemapOff  0xC0   //设置COM输出扫描方向,垂直扫描 select COM output scan direction:0 normal direction
#define  ComRemapOn  0xC8   //水平扫描   1 reverse direction
#define  PwrCtrlReg  0x28  //选择内部电源模式  select internal power supply operating mode
#define  OPampBuffer  0x01   //
#define  IntReg   0x02   //
#define  IntVolBstr  0x04   //内部电压
#define  IntRegRatio  0x20   //选择内部电阻率模式(Rb/Ra)select internal resistor ratio(Ra/Rb)mode
#define  ContCtrlReg  0x81   // 内部对比度控制器 set the v0 output voltage electronic volume register
#define  CmdMuxRatio  0x48   // 设置集多重比率
#define  CmdBiasRatio  0x50   // 设置偏压比
#define  DispOffset  0x44   // 设置显示偏移
#define  IconModeOn  0xA3    //设置液晶驱动电压偏差率  sets the lcd drive voltage bias ratio 1/9 bias
#define  IconModeOff  0xA2   //1/7 bias(st756p)
#define  NlineInver  0x4C   //
#define  DCDCconver  0x64   //dc-dc 转换
#define  PowersavStandby 0xA8  // 待机模式 standby mode
#define  PowersavSleep  0xA9  //休眠模式    sleep mode
#define  PowersavOff  0xE1  //省电关闭 power save off
#define  InterOsc  0xAB  // 内部振荡器
#define  Device SSD1821   / /*设备演示装置  device under demo */
#define  ColNo   132  / /* lcd玻璃板的列/柱数目 number of Column/Seg on LCD glass*/
#define  RowNo   64  //* Row/Com/Mux的数目   number of Row/Com/Mux */
#define  PS   1  / /*固定并行模式 fixed to Parallel mode */
#define  PageNo   10  / /*总共没有内存页 Total no of RAM pages */
#define  IconPage  10  / /*图标页码 Icon Page number */
#define  All0   6  / /* 3 for all 0, 4 for all 1 */
#define  All1   4
#define  iIntRegValue  1  / /*内部稳压电阻比值 Internal Regulator Resistor Ratio Value */
#define  iContCtrlRegValue 16  / /* 设定缺省对比度  Contrast Control Register Value */
#define  iIntRegValuea  20  / /* 内部稳压电阻比值  Internal Regulator Resistor Ratio Value */
#define  iContCtrlRegValuea 16 /  /* Contrast Control Register Value */
#define  iIntRegValueb  1  / /*内部稳压电阻比值 Internal Regulator Resistor Ratio Value */
#define  iContCtrlRegValueb 16 /  /* Contrast Control Register Value */
#define  MSGNo   16
#define  MSGLength  22
#define  SSLNameNo  4
#define  DevicePg  0   //内存页的显示设备名称 RAM page for showing device name
#define  FeaturePg  1   //内存页显示功能  RAM page for showing feature
#define  GRAPHICNo  13
#define  xlogo   38
#define  ylogo   5
#define  xsolomon  91
#define  ysolomon  2
#define  xsystech  81
#define  ysystech  2
#define  xlimited  70
#define  ylimited  2
#define  xcc   16
#define  ycc   2
#define  xpageq   128
#define  ypageq   4
#define  horizonal  0
#define  d_time   60   //延时
////////////////////////////////////////////////////////////////////////////////////////////
  void Print8(INT16U y,INT16U x, INT8U ch[],INT16U yn);
  INT8U ContrastValue =90;
void WriteLCD(INT8U fs, INT8U da);
void Write595(INT8U dat);
void delay_us(INT16U s);
void delay1(INT8U jj);
void contrastctrl(INT8U start, INT8U stop);
void HalLcdInit(void);
void PrintCh8(INT16U y,INT16U x, INT8U ch,INT16U yn);
  void delay1(INT8U jj)        //单字节延时
{
INT8U i;
for(i=0; i<jj; i++);
}
  void delay_us(INT16U s)    //双字节延时
{
INT16U i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
  
//******************************************************************************
//???:void Write595(INT8U dat)
//?功能:写595数据?
//??:?
//????:595???,????8?
//******************************************************************************
void Write595(INT8U dat)
{

INT8U ii;  
   
for(ii = 0 ; ii < 8; ii++)
{
  if(dat & 0x80)  LCD_595_DAT = 1;  //取数据,最高位相与
  else  LCD_595_DAT = 0;
  
  dat <<= 1;    //左移一位
  LCD_595_CK = 1; //一个时钟变化送一个数据
  LCD_595_CK = 0;
}
LCD_595_LD = 1;
LCD_595_LD = 0;
}
  
//*****************************************************************************
//*****************************************************************************
//???:void delay(unsigned int n)
//????:??????
//*****************************************************************************
void WriteLCD(INT8U fs, INT8U da)
{
delay1(0);
LCD_CS1 = 0;                     //片使能
LCD_RW = 0;   //写模式
//delay1(0);
  if(fs){
  LCD_RS = 1;  //数据寄存器
}
else{
  LCD_RS = 0;  //指令寄存器
}
       // delay1(0);
  Write595(da);
LCD_E = 1;     // = 1;使能信号
        delay1(0);
LCD_E = 0;     // = 0;     
//delay1(0);
LCD_CS1 = 1;  //片禁止
}
/*
  INT8U ReadLCD(INT8U fs)      //读取lcd数据
{
INT8U temp = 0;
LCD_CS1 = 0;
NOP;
NOP;
NOP;
NOP;
do{      
  LCD_RW = 1;
  LCD_RS = 0;
  LCD_E = 1;
  NOP;
  NOP;      
  temp = P1 & 0x80;   
  LCD_E = 0;   
  }while(temp != 0);
  if(fs){
  LCD_RS = 1;
}
else{
  LCD_RS = 0;
}

LCD_E = 1;
NOP;
NOP;
NOP;
NOP;
temp = P1;
LCD_E = 0;
LCD_CS1 = 1;
return(temp);
}
  
*/
void SetRamAddr(INT8U x ,INT8U y)   //lcd位置选择
{
INT8U temp;

temp = 0x0f & x;
WriteLCD(COMMAND , PageAddr|temp);  //设置显示位置一行
  temp = 0x0f & (y >> 4);
WriteLCD(COMMAND , ColAddrHi|temp);//高位set higher column address
temp = 0x0f & y;
WriteLCD(COMMAND , ColAddrLo|temp);//低位set lower column address
}
  
/*******************************************************************************
//???:void SetContrast(INT8U Gain, INT8U Step)
//??:lcd对比度设定
//??:Page-页,Col-列
//??:无
********************************************************************************/
void SetContrast(INT8U Gain, INT8U Step)
{
WriteLCD(COMMAND , IntRegRatio | (0x0f & Gain));  //设定内部电阻
WriteLCD(COMMAND , ContCtrlReg);    //设定内部对比度控制器
WriteLCD(COMMAND , 0x3f & Step);
}
  
  /*******************************************************************************
//???:void InitDisplay(void)
//??:lcd初始化
//??:?
//??:?
********************************************************************************/
void InitDisplay(void)
{
WriteLCD(COMMAND , DisplayOff);   //关闭lcd
WriteLCD(COMMAND , SegRemapOn);       //ks0713/ssd1815
WriteLCD(COMMAND , ComRemapOn);       //ssd1815
SetContrast(iIntRegValue, iContCtrlRegValue);  //设定缺省对比度
WriteLCD(COMMAND , PwrCtrlReg | IntVolBstr | IntReg | OPampBuffer); //turn on booster, regulator & divider
WriteLCD(COMMAND , DisplayOn);    //开启lcd
}
  
/*******************************************************************************
//???:void contrastctrl(INT8U start,stop)
//??:lcd?????
//??:?
//??:?
********************************************************************************/
  void contrastctrl(INT8U start, INT8U stop)
{
INT8U i;
if (start < stop)
{
  for (i=start; i<stop; i+=1)
  {
   SetContrast(iIntRegValue, i); //slowly turn on display
   delay_us(80);
  }
}
else
{
  for (i=start; i>stop; i-=1)
  {
   SetContrast(iIntRegValue, i); //slowly turn off display
   delay_us(120);
  }
}
}
  
  
void ClearScreen(void)             //清屏
{
  INT8U x,y;
for(x = 0;x < 8 ;x++){
          SetRamAddr(x , 0);
    for(y = 0 ; y < 128 ; y++){     
        
   WriteLCD(DATA , 0x00);
  }  
}
}
  
void HalLcdInit(void)
{
  P1DIR |= 0xFC;
        P2DIR |= 0x01;
        P0DIR |= 0x02;
        P1_2 = 0;
delay_us(100);
WriteLCD(COMMAND , 0xE2);//内部复位
  delay_us(100);
WriteLCD(COMMAND , 0xA3);//设置液晶驱动电压偏差率  sets the lcd drive voltage bias ratio 1/7bias
  delay_us(100);
WriteLCD(COMMAND , 0xA0);//ADC select  normal  正常 set the display RAM address SEG output correspondence

delay_us(100);
WriteLCD(COMMAND , 0xC8);//输出扫描方向  reverse反方向
  delay_us(100);
WriteLCD(COMMAND , 0x24);//

delay_us(100);
WriteLCD(COMMAND , 0x81);// 电量模式设置 electronic volume mode set , set the v0 output voltage electronic volume register
  delay_us(100);
WriteLCD(COMMAND , 0x14);//高地址显示位置

delay_us(100);
WriteLCD(COMMAND , 0x2F);//增压电路booster circuit on,电压调节器电路voltage regulator circuit on,电压跟随器电路voltage follower cicuit on.
  delay_us(100);
WriteLCD(COMMAND , 0x40);//显示行位置

delay_us(100);
WriteLCD(COMMAND , 0xB0);//显示页位置
  delay_us(100);
WriteLCD(COMMAND , 0x10);//显示高4位列地址

delay_us(100);
WriteLCD(COMMAND , 0x00);//显示低4位列地址
  delay_us(100);
WriteLCD(COMMAND , 0xAF);//显示开
  WriteLCD(COMMAND , 0x81);
WriteLCD(COMMAND , 0x1b);
        delay_us(100);
        SetContrast(iIntRegValuea,ContrastValue);
ClearScreen();
}
  
  /*******************************************************************************
//???:void Print6(INT8U xx, INT8U yy, INT8U ch1[], INT8U yn)
//??:??显示6*8字符串
//??:xx ,yy 坐标,ch1待显示字符串,yn反显
//??:?
*******************************************************************************
void Print6(INT8U xx, INT8U yy, INT8U ch1[], INT8U yn)  
{
INT8U ii = 0;
INT8U bb = 0;
unsigned int index = 0 ;
   
while(ch1[bb] != '/0')
{
                index = (unsigned int)(ch1[bb] - 0x20);
  index = (unsigned int)index*6;  
  for(ii=0;ii<6;ii++)
  {
   SetRamAddr(xx , yy);
   if(yn == 0)
   {
    WriteLCD(DATA, ~FontSystem6x8[index]);
   
   }
   else
   {
    WriteLCD(DATA, FontSystem6x8[index]);
   }  
   index += 1;
   yy += 1;
  }  
  bb += 1;
}
}
*/
  //*******************************************************************************
//???:void Printn8(INT8U xx ,INT8U yy , INT32U no,INT8U yn,INT8U le)
//??:显示8*8一个无符号数据
//??:xx , yy屏幕当中的位置,no待显数据 yn=0正常显示 yn=1反黑显示  le有效位
//??:?
//*******************************************************************************
void Printn8(INT8U xx ,INT8U yy , INT32U no,INT8U yn,INT8U le)
{
INT8U ch2[6];
INT8U ii;
  for(ii = 1 ; ii <= le ;){
  ch2[le - ii] = no % 10 + 0x30;
  no /= 10;
  ii += 1;
}
ch2[le] = '/0';
Print8(xx ,yy ,ch2 ,yn);
}
  /*******************************************************************************
//???:void Print8(INT16U y,INT16U x, INT8U ch,INT16U yn)
//??:显示8*8字符
//??:xx ,yy 坐标,ch待显示字符,yn是否反黑
//??:?
*******************************************************************************
void PrintCh8(INT16U y,INT16U x, INT8U ch,INT16U yn)
{
INT8U wm;
INT16U adder;

adder = (ch - 0x20) * 16;
for(wm = 0;wm < 8;wm++)
{
  SetRamAddr(y , x);
  if(yn == 0)
  {
   WriteLCD(DATA, ~Font8X8[adder]);//调用字符库
  }
  else
  {
   WriteLCD(DATA, Font8X8[adder]);
  }
  adder += 1;
  x += 1;
}
y += 1;
x -= 8;
for(wm = 0;wm < 8;wm++)
{
  SetRamAddr(y , x);
  if(yn == 0)
  {
    WriteLCD(DATA, ~Font8X8[adder]);
  }
  else
  {
   WriteLCD(DATA, Font8X8[adder]);
  }
  adder += 1;
  x += 1;
}
}
*/
  /*******************************************************************************
//???:void Print8(INT16U y,INT16U x, INT8U ch[],INT16U yn)
//??:显示8*8字符串
//??:xx ,yy 坐标,ch1待显示的字符串,yn是否反黑
//??:?
********************************************************************************/
void Print8(INT16U y,INT16U x, INT8U ch[],INT16U yn)
{
INT8U wm ,ii = 0;
INT16U adder;
  while(ch[ii] != '/0')
{
  adder = (ch[ii] - 0x20) * 16;//字符的ASCII码
  for(wm = 0;wm < 8;wm++)
  {
   SetRamAddr(y , x);
   if(yn == 0)
   {
    WriteLCD(DATA, ~Font8X8[adder]);
   }
   else
   {
    WriteLCD(DATA, Font8X8[adder]);
   }
   adder += 1;
   x += 1;
  }
  y += 1;
  x -= 8;
  for(wm = 0;wm < 8;wm++)
  {
   SetRamAddr(y , x);
   if(yn == 0)
   {
    WriteLCD(DATA, ~Font8X8[adder]);
   }
   else
   {
    WriteLCD(DATA, Font8X8[adder]);
   }
   adder += 1;
   x += 1;
  }
  ii += 1;
  y -= 1;
}
  }
  
/*******************************************************************************
//???:void Print16(INT16U y,INT16U x,INT8U ch[],INT16U yn)
//??:显示汉字
//??:x ,y ??,ch[]待显示的汉字,yn是否反黑
//??:?
********************************************************************************
void Print16(INT16U y,INT16U x,INT8U ch[],INT16U yn)
{
INT8U wm ,ii = 0;
INT16U adder;
  wm = 0;
adder = 1;
while(FontNew8X16_Index[wm] > 128)
{
  if(FontNew8X16_Index[wm] == ch[ii])
  {
   if(FontNew8X16_Index[wm + 1] == ch[ii + 1])
   {
    adder = wm * 14;
    break;
   }
  }
  wm += 2;    //找到汉字在索引中的位置
}
SetRamAddr(y , x);
  if(adder != 1)     //找到汉字,显示出来
{
  
  for(wm = 0;wm < 14;wm++)
  {
   SetRamAddr(y , x);
   if(yn == 0)
   {
    WriteLCD(DATA, ~FontNew16X16[adder]);
   }
   else
   {
    WriteLCD(DATA, FontNew16X16[adder]);
   }
   adder += 1;
   x += 1;
  }
                for(wm = 0;wm < 2;wm++)
  {
   SetRamAddr(y , x);
   if(yn == 0)
   {
    WriteLCD(DATA, 0xff);
   }
   else
   {
    WriteLCD(DATA, 0x00);
   }
   x += 1;
  }
  y += 1;
  x -=16;
  for(wm = 0;wm < 14;wm++)
  {
   SetRamAddr(y , x);
   if(yn == 0)
   {
    WriteLCD(DATA, ~FontNew16X16[adder]);
   }
   else
   {
    WriteLCD(DATA, FontNew16X16[adder]);
   }
   adder += 1;
   x += 1;
  }
                for(wm = 0;wm < 2;wm++)
  {
   SetRamAddr(y , x);
   if(yn == 0)
   {
    WriteLCD(DATA, 0xff);
   }
   else
   {
    WriteLCD(DATA, 0x00);
   }
   x += 1;
  }
  
}
else      //找不到显示空格   
{
  ii += 1;
  for(wm = 0;wm < 16;wm++)
  {
   SetRamAddr(y , x);
   if(yn == 0)
   {
    WriteLCD(DATA, 0xff);
   }
   else
   {
    WriteLCD(DATA, 0x00);
   }
   x += 1;
  }
  y += 1;
  x -= 16;
  for(wm = 0;wm < 16;wm++)
  {
   SetRamAddr(y , x);
   if(yn == 0)
   {
    WriteLCD(DATA, 0xff);
   }
   else
   {
    WriteLCD(DATA, 0x00);
   }
   x += 1;
  }
}
}*/
  
/*******************************************************************************
//???:void Print(INT8U y, INT8U x, INT8U ch[], INT16U yn)
//??:实现汉字及字母混合显示
//??:x ,y 坐标,ch[]带显示的汉字或字母,yn是否反黑
//??:?
*******************************************************************************
void Print(INT8U y, INT8U x, INT8U ch[], INT16U yn)
{
INT8U ch2[3];
INT8U ii;
        ii = 0;
while(ch[ii] != '/0')
{
  if(ch[ii] > 128)
  {
   ch2[0] = ch[ii];
    ch2[1] = ch[ii + 1];
   ch2[2] = '/0';   //汉字为两个字节
   //Print16(y , x , ch2 , yn); //显示汉字
   x += 16;
   ii += 2;
  }
  else
  {
   ch2[0] = ch[ii];
   ch2[1] = '/0';   //字母占一个字节
   Print8(y , x , ch2 , yn); //显示字母
   x += 8;
   ii += 1;
  }
}
}
*/
#endif
             版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-137051-1-1.html 上篇帖子: Oracle 11.2.0.3 RAC环境 ORA-29280 错误解决办法 下篇帖子: Oracle备份恢复概要
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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