KS0108B驱动程序

/**************************************************************************************************************/
//   FILE NAME   : KS0108B.c
  
//   DESCRIPTION : Subroutines for KS0108B.
//   REVISION 1.0

//   IDE:KEIL C51或Silicon Laboratories IDE
//
//  液晶点阵显示---- SG19264-3A,控制器KS0108B

//
//   By Ryongwin.B
//   Jun.2006.
/**************************************************************************************************************/
//#include "c8051F000.h"
//#include "intrins.h"
/**************************************************************************************************************/
//sbit          di    =  P2^0                   //命令寄存器和数据RAM之间的选择
sbit           rs    =  P2^0;                          //命令寄存器和数据RAM之间的选择
sbit           rw    =  P2^1;                          //读写控制线
sbit           en    =  P2^2;                          //使能控制线


#define        LCD_DATA_PORT         P3                //定义数据端口
#define        TIMEOUT               20000             //KS0108B忙超时
#define        NOP2()               {_nop_();_nop_();}
#define        NOP4()               {_nop_();_nop_();\
                                     _nop_();_nop_();}
#define        NOP5()               {_nop_();_nop_();\
                                     _nop_();_nop_();\
          _nop_();}
#define        NOP6()               {_nop_();_nop_();\
                                     _nop_();_nop_();\
          _nop_();_nop_();}

//KS0108B      命令宏定义
#define        TURNONOFF            0x3E       //0011111x显示开关
#define        SETX                 0xb8       //10111xxx设置页地址
#define        SETY                 0x40       //01xxxxxx设置列地址
#define        SETZ                 0xC0       //11xxxxxx设置显示起始行
/**************************************************************************************************************/
//函数原型:void Wait(unsigned int t)
//功能:延时等待。
//参数:t,等待时间。
//返回值:无
//说明:同Delay()函数。
/**************************************************************************************************************/
void Wait(unsigned char t)
{
  if(t)
  while(--t);
}
/**************************************************************************************************************/
//函数原型:void IsKS0070Busy(void)
//功能:检测KS0070B忙标志。
//参数:无。
//返回值:无。
//说明:
/**************************************************************************************************************/
void IsKS0108Busy(void)//reentrant
{
  unsigned int timeout;
  unsigned char dat;
  timeout=0; 
  LCD_DATA_PORT=0xFF;//设置51MCU端口为输入
  rs=0;              //
  rw=1; 
  do
  {
    en=1;
 NOP4();
    //Wait(T);
 dat=LCD_DATA_PORT;
 dat&=0x90;        //4位复位位,7位忙标志
    en=0;
 NOP6();
 //Wait(T);
  }while((dat!=0)&&(timeout++  en=0;
  NOP6();
  //Wait(T);
}
/**************************************************************************************************************/
//函数原型:void WriteByteToKs0108b(unsigned char dat)
//功能:写显示数据
//参数:dat:显示数据
//返回值:
//说明:
/**************************************************************************************************************/
void WriteByteToKs0108b(unsigned char dat)
{
  IsKS0108Busy();

  rs=1;
  rw=0;
  LCD_DATA_PORT=dat;
  en=1;
  NOP6();
  //Wait(T);
  en=0;
  NOP6();
  //Wait(T);
}
/**************************************************************************************************************/
//函数原型:unsigned char ReadByteFromKs0108b(void)
//功能:读显示数据。
//参数:无。
//返回值:显示数据。
//说明:
/**************************************************************************************************************/
unsigned char ReadByteFromKs0108b(void)
{
  unsigned char dat;
  IsKS0108Busy();
  LCD_DATA_PORT=0xFF;//设置51MCU端口为输入
  rs=1;
  rw=1;

  en=1;
  NOP4();
  //Wait(T);
  dat=LCD_DATA_PORT;
  en=0;
  NOP6();
  //Wait(T);
  return(dat);
}
/**************************************************************************************************************/
//函数原型:void SendCmdToKs0108b(unsigned char cmd)
//功能:向KS0108B发送命令
//参数:cmd 命令。
//返回值:无。
//说明:
/**************************************************************************************************************/
void SendCmdToKs0108b(unsigned char cmd)
{
  IsKS0108Busy();
  rs=0;
  rw=0;
  LCD_DATA_PORT=cmd;
  en=1;
  NOP6();
  //Wait(T);
  en=0;
  NOP6();
  //Wait(T);
}
/*------------------------------------------------------------------------------------------------------------*/
/**************************************************************************************************************/
//函数原型:void SetLine(unsigned char line)
//功能:设定页地址,即设置KS0108B的X地址计数器
//参数:page显示页.
//返回值:无
//说明:所谓页地址就是DDRAM中的行地址,8行为一页,模块共64行,即8页,读写数据对该地址没有影响。
/**************************************************************************************************************/
void SetPage(unsigned char page)
{
  page=page & 0x07; // 0<=line<=7
  page=page|SETX;   //10111xxx
  SendCmdToKs0108b(page);
}
/**************************************************************************************************************/
//函数原型:void SetColumn(unsigned char column)
//功能:设定列地址--Y 0-63
//参数:column显示列
//返回值:无
//说明:在对DDRAM进行读写操作后,Y地址计数器自动加1
/**************************************************************************************************************/
void SetColumn(unsigned char column)
{
  column=column &0x3f; // 0=  column=column | SETY; //01xxxxxx
  SendCmdToKs0108b(column);
}
/**************************************************************************************************************/
//函数原型:void SetStartLine(unsigned char startline)
//功能:设定显示开始行--XX 0--63
//参数:startline
//返回值:无。
//说明:显示起始行是由Z地址计数器控制的,显示起始行可以是0-63中的任意一个。
/**************************************************************************************************************/
void SetStartLine(unsigned char startline)
{
  startline=startline & 0x3F;
  startline=startline|SETZ;    //11000000
  SendCmdToKs0108b(startline);
}
/**************************************************************************************************************/
//函数原型:void TurnOnOff(unsigned char onoff)
//功能:开关显示
//参数:onoff 1表示开显示,0表示关显示。
//返回值:无。
//说明:开关显示不影响DDRAM中数据和状态。
/**************************************************************************************************************/
void TurnOnOff(unsigned char onoff)
{
  onoff=onoff&0x01;
  onoff= onoff|TURNONOFF; //0011 111x
  SendCmdToKs0108b(onoff);
}

你可能感兴趣的:(嵌入式)