📄 splc501.c
字号:
#include "config.h"
#include"splc501.h"
#if ASCII_EN>0
/* ASCII码对应的点阵数据表 */
uint8 const ASCII_TAB20[80] =
{
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9e, 0x00, 0x00,
0x00, 0x0e, 0x00, 0x0e, 0x00,
0x28, 0xfe, 0x28, 0xfe, 0x28,
0x48, 0x54, 0xfe, 0x54, 0x24,
0x46, 0x26, 0x10, 0xc8, 0xc4,
0x6c, 0x92, 0xaa, 0x44, 0xa0,
0x00, 0x0a, 0x06, 0x00, 0x00,
0x00, 0x38, 0x44, 0x82, 0x00,
0x00, 0x82, 0x44, 0x38, 0x00,
0x28, 0x10, 0x7c, 0x10, 0x28,
0x10, 0x10, 0x7c, 0x10, 0x10,
0x00, 0xa0, 0x60, 0x00, 0x00,
0x10, 0x10, 0x10, 0x10, 0x10,
0x00, 0xc0, 0xc0, 0x00, 0x00,
0x40, 0x20, 0x10, 0x08, 0x04
};
uint8 const ASCII_TAB30[80] =
{
0x7C, 0xA2, 0x92, 0x8A, 0x7C,
0x00, 0x84, 0xFE, 0x80, 0x00,
0x84, 0xC2, 0xA2, 0x92, 0x8C,
0x42, 0x82, 0x8A, 0x96, 0x62,
0x30, 0x28, 0x24, 0xFE, 0x20,
0x4E, 0x8A, 0x8A, 0x8A, 0x72,
0x78, 0x94, 0x92, 0x92, 0x60,
0x02, 0xE2, 0x12, 0x0A, 0x06,
0x6C, 0x92, 0x92, 0x92, 0x6C,
0x0C, 0x92, 0x92, 0x52, 0x3C,
0x00, 0x6C, 0x6C, 0x00, 0x00,
0x00, 0xAC, 0x6C, 0x00, 0x00,
0x10, 0x28, 0x44, 0x82, 0x00,
0x28, 0x28, 0x28, 0x28, 0x28,
0x00, 0x82, 0x44, 0x28, 0x10,
0x04, 0x02, 0xA2, 0x12, 0x0C
};
uint8 const ASCII_TAB40[80] =
{
0x64, 0x92, 0xF2, 0x82, 0x7C,
0xFC, 0x22, 0x22, 0x22, 0xFC,
0xFE, 0x92, 0x92, 0x92, 0x6C,
0x7C, 0x82, 0x82, 0x82, 0x44,
0xFE, 0x82, 0x82, 0x44, 0x38,
0xFE, 0x92, 0x92, 0x92, 0x82,
0xFE, 0x12, 0x12, 0x12, 0x02,
0x7C, 0x82, 0x92, 0x92, 0xF4,
0xFE, 0x10, 0x10, 0x10, 0xFE,
0x00, 0x82, 0xFE, 0x82, 0x00,
0x40, 0x80, 0x82, 0x7E, 0x02,
0xFE, 0x10, 0x28, 0x44, 0x82,
0xFE, 0x80, 0x80, 0x80, 0x80,
0xFE, 0x04, 0x18, 0x04, 0xFE,
0xFE, 0x08, 0x10, 0x20, 0xFE,
0x7C, 0x82, 0x82, 0x82, 0x7C
};
uint8 const ASCII_TAB50[80] =
{
0xFE, 0x12, 0x12, 0x12, 0x0C,
0x7C, 0x82, 0xA2, 0x42, 0xBC,
0xFE, 0x12, 0x32, 0x52, 0x8C,
0x8C, 0x92, 0x92, 0x92, 0x62,
0x02, 0x02, 0xFE, 0x02, 0x02,
0x7E, 0x80, 0x80, 0x80, 0x7E,
0x3E, 0x40, 0x80, 0x40, 0x3E,
0x7E, 0x80, 0x70, 0x80, 0x7E,
0xC6, 0x28, 0x10, 0x28, 0xC6,
0x0E, 0x10, 0xE0, 0x10, 0x0E,
0xC2, 0xA2, 0x92, 0x8A, 0x86,
0x00, 0xFE, 0x82, 0x82, 0x00,
0x04, 0x08, 0x10, 0x20, 0x40,
0x00, 0x82, 0x82, 0xFE, 0x00,
0x08, 0x04, 0x02, 0x04, 0x08,
0x80, 0x80, 0x80, 0x80, 0x80
};
uint8 const ASCII_TAB60[80] =
{
0x00, 0x02, 0x04, 0x08, 0x00,
0x40, 0xA8, 0xA8, 0xA8, 0xF0,
0xFE, 0x90, 0x88, 0x88, 0x70,
0x70, 0x88, 0x88, 0x88, 0x40,
0x70, 0x88, 0x88, 0x90, 0xFE,
0x70, 0xA8, 0xA8, 0xA8, 0x30,
0x10, 0xFC, 0x12, 0x02, 0x04,
0x18, 0xA4, 0xA4, 0xA4, 0x7C,
0xFE, 0x10, 0x08, 0x08, 0xF0,
0x00, 0x88, 0xFA, 0x80, 0x00,
0x40, 0x80, 0x88, 0x7A, 0x00,
0xFE, 0x20, 0x50, 0x88, 0x00,
0x00, 0x82, 0xFE, 0x80, 0x00,
0xF8, 0x08, 0x30, 0x08, 0xF8,
0xF8, 0x10, 0x08, 0x08, 0xF0,
0x70, 0x88, 0x88, 0x88, 0x70
};
uint8 const ASCII_TAB70[80] =
{
0xF8, 0x28, 0x28, 0x28, 0x10,
0x10, 0x28, 0x28, 0x30, 0xF8,
0xF8, 0x10, 0x08, 0x08, 0x10,
0x90, 0xA8, 0xA8, 0xA8, 0x40,
0x08, 0x7E, 0x88, 0x80, 0x40,
0x78, 0x80, 0x80, 0x40, 0xF8,
0x38, 0x40, 0x80, 0x40, 0x38,
0x78, 0x80, 0x60, 0x80, 0x78,
0x88, 0x50, 0x20, 0x50, 0x88,
0x18, 0xA0, 0xA0, 0xA0, 0x78,
0x88, 0xC8, 0xA8, 0x98, 0x88,
0x00, 0x10, 0x6C, 0x82, 0x00,
0x00, 0x00, 0xFE, 0x00, 0x00,
0x00, 0x82, 0x6C, 0x10, 0x00,
0x10, 0x10, 0x54, 0x38, 0x10,
};
#endif
/****************************************************************************
* 名称:ChkBusy()
* 功能:检查总线是否忙
*入口参数:无
*出口参数:无
*作者:Z.Q.Yang
****************************************************************************/
void LCDChkBusy() //检查总线是否忙
{
IODIR&=LCDIN;
while(1)
{
LCD_0;
EN_1;
RS_0;
RW_1;
if(!(IOPIN & busy))break;
EN_0;
LCD_1;
}
EN_0;
LCD_1;
IODIR|=LCDOUT;
}
/****************************************************************************
* 名称:WrOp()
* 功能:写指令函数
*入口参数:dat:要写的指令
*出口参数:无
*作者:Z.Q.Yang
****************************************************************************/
void LCDWrOp(uint8 dat)
{
uint32 date;
LCDChkBusy();
RS_0; //
RW_0;
IOCLR=LCDDATECLR; //先清零
LCD_0;
EN_1;
date=(dat<<D);
IOSET=date; //再送数
EN_0;
LCD_1;
}
/****************************************************************************
* 名称:WrDat()
* 功能:写数据函数
*入口参数:dat:要写的数据
*出口参数:无
*作者:Z.Q.Yang
****************************************************************************/
void LCDWrDat(uint8 dat) //写数据
{
uint32 date;
LCDChkBusy();
RS_1;
RW_0;
IOCLR=LCDDATECLR;
LCD_0;
EN_1;
date=(dat<<D);
IOSET=date; //再送数
EN_0;
LCD_1;
}
/****************************************************************************
* 名称:LCDInit()
* 功能:lcd初始化函数
*入口参数:无
*出口参数:无
*作者:Z.Q.Yang
****************************************************************************/
void LCDInit(void)
{
PINSEL0&=0x0000000f;
IODIR=LCDOUT;
LCDWrOp(0xae); //开显示,开为0xaf,关为0xae
LCDWrOp(0x2f); //上电控制
LCDWrOp(0x81); //电量设置启动0x81,//电量设置为两字节
LCDWrOp(0x0f); //电量设置的值01-3f,small-large
LCDWrOp(0x20+7); //v5内部电阻设置,0x20+x
LCDWrOp(0xa2); //lcd偏压设置,0xa1为1/7bias,0xa2为1/9bias
LCDWrOp(0xc8); //com口扫描方向,0xc0为0-63,0xc8为63-0,行的
LCDWrOp(0xa0); //segment方向选择,0xa0为normal,0xa1为reverse,列方向
LCDWrOp(0xa4); //全屏点亮,0xa4普通模式,0xa5全部点亮
LCDWrOp(0xa6); //正反向控制,0xa6为1亮,0xa7为0亮
LCDWrOp(0xac); //静态指示器开,开为0xac,关为0xad
LCDWrOp(0x0); //静态指示器寄存器设置,0关,1,2,3
LCDWrOp(0x40+0); //起始行设置,0x40+addr
LCDWrOp(0xb0+0); //页地址设置,0xb0+addr
LCDWrOp(0x10+0); //设置列地址,0x10+addrhigh
LCDWrOp(0x00+0); //设置列地址,0x00+addrlow
LCDWrOp(0xaf); //开显示,开为0xaf,关为0xae
//LCDWrOp(0xe0); //读改写模式设置
//LCDWrOp(0xe2); //复位
//LCDWrOp(0xD5); //页闪动
//LCDWrOp(0x10);
}
/****************************************************************************
* 名称:DisText()
* 功能:指定位显示8*n
*入口参数:addrx:列坐标,addry:行坐标,*p:数据指针,n:显示的列数
*出口参数:无
*作者:Z.Q.Yang
****************************************************************************/
void LCDDisplay8(uint8 addrx,uint8 addry,uint8 *p,uint8 n)
{
uint8 i;
LCDWrOp(addry+0xb0);
LCDWrOp(((addrx&0xf0)>>4)+0x10);
LCDWrOp((addrx&0x0f)+0x00);
for(i=0;i<n;i++)
{
LCDWrDat(*p++);
}
}
/****************************************************************************
* 名称:DisText()
* 功能:定位显示16*n
*入口参数:addrx:列坐标,addry:行坐标,*p:数据指针,n:显示的列数
*出口参数:无
*作者:Z.Q.Yang
****************************************************************************/
void LCDDisplay16(uint8 addrx,uint8 addry,uint8 *p,uint8 n)
{
uint8 i;
LCDWrOp(addry+0xb0);
LCDWrOp(((addrx&0xf0)>>4)+0x10);
LCDWrOp((addrx&0x0f)+0x00);
for(i=0;i<n;i++)
{
LCDWrDat(*p++);
}
LCDWrOp(addry+0xb0+1);
LCDWrOp(((addrx&0xf0)>>4)+0x10);
LCDWrOp((addrx&0x0f)+0x00);
for(i=0;i<n;i++)
{
LCDWrDat(*p++);
}
}
/****************************************************************************
* 名称:LCDClr()
* 功能:清屏
*入口参数:无
*出口参数:无
*作者:Z.Q.Yang
****************************************************************************/
void LCDClr(void)
{
uint8 i,j;
for(j=0;j<9;j++)
{
LCDWrOp(0xb0+j);
LCDWrOp(0x10);
LCDWrOp(0x00);
for(i=0;i<132;i++)
{
LCDWrDat(0x00);
}
}
}
/*******************************************************************************
*下面是字符和字符串函数
*可以通过ASCII_EN裁剪
*******************************************************************************/
#if ASCII_EN>0
/*******************************************************************************
*名称:LCDDisplaytext
*功能:显示字符
*入口参数:addrx:列坐标,addry:行坐标,dispdata:要显示的字符
*出口参数:无
*作者:Z.Q.Yang
*******************************************************************************/
void LCDDisText(uint8 addrx,uint8 addry,uint8 dispdata)
{
uint8 const *pchardata;
switch(dispdata&0xf0)
{
case 0x20:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB20[dispdata];
break;
case 0x30:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB30[dispdata];
break;
case 0x40:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB40[dispdata];
break;
case 0x50:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB50[dispdata];
break;
case 0x60:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB60[dispdata];
break;
case 0x70:
dispdata = (dispdata&0x0f)*5;
pchardata = &ASCII_TAB70[dispdata];
break;
default:
pchardata = &ASCII_TAB20[0];
break;
}
LCDDisplay8(addrx,addry,pchardata,5);
}
/*******************************************************************************
*名称:LCDDisStr
*功能:显示字符串
*入口参数:addrx:列坐标,addry:行坐标,*string:要显示的字符串地址
*出口参数:无
*作者:Z.Q.Yang
*******************************************************************************/
void LCDDisStr(uint8 x,uint8 y,uint8 *string)
{
while(1)
{
if(*string=='\0')break;
LCDDisText(x,y,*string++);
x+=0x06;
if(x>127)
{
x=0;
y++;
}
}
}
/*******************************************************************************
*名称:LCDPrintf
*功能:格式输出字符串
*入口参数:addrx:列坐标,addry:行坐标,*fmt:格式字符
*出口参数:无
*作者:Z.Q.Yang
*******************************************************************************/
void LCDPrintf(uint8 addrx,uint8 addry, char *fmt,...)
{
va_list ap;
static char string[SPF_BUF];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
LCDDisStr(addrx,addry,string);
va_end(ap);
}
#endif
/*******************************************************************************
*名称:LCDRefresh
*功能:刷新屏幕
*入口参数:(*buf)[128]:待刷新的缓冲区地址
*出口参数:无
*作者:Z.Q.Yang
*******************************************************************************/
void LCDRefresh(uint8(*buf)[128])
{
uint8 pagebuf,x,i,j;
for(j=0;j<8;j++)
{
LCDWrOp(0xb0+j);
LCDWrOp(0x10);
LCDWrOp(0x01);
for(x=0;x<128;x++)
{
pagebuf=0;
for(i=0;i<8;i++)
{
pagebuf=pagebuf|((*(*(buf+j*8+i)+x)&0x01)<<i);
}
LCDWrDat((uint8)pagebuf);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -