#include "CHR.h" //字库
unsigned char current_column; //当前要写入字符的列号
unsigned char end_column; //最后写入字符的下一个列号
unsigned char cursor_column; //光标所在列号
unsigned char line_ column; //上一行最后一个字的起始列号
unsigned char current_page; //当前页数
/*
****函数列表****
//状态检查
void CheckState(void)
//向LCD发送命令
//command :命令
SendCommandToLCD(unsigned char command)
//液晶复位
void Reset(void)
//开关显示
void SetOnOff(unsigned char onoff)
//初始化LCD
void InitLCD(void)
//选择屏幕
//screen: 0-右屏,1-左屏
void SelectScreen(unsigned char screen)
//清屏
//screen: 0-右屏,1-左屏
void ClearScreen(unsigned char screen)
//设定页地址--X 0-7
void SetPage(unsigned char page)
//设定列地址--Y 0-63
void SetColumn(unsigned char column)
//设定显示开始行--XX
void SetStartLine(unsigned char startline) //0--32
//延时
void OCM12832delay(unsigned char i)
//写显示数据
//dat:显示数据
void WriteByte(unsigned char dat)
//读显示数据
unsigned char ReadByte(void)
//单字符显示
void ShowChar(char c)
//显示字符串
void ShowString(int num, char *buffer)
//清除一个字符
void ClearChar(void)
//光标显示
void ShowCursor(void)
//功能键 左移光标
void left_cursor(void)
//功能键 右移光标
void right_cursor(void)
//功能键 上移光标
void up_cursor(void)
//功能键 下移光标
void down_cursor(void)
****函数列表结束****
*/
//状态检查
void CheckState()
{
unsigned char dat;
OCM_RW_READ;
OCM_RS_COM;
do{
OCM12832Port = 0xff;
OCM_E_SET;
dat = OCM12832Port;
OCM_E_CLR;
dat=0x90 & dat; //仅当第4,7位为0时才可操作
}while(!(dat==0x00));
return;
}
//向LCD发送命令
//command :命令
void SendCommandToLCD(unsigned char command)
{
CheckState();
OCM_RW_WRITE;
OCM_RS_COM;
OCM12832Port = command;
OCM_E_SET;
OCM_E_CLR;
return;
}
//液晶复位
void Reset()
{
OCM_RET_SET;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_
(); _nop_(); _nop_();
OCM_RET_CLR;
return;
}
//开关显示
void SetOnOff(unsigned char onoff)
{
onoff=0x3e | onoff; //0011 111x
SendCommandToLCD(onoff);
return;
}
//初始化LCD
void InitLCD() 0-右屏,1-左屏
{
unsigned char i=250; //延时
while(i--);
Reset();
SelectScreen(1);
SetOnOff(0); //关显示
SelectScreen(0);
SetOnOff(0); //关显示
ClearScreen(1);//清屏
ClearScreen(0);
SelectScreen(1);
SetOnOff(1); //开显示
SelectScreen(0);
SetOnOff(1); //开显示
SelectScreen(1);
SetStartLine(0); //开始行:0
current_column = 0;
end_column = 0;
cursor_column = 0;
line_ column = 0;
current_page = 0;
return;
}
//选择屏幕
//screen: 0-右屏,1-左屏
void SelectScreen(unsigned char screen)
{
switch(screen)
{
case 0: OCM_CS_RIGHTSET;
_nop_(); _nop_
(); _nop_(); _nop_(); _nop_(); _nop_();
break;
case 1: OCM_CS_LEFTSET;
_nop_(); _nop_
(); _nop_(); _nop_(); _nop_(); _nop_();
break;
}
return;
}
//清屏
//screen: 0-右屏,1-左屏 8页?4页?
void ClearScreen(unsigned char screen)
{
unsigned char i,j;//i是页码,j是行码
SelectScreen(screen);
for(i = 0; i < 8; i ++)
{
SetPage(i);
SetColumn(0);//从第一列开始
for(j = 0; j < 64; j++)
{
WriteByte(0x00);
}
}
return;
}
//设定页地址--X 0-7
void SetPage(unsigned char page)
{
page = page & 0x07; // 0 <=line <=7
page = page | 0xb8; //1011 1xxx
SendCommandToLCD(page);
return;
}
//设定列地址--Y 0-63
void SetColumn(unsigned char column)
{
column=column &0x3f; // 0= <column <=63
column=column | 0x40; //01xx xxxx
SendCommandToLCD(column);
return;
}
//设定显示开始行--XX
void SetStartLine(unsigned char startline) //0--31 芯片支持64行
{
startline=startline & 0x1f; // 0= <startline <=31
startline=startline|0xc0; //11xx xxxx
SendCommandToLCD(startline);
return;
}
//延时
void OCM12832delay(unsigned char n)
{
unsigned char i,j;
for(i = 0; i < n; i++)
{
do
{ for(j = 0; j != 1000; j++)
{;}
}while(--j);
}
return;
}
//写显示数据
//dat:显示数据
void WriteByte(unsigned char dat)
{
CheckState();
OCM_RW_WRITE;
OCM_RS_DATA;
OCM12832Port = dat;
OCM_E_SET;
OCM_E_CLR;
current_column += 1;
end_column += 1;
return;
}
//读显示数据
unsigned char ReadByte()
{
unsigned char dat;
CheckState();
OCM_RW_READ;
OCM_RS_DATA;
OCM12832Port = 0xff;
OCM_E_SET;
dat = OCM12832Port;
OCM_E_CLR;
return(dat);
}
//单字符显示 6*8 每两个字符之间隔一列
void ShowChar(char c)
{
unsigned char i,dat;
unsigned char temp_column; //用于列控制, 从光标处开始写
// current_column = cursor_column;
temp_column = cursor_column; //从光标处开始写
line_column = cursor_column; //记录前一个字的首列号
if(current_column > 122) //换行判断
{
current_page +=1;
current_column = 0; //另起一行
}
for(i = 0; i < 6; i++) //显示字符
{
if(current_column <= 63) //左半屏
{
SelectScreen(1);
SetPage(current_page);
SetColumn(current_column);
dat = CTAB[c - 0x20][i];
WriteByte(dat);
}
else
{
SelectScreen(0); //右半屏
SetPage(current_page);
temp_column = current_column - 64;
SetColumn(temp_column);
dat = CTAB[c - 0x20][i];
WriteByte(dat);
}
}
corsur_column = current_column; //记录光标应在位置列号
return;
}
//显示字符串
void ShowString(int num, char *buffer)
{
unsigned char i;
for(i = 0; i < num; i++)
{
showchar(buffer[i]);
}
return;
}
//清除一个字符
void ClearChar(void)
{
current_column = line_column;
showchar(0x20);
cursor_column = line_column;
}
//光标显示
void ShowCursor(void)
{
unsigned char temp_column; //
temp_column = cursor_column; //从光标处开始写
SetPage(current_page);
if(current_column > 122) //换行判断
{
current_page +=1;
SetPage(current_page);
current_column = 0; //另起一行
cursor_column = 0;
}
if(current_column <= 63) //左半屏
{
SelectScreen(1);
SetColumn(cursor_column);
WriteByte(0xFF);
OCM12832delay(500);
SetColumn(cursor_column);
WriteByte(0x00);
OCM12832delay(500);
}
else
{
SelectScreen(0); //右半屏
temp_column = cursor_column- 64;
SetColumn(temp_column);
WriteByte(0xFF);
OCM12832delay(500);
SetColumn(temp_column);
WriteByte(0x00);
OCM12832delay(500);
}
current_column = cursor_column;
}
//功能键 左移光标
void left_cursor(void)
{
}
//功能键 右移光标
void right_cursor(void)
{
}
//功能键 上移光标
void up_cursor(void)
{
if(current_page > 0)
{
current_page -= 1;
SetPage(current_page);
}
SetColumn(cursor_column);
while(!(ReadByte() == 0x00))
{
cursor_column -= 1;
SetColumn(cursor_column);
}
return;
}
//功能键 下移光标
void down_cursor(void)
{
}