📄 system.c
字号:
#include<spce061a_chf.h>
#include"host.h"
extern const unsigned char Asii0610[]; //6X10的ASII字符库
extern const unsigned char Asii0816[]; //8X16的ASII字符库
extern const unsigned char GB32[]; //32*32自定义的汉字库
int X_Witch; //字符写入时的宽度
int Y_Witch; //字符写入时的高度
int Font_Wrod; //字体的每个字模占用多少个存储单元数
unsigned char *Char_TAB; //字库指针
int Plot_Mode; //绘图模式
unsigned int BMP_Color;
unsigned int Char_Color;
unsigned int CurPowerMode=1; //Show the Power Mode of LCD501
unsigned int CurLCDSet=8; //Show the LCD Set灰度
unsigned int CurScroll=0; //Show the scroll dotes
unsigned int CurScrMode=1; //显示正相/反相(1/0)
///////////////////////////////////////////
//函数:void write_flash(unsigned int d)
//描述:写flash函数
//参数:d--要写的数据
//返回:无
/////////////////////////////////////////////
void write_flash(unsigned int d,unsigned int *addr1)
{
*P_Flash_Ctrl=0xaaaa;
*P_Flash_Ctrl=0x5533;
*addr1=d;
}
///////////////////////////////////////////
//函数:void page_erase(void)
//描述:檫除flash的函数
//参数:无
//返回:无
/////////////////////////////////////////////
void page_erase(unsigned int *addr2)
{
*P_Flash_Ctrl=0xaaaa;
*P_Flash_Ctrl=0x5511;
*addr2=0x0000;//向相应的页地址写如任意值;
}
///////////////////////////////////////////
//函数:unsigned int read_flash(void)
//描述:读取相应地址的数据
//参数:无
//返回:返回读到的数据
/////////////////////////////////////////////
unsigned int read_flash(unsigned int *addr3)
{
unsigned int value;
value=*addr3;
return (value);
}
//========================================================================
// 函数: void F_LCD_ON_OFF(unsigned int SetCom)
// 描述: 液晶开关函数 C语言调用
// 参数: SetCom SetCom=0:LCD Off SetCom!=0:LCD On
// 返回: 无
// 备注:
// 版本:
// 2006/10/15 First version
//========================================================================
void F_LCD_ONOFF(unsigned int SetCom)
{
if(SetCom) //ON LCD
SPLC501_RegWrite(M_LCD_ON);
else //OFF LCD
SPLC501_RegWrite(M_LCD_OFF);
}
//========================================================================
// 函数: void LCD501_Power(unsigned int ModeCode)
// 描述: SPLC501电源管理,进入参数指定的模式,而当LCD在SLEEP和STDBY模式下时,
// 调用该函数会使LCD唤醒
// 参数: ModeCode - 可以是下列参数之一:
// 1 PWR_ON: 正常工作模式
// 2 PWR_SLEEP: 睡眠模式,屏幕不显示,但内容在唤醒后仍保留
// 3 PWR_STDBY: 待机模式,比SLEEP省电,但显示内容会丢失
// 0 PWR_OFF: 关闭电源
// 返回: 无
// 备注:
// 版本:
// 2006/10/15 First version
//========================================================================
void LCD501_Power(unsigned int ModeCode)
{
if(CurPowerMode == 2)
{
SPLC501_RegWrite(M_LCD_ALL_LOW);
SPLC501_RegWrite(M_LCD_STATIC_ON);
SPLC501_RegWrite(0x0003);
CurPowerMode = 1;
*P_Watchdog_Clear=0x01;
}
else if(CurPowerMode == 3)
{
SPLC501_RegWrite(M_LCD_ON);
SPLC501_RegWrite(M_LCD_ALL_LOW);
CurPowerMode = 1;
*P_Watchdog_Clear=0x01;
}
else{
switch(ModeCode)
{
case 1:
SPLC501_RegWrite(M_LCD_ON);
break;
case 2:
SPLC501_RegWrite(M_LCD_STATIC_OFF);
SPLC501_RegWrite(0x0000);
SPLC501_RegWrite(M_LCD_OFF);
SPLC501_RegWrite(M_LCD_ALL_LIGNT);
*P_Watchdog_Clear=0x01;
break;
case 3:
SPLC501_RegWrite(M_LCD_STATIC_ON);
SPLC501_RegWrite(0x0003);
SPLC501_RegWrite(M_LCD_OFF);
SPLC501_RegWrite(M_LCD_ALL_LIGNT);
*P_Watchdog_Clear=0x01;
break;
default://POW_OFF
SPLC501_RegWrite(M_LCD_OFF);
break;
}//
CurPowerMode = ModeCode;
*P_Watchdog_Clear=0x01;
}
}
//========================================================================
// 函数: void LCD501_SetContrast(unsigned int Contrast)
// 描述: 设置显示对比度 C语言调用
// 参数: Contrast - 对比度值,范围从0到31,数值越大对比度越高
// 返回: 无
// 备注:
// 版本:
// 2006/10/15 First version
//========================================================================
void LCD501_SetContrast(unsigned int Contrast)
{
if(Contrast>0x003f)
Contrast = 0x003f;
SPLC501_RegWrite(M_LCD_ELE_VOL); //电量设置模式(显示亮度)
SPLC501_RegWrite(Contrast); //电量设置模式(显示亮度)
CurLCDSet = Contrast;
*P_Watchdog_Clear=0x01;
}
//========================================================================
// 函数: unsigned int LCD501_GetContrast(void)
// 描述: 获取显示对比度 C语言调用
// 参数: null
// 返回: 当前显示的对比度值
// 备注:
// 版本:
// 2006/10/15 First version
//========================================================================
unsigned int LCD501_GetContrast(void)
{
return CurLCDSet;//
}
//========================================================================
// 函数: void LCD501_ScrollUp(unsigned int Rows)
// 描述: 屏幕向上滚动 C语言调用
// 参数: Rows 屏幕向上滚动的像素数,范围从1到64
// 返回: null
// 备注: 该函数从原来的SPLC501的V20版本当中直接移植过来的
// 版本:
// 2006/10/15 First version
//========================================================================
void LCD501_ScrollUp(unsigned int Rows)
{
CurScroll = CurScroll+Rows;
while(CurScroll>=Dis_Y_MAX)
CurScroll -= Dis_Y_MAX;
SPLC501_RegWrite(M_LCD_BEGIN_LINE+CurScroll); //设置显示起始行对应RAM
*P_Watchdog_Clear=0x01;
}
//========================================================================
// 函数: unsigned int LCD501_GetScroll(void)
// 描述: 获取屏幕已经向上滚动的值 C语言调用
// 参数: null
// 返回: 屏幕已经向上滚动的值
// 备注: 该函数从原来的SPLC501的V20版本当中直接移植过来的
// 版本:
// 2006/10/15 First version
//========================================================================
unsigned int LCD501_GetScroll(void)
{
return CurScroll;//
}
//========================================================================
// 函数: void LCD501_ReverseColor(void)
// 描述: 屏幕反色显示。每执行一次该函数,屏幕颜色翻转一次
// 参数: null
// 返回: null
// 备注: 该函数从原来的SPLC501的V20版本当中直接移植过来的
// 版本:
// 2006/10/15 First version
//========================================================================
void LCD501_ReverseColor(void)
{
if(CurScrMode)//
{
SPLC501_RegWrite(M_LCD_ALL_REV); //正向反向显示控制指令
CurScrMode = 0;
*P_Watchdog_Clear=0x01;
}
else
{
SPLC501_RegWrite(M_LCD_ALL_NOR); //正向反向显示控制指令
CurScrMode = 1;
*P_Watchdog_Clear=0x01;
}
}
//========================================================================
// 函数: void LCD501_Bitmap(int x,int y,unsigned int *p)
// 描述: 写入一个BMP图片,起点为(x,y)
// 参数: x、y为画入位图的起始坐标点,*p为位图字模数据的首地址
// 返回: 无
// 备注: 该函数所对应的位图字模为16位为单位的字模数据,取模顺序为:从左到右
// 自上到下,每行的点数不为16的整数倍时,在前面补上0
// 建议使用凌阳提供的DM Tool取字模,因为该函数正是为适应其所取的字
// 模规格而设计的。
// 版本:
// 2007/01/12 First version
//========================================================================
void LCD501_Bitmap(int x,int y,unsigned int *p)
{
int Temp_With,Temp_High,i,j; //数据暂存
unsigned int Temp;
unsigned int Index=1;
Temp_With = *p&0x00ff;
Temp_High = *(p ++)>>8; //图片宽度
Temp = Temp_With&0x0f;
switch(Temp)
{
case 0: Index = 0x8000; break;
case 1: Index = 0x0001; break;
case 2: Index = 0x0002; break;
case 3: Index = 0x0004; break;
case 4: Index = 0x0008; break;
case 5: Index = 0x0010; break;
case 6: Index = 0x0020; break;
case 7: Index = 0x0040; break;
case 8: Index = 0x0080; break;
case 9: Index = 0x0100; break;
case 10: Index = 0x0200; break;
case 11: Index = 0x0400; break;
case 12: Index = 0x0800; break;
case 13: Index = 0x1000; break;
case 14: Index = 0x2000; break;
case 15: Index = 0x4000; break;
}
j = 0;
while((j ++) < Temp_High)
{
if(y > Dis_Y_MAX) break;
i = 0;
Temp = Index;
while(i < Temp_With)
{
if((x+i) > Dis_X_MAX) break;
if(Temp&(*p)) Write_Dot_LCD(x+i,y,BMP_Color);
Temp = Temp >> 1;
if(Temp==0)
{
p++;
Temp = 0x8000;
*P_Watchdog_Clear=0x01;
}
i++;
*P_Watchdog_Clear=0x01;
}
y ++;
*P_Watchdog_Clear=0x01;
}
}
void LCD_InIt(void)
{
//LCD驱动所使用到的端口的初始化
SPLC501_PortInit();
*P_Watchdog_Clear=0x01;
SPLC501_RegWrite(M_LCD_ON); //LCD On
SPLC501_RegWrite(M_LCD_POWER_ALL); //设置上电控制模式
*P_Watchdog_Clear=0x01;
SPLC501_RegWrite(M_LCD_ELE_VOL); //电量设置模式(显示亮度)
SPLC501_RegWrite(0x12); //指令数据0x0000~0x003f
*P_Watchdog_Clear=0x01;
SPLC501_RegWrite(M_LCD_VDD_SET); //V5内部电压调节电阻设置
SPLC501_RegWrite(M_LCD_VDD); //LCD偏压设置,V3时选
*P_Watchdog_Clear=0x01;
SPLC501_RegWrite(M_LCD_COM_NOR); //Com 扫描方式设置
SPLC501_RegWrite(M_LCD_SEG_REV); //Segment方向选择
SPLC501_RegWrite(M_LCD_ALL_LOW); //全屏点亮/变暗指令
SPLC501_RegWrite(M_LCD_ALL_NOR); //正向反向显示控制指令
*P_Watchdog_Clear=0x01;
SPLC501_RegWrite(M_LCD_STATIC_OFF); //关闭静态指示器
SPLC501_RegWrite(0x00); //指令数据
*P_Watchdog_Clear=0x01;
// F_SPLC501_Write_Com(0x00ee); //读写改模式结束指令
SPLC501_RegWrite(M_LCD_BEGIN_LINE+0); //设置显示起始行对应RAM
LCD_Fill(LCD_INITIAL_COLOR); //?????????????????????????????????????????????????????
}
//========================================================================
// 函数: void FontSet(int Font_NUM,unsigned int Color)
// 描述: 文本字体设置
// 参数: Font_NUM 字体选择,以驱动所带的字库为准
// Color 文本颜色,仅作用于自带字库
// 返回: 无
// 备注:
// 版本:
// 2006/10/15 First version
//========================================================================
void FontSet(int Font_NUM,unsigned int Color)
{
switch(Font_NUM)
{
case 0: Font_Wrod = 8; //ASII字符A
X_Witch = 8;
Y_Witch = 16;
Char_Color = Color;
Char_TAB = (unsigned char *)(Asii0816 - 32*8);
*P_Watchdog_Clear=0x01;
break;
case 1: Font_Wrod = 5; //ASII字符B
X_Witch = 6;
Y_Witch = 10;
Char_Color = Color;
Char_TAB = (unsigned char *)(Asii0610 - (32*5));
*P_Watchdog_Clear=0x01;
break;
case 2: Font_Wrod = 64; //汉字A
X_Witch = 32;
Y_Witch = 32;
Char_Color = Color;
Char_TAB = (unsigned char *)GB32;
*P_Watchdog_Clear=0x01;
break;
/* case 3: Font_Wrod = 16; //汉字B
X_Witch = 16;
Y_Witch = 2;
Char_Color = Color;
Char_TAB = GB16;
break;*/
default: break;
}
// if(X_Witch&0x07) X_Witch = (X_Witch&0xfff8)+0x0008; //调整宽度到8的倍数
}
//========================================================================
// 函数: void PutChar(int x,int y,unsigned int a)
// 描述: 写入一个标准字符
// 参数: x X轴坐标 y Y轴坐标
// a 要显示的字符在字库中的偏移量
// 返回: 无
// 备注: ASCII字符可直接输入ASCII码即可
// 版本:
// 2006/10/15 First version
// 2007/01/11 V1.1
//========================================================================
void PutChar(int x,int y,unsigned int a)
{
int i,j;//,K; //数据暂存
unsigned char *p_data;
unsigned char Temp;
unsigned int Index = 0;
p_data = Char_TAB + a*Font_Wrod; //要写字符的首地址
j = 0;
while((j ++) < Y_Witch)
{
if(y > Dis_Y_MAX) break;
i = 0;
while(i < X_Witch)
{
if((i&0x07)==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -