📄 splc501user.c
字号:
//***************************************************************************//
//文件描述:SPLC501用户接口驱动程序,
//
//声明: 小丑 20050519 Sunnorth Mz Design
//
//
//***************************************************************************//
#include "SPLC501User.h"
//#include "ASII16X16OSD.h"
extern unsigned int Asii8;
extern unsigned int Asii16;
extern void F_SPLC501_Initial_IO(void);
extern void F_SPLC501_Write_Com(unsigned int Command);
extern void F_SPLC501_Write_Data(unsigned int SendData);
extern unsigned int F_SPLC501_Read_Data(void);
extern unsigned int F_SPLC501_Read_Status(void);
unsigned int CurPaintMode; //Show Mode Cover of XOR
unsigned int CurPowerMode; //Show the Power Mode of LCD501
unsigned int CurLCDSet; //Show the LCD Set灰度
unsigned int CurScroll; //Show the scroll dotes
unsigned int CurScrMode; //显示正相/反相(1/0)
unsigned int CurASCIIFont; //当前ASCII码的字号(8X16/6X8)
//***************************************************************************//
//程序:F_LCD_ON_OFF(unsigned int SetCom)
//描述:液晶开关函数 C语言调用
//参数:unsigned int SetCom SetCom=0:LCD Off SetCom!=0:LCD On
//声明:小丑 20050519 sunnorth Mz Design
//注意:破坏R1寄存器,保护R1
//***************************************************************************//
void F_LCD_ONOFF(unsigned int SetCom)
{
if(SetCom) //ON LCD
F_SPLC501_Write_Com(M_LCD_ON);
else //OFF LCD
F_SPLC501_Write_Com(M_LCD_OFF);
}
//***************************************************************************//
//程序:LCD501_Init(unsigned int InitialData)
//描述:液晶显示初始化函数 C语言调用
//参数:unsigned int InitialData 初始化显示的字
//声明:xinqiang 20050519 sunnorth Mz Design
//注意:破坏R1寄存器,保护R1
//***************************************************************************//
void LCD501_Init(unsigned int InitialData)
{
unsigned int i,j;
F_SPLC501_Initial_IO(); //Initial LCD IO
F_SPLC501_Write_Com(M_LCD_ON); //LCD On
F_SPLC501_Write_Com(M_LCD_POWER_ALL); //设置上电控制模式
F_SPLC501_Write_Com(M_LCD_ELE_VOL); //电量设置模式(显示亮度)
F_SPLC501_Write_Com(0x0012); //指令数据0x0000~0x003f
F_SPLC501_Write_Com(M_LCD_VDD_SET); //V5内部电压调节电阻设置
F_SPLC501_Write_Com(M_LCD_VDD); //LCD偏压设置,V3时选
F_SPLC501_Write_Com(M_LCD_COM_NOR); //Com 扫描方式设置
F_SPLC501_Write_Com(M_LCD_SEG_REV); //Segment方向选择
F_SPLC501_Write_Com(M_LCD_ALL_LOW); //全屏点亮/变暗指令
F_SPLC501_Write_Com(M_LCD_ALL_NOR); //正向反向显示控制指令
F_SPLC501_Write_Com(M_LCD_STATIC_OFF); //关闭静态指示器
F_SPLC501_Write_Com(0x0000); //指令数据
// F_SPLC501_Write_Com(0x00ee); //读写改模式结束指令
F_SPLC501_Write_Com(M_LCD_BEGIN_LINE+0); //设置显示起始行对应RAM
for(i=0;i<8;i++) //往LCD中填充初始化的显示数据
{
F_SPLC501_Write_Com(M_LCD_COL_PAGE+i);
F_SPLC501_Write_Com(M_LCD_COL_LINE_LOW);
F_SPLC501_Write_Com(M_LCD_COL_LINE_HIG);
for(j=0;j<128;j++)
{
F_SPLC501_Write_Data(InitialData);
}
}
CurPaintMode = 0;
CurPowerMode = 1; //now is normal mode
CurLCDSet = 8;
CurScroll = 0;
CurScrMode = 1;
CurASCIIFont = 1;
}
//======================================================
// 程序: void LCD501_Power(unsigned ModeCode)
// 描述: SPLC501电源管理,进入参数指定的模式,而当LCD在SLEEP和STDBY模式下时,
// 调用该函数会使LCD唤醒
// 参数: ModeCode - 可以是下列参数之一:
// 1 PWR_ON: 正常工作模式
// 2 PWR_SLEEP: 睡眠模式,屏幕不显示,但内容在唤醒后仍保留
// 3 PWR_STDBY: 待机模式,比SLEEP省电,但显示内容会丢失
// 0 PWR_OFF: 关闭电源
// 声明: xinqiang 20050624 sunnorth Mz Design
// 注意: 无
//======================================================
void LCD501_Power(unsigned ModeCode)
{
if(CurPowerMode == PWR_SLEEP)
{
F_SPLC501_Write_Com(M_LCD_ALL_LOW);
F_SPLC501_Write_Com(M_LCD_STATIC_ON);
F_SPLC501_Write_Com(0x0003);
CurPowerMode = 1;
}
else if(CurPowerMode == PWR_STDBY)
{
F_SPLC501_Write_Com(M_LCD_ON);
F_SPLC501_Write_Com(M_LCD_ALL_LOW);
CurPowerMode = 1;
}
else{
switch(ModeCode)
{
case PWR_ON:
F_SPLC501_Write_Com(M_LCD_ON);
break;
case PWR_SLEEP:
F_SPLC501_Write_Com(M_LCD_STATIC_OFF);
F_SPLC501_Write_Com(0x0000);
F_SPLC501_Write_Com(M_LCD_OFF);
F_SPLC501_Write_Com(M_LCD_ALL_LIGNT);
break;
case PWR_STDBY:
F_SPLC501_Write_Com(M_LCD_STATIC_ON);
F_SPLC501_Write_Com(0x0003);
F_SPLC501_Write_Com(M_LCD_OFF);
F_SPLC501_Write_Com(M_LCD_ALL_LIGNT);
break;
default://POW_OFF
F_SPLC501_Write_Com(M_LCD_OFF);
break;
}//
CurPowerMode = ModeCode;
}
}
//***************************************************************************//
// 程序: void LCD501_SetContrast(unsigned Contrast)
// 描述: 设置显示对比度 C语言调用
// 参数: Contrast - 对比度值,范围从0到31,数值越大对比度越高
// 返回: 无
// 声明: xinqiang 20050624 Mz Design
// 注意: 无
//***************************************************************************//
void LCD501_SetContrast(unsigned Contrast)
{
if(Contrast>0x003f)
Contrast = 0x003f;
F_SPLC501_Write_Com(M_LCD_ELE_VOL); //电量设置模式(显示亮度)
F_SPLC501_Write_Com(Contrast); //电量设置模式(显示亮度)
CurLCDSet = Contrast;
}
//***************************************************************************//
// 程序: unsigned LCD501_GetContrast(void)
// 描述: 获取显示对比度 C语言调用
// 参数: 无
// 返回: 当前显示的对比度值
// 声明: xinqiang 20050624 Mz Design
// 注意: 无
//***************************************************************************//
unsigned LCD501_GetContrast(void)
{
return CurLCDSet;//
}
//***************************************************************************//
// 程序: void LCD501_ScrollUp(unsigned Rows)
// 描述: 屏幕向上滚动 C语言调用
// 参数: Rows 屏幕向上滚动的像素数,范围从1到64
// 返回: null
// 声明: xinqiang 20050624 Mz Design
// 注意: 无
//***************************************************************************//
void LCD501_ScrollUp(unsigned Rows)
{
CurScroll = CurScroll+Rows;
while(CurScroll>=SCR_MAX_ROW)
CurScroll -= SCR_MAX_ROW;
F_SPLC501_Write_Com(M_LCD_BEGIN_LINE+CurScroll); //设置显示起始行对应RAM
}
//***************************************************************************//
// 程序: unsigned LCD501_GetScroll(void)
// 描述: 获取屏幕已经向上滚动的值 C语言调用
// 参数: 无
// 返回: 屏幕已经向上滚动的值
// 声明: xinqiang 20050624 Mz Design
// 注意: 无
//***************************************************************************//
unsigned LCD501_GetScroll(void)
{
return CurScroll;//
}
//***************************************************************************//
// 程序: void LCD501_ReverseColor(void)
// 描述: 屏幕反色显示。每执行一次该函数,屏幕颜色翻转一次。 C语言调用
// 参数: 无
// 返回: 无
// 声明: xinqiang 20050624 Mz Design
// 注意: 无
//***************************************************************************//
void LCD501_ReverseColor(void)
{
if(CurScrMode)//
{
F_SPLC501_Write_Com(M_LCD_ALL_REV); //正向反向显示控制指令
CurScrMode = 0;
}
else
{
F_SPLC501_Write_Com(M_LCD_ALL_NOR); //正向反向显示控制指令
CurScrMode = 1;
}
}
//***************************************************************************//
//程序:LCD501_ClrScreen(unsigned int Mode)
//描述:液晶整屏清屏函数 C语言调用
//参数:unsigned int Mode 清屏类型Mode=1 则全点亮,Mode=0 内全清零
//声明:小丑 20050519 sunnorth Mz Design
//注意:破坏R1寄存器,保护R1
//***************************************************************************//
void LCD501_ClrScreen(unsigned int Mode)
{
unsigned int i,j;
if(Mode)
Mode = 0x00ff;
else
Mode = 0x0000;
for(i=0;i<8;i++)
{
F_SPLC501_Write_Com(M_LCD_COL_PAGE+i);
F_SPLC501_Write_Com(M_LCD_COL_LINE_LOW);
F_SPLC501_Write_Com(M_LCD_COL_LINE_HIG);
F_SPLC501_Write_Com(0xee); //读改写模式结束指令
for(j=0;j<128;j++)
{
F_SPLC501_Write_Data(Mode);
}
}
}
//***************************************************************************//
//程序:F_LCD_LineRun(unsigned int line)
//描述:液晶显示起始行设置函数 C语言调用 (滚屏功能用)
//参数:unsigned int line 起始RAM行,0~63
//声明:小丑 20050527 sunnorth Mz Design
//注意:破坏R1寄存器,保护R1
//***************************************************************************//
void F_LCD_LineRun(unsigned int line)
{
if(line>=64)
line = 0;
F_SPLC501_Write_Com(M_LCD_BEGIN_LINE+line); //设置显示起始行对应RAM
}
//***************************************************************************//
//程序:void F_LCD_WOSCASII(unsigned int x,unsigned int page,unsigned int d)
//描述:OSD取的ASCII字符显示函数 C语言调用
//参数:x 显示字符的起始列(0~128) page 显示字符的起始页(0~6)
// d ASCII码
//声明:小丑 20050519 sunnorth Mz Design
//注意:仅用于显示用OSD取字模工具取的16X16、16X12字模的ASCII字符
//***************************************************************************//
/*void F_LCD_WOSCASII(unsigned int x,unsigned int page,unsigned int d)
{
unsigned int untype;
unsigned int *word;
int i,j,m;
unsigned int x_low,x_hight;
d = d-33;
word = (unsigned int)encoding_00+(d*17);
untype = *(word++);
i = untype>>8;
j = (untype&0xff);
x_low = (x&0x000f)+ M_LCD_COL_LINE_LOW; //定位列地址设置的低位指令
x_hight = ((x>>4)&0x000f)+M_LCD_COL_LINE_HIG; //定位列地址设置的高位指令
for(;i>0;)
{
i = i-8;
F_SPLC501_Write_Com(M_LCD_COL_PAGE+page);
F_SPLC501_Write_Com(x_low);
F_SPLC501_Write_Com(x_hight);
for(m=0;m<j;m++)
{
if(i)
untype = *(word+m);
else
untype = (*(word+m)>>8);
untype = untype&0x00ff;
F_SPLC501_Write_Data(untype);
}
page++;
}
}*/
//***************************************************************************//
// 程序: void LCD501_SetPaintMode(unsigned ModeCode)
// 描述: 设置图形显示模式
// 参数: ModeCode - 图形显示模式,可以是下列数值之一:
// 0 PAINT_COVER: 覆盖显示。图形所在位置的原有显示内容将被覆盖掉
// 1 PAINT_SET: 叠加显示。图形所在位置中原有的黑色点将被保留
// 2 PAINT_CLR: 擦除显示。图形反色显示,但图形所在位置中原有的白
// 色点将被保留
// 3 PAINT_REV: 异或显示。图形中每一个点与原有的点做异或,即如果
// 图形中某点的颜色与其所在位置原有的颜色相同,则
// 该点显示白色,如果新颜色与原来颜色不同,则该点
// 显示黑色
// 4 PAINT_RECO 取反并覆盖显示。原始图像数据取反,然后图形所在位置
// 的原有显示内容将被覆盖掉
// 返回: 无
// 声明: xinqiang 20050810 Mz Design
// 注意:
//***************************************************************************//
void LCD501_SetPaintMode(unsigned ModeCode)
{
if(ModeCode > 4)
ModeCode = PAINT_COVER;
CurPaintMode = ModeCode;
}
//***************************************************************************//
// 程序: unsigned int LCD501_GetPaintMode(void)
// 描述: 设置图形显示模式
// 参数: 无
// 返回: ModeCode - 图形显示模式,可以是下列数值之一:
// 0 PAINT_COVER: 覆盖显示。图形所在位置的原有显示内容将被覆盖掉
// 1 PAINT_SET: 叠加显示。图形所在位置中原有的黑色点将被保留
// 2 PAINT_CLR: 擦除显示。图形反色显示,但图形所在位置中原有的白
// 色点将被保留
// 3 PAINT_REV: 异或显示。图形中每一个点与原有的点做异或,即如果
// 图形中某点的颜色与其所在位置原有的颜色相同,则
// 该点显示白色,如果新颜色与原来颜色不同,则该点
// 显示黑色
// 4 PAINT_RECO 取反并覆盖显示。原始图像数据取反,然后图形所在位置
// 的原有显示内容将被覆盖掉
// 声明: xinqiang 20050810 Mz Design
// 注意:
//***************************************************************************//
unsigned int LCD501_GetPaintMode(void)
{
return CurPaintMode;
}
//***************************************************************************//
//程序:void LCD501_PutPixel(unsigned int x,unsigned int y)
//描述:画点子程序
//参数:x 要画点的x坐标 y 要画的点的y坐标
//返回:无
//声明:xinqiang 20050521 sunnorth Mz Design
//注意:无
//***************************************************************************//
void LCD501_PutPixel(unsigned int x,unsigned int y)
{
unsigned int x_low,x_hight; //定义列地址的高低位指令
unsigned int Dot_Mask_Buf=0x0001;
unsigned int y_Page; //用于存放要画点的位置所在的byte数据位置
x = x+4;
x_low = (x&0x000f); //定位列地址设置的低位指令
x_hight = ((x>>4)&0x000f)+0x10; //定位列地址设置的高位指令
y_Page = y&0x07; //取低三位
while(y_Page!=0)
{
Dot_Mask_Buf = Dot_Mask_Buf<<1;
y_Page--;
}
y_Page = y>>3; //Get the page of the byte
F_SPLC501_Write_Com(M_LCD_COL_PAGE+y_Page);
F_SPLC501_Write_Com(x_low);
F_SPLC501_Write_Com(x_hight);
F_SPLC501_Write_Com(0xe0); //设置为读写改模式
y_Page = F_SPLC501_Read_Data(); //
switch(CurPaintMode)
{
case PAINT_CLR: y_Page = y_Page&(~Dot_Mask_Buf);
break;
// case PAINT_SET: y_Page = y_Page|Dot_Mask_Buf;
// break;
case PAINT_REV: x = y_Page^Dot_Mask_Buf; x = x&Dot_Mask_Buf;
y_Page = (y_Page&(~Dot_Mask_Buf))|x;
break;
default: y_Page = y_Page|Dot_Mask_Buf;
break;
}
F_SPLC501_Write_Data(y_Page); //
F_SPLC501_Write_Com(0xee); //读写改模式结束
}
//***************************************************************************//
//程序:void LCD501_Line(unsigned int x,unsigned int y,unsigned int e_x,
// unsigned int e_y)
//描述:画直线程序
//参数:x 要画线的x起点坐标 y 要画的线的y起点坐标
// e_x 要画线的x 终点坐标 e_y 要画的线的y起点坐标
//返回:无
//声明:小丑 200505121 sunnorth Mz Design
//注意:
//***************************************************************************//
void LCD501_Line(unsigned int x,unsigned int y,unsigned int e_x,unsigned int e_y)
{
int Offset_x,Offset_y,Offset_k = 0;
int Err_d = 1;
if(y>e_y)
{
Offset_x = x;
x = e_x;
e_x = Offset_x;
Offset_x = y;
y = e_y;
e_y = Offset_x;
}
Offset_x = e_x-x;
Offset_y = e_y-y;
LCD501_PutPixel(x,y);
if(Offset_x<=0)
{
Offset_x = x-e_x;
Err_d = -1;
}
if(Offset_x>Offset_y)
{
while(x!=e_x)
{
if(Offset_k>0)
{
y+=1;
Offset_k += (Offset_y-Offset_x);
}
else Offset_k += Offset_y;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -