// 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++
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=
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);
}