📄 led.c
字号:
#ifndef _Include
#include "Include.h"
#endif
#define LED_Add0 (*((volatile unsigned char *) 0x82000000))
#define LED_Add1 (*((volatile unsigned char *) 0x82000001))
#define LED_Add2 (*((volatile unsigned char *) 0x82000002))
#define LED_Add3 (*((volatile unsigned char *) 0x82000003))
unsigned int HZK_16;
unsigned int ASCII_16;
unsigned int HZK_12;
unsigned int ASCII_12;
unsigned char (*P_FRAME)[LED_XSIZE/8];
int CURSOR;
_FRAME_DATA FRAME_DATA[11],*P_CURRENT_FRAME_DATA,DISP_BUFFER_DATA;
/****************************************************************************
* 名称:LEDTest()
* 功能:检测led屏的像素点
* 入口参数:
* 出口参数:无
****************************************************************************/
void LEDTest(void)
{
INT16U i,j;
for(i=0;i<LED_YSIZE;i++)
{
for(j=0;j<LED_XSIZE/8;j++)
{
DISP_BUFFER_DATA.frame[i][j]=0xff; //填充显示缓冲区
}
}
for(i=0;i<0x17f;i++) //填充全屏显示,用于检测像素点
{
LED_Reflash(0x1f);
}
}
/****************************************************************************
* 名称:LEDInit()
* 功能:输出像素
* 入口参数:
* 出口参数:无
****************************************************************************/
void LEDInit(void)
{
INT8U i;
RenewDispData(); //读出Flash中的存储的数据
DISP_BUFFER_DATA.disp_mode=0; //初始化显示缓冲区默认数据
DISP_BUFFER_DATA.disp_time=0xff;
DISP_BUFFER_DATA.disp_light=0x5f;
DISP_BUFFER_DATA.disp_font=CHAR_16;
DISP_BUFFER_DATA.move_time=5;
P_FRAME=DISP_BUFFER_DATA.frame;
TimeInit0(LEDReflashTimeTest()/255); //亮度最高值255,赋值亮度单位
LEDTest();
P_CURRENT_FRAME_DATA=&FRAME_DATA[1];
FRAME_DATA[1].disp_mode=0; //显示立即全帧显示
FRAME_DATA[1].disp_time=0xff; //显示时间
FRAME_DATA[1].disp_light=0x5f; //显示亮度
FRAME_DATA[1].move_time=5;
FRAME_DATA[1].disp_font=CHAR_16;
Disp_X();
Slib_FillScr(0);
Disp_Null_Close();
#if _Debug==1
if(FRAME_DATA[1].disp_en!='1')
{
Slib_SetCursor(0,0);
Slib_Printf("南京卡巴自动化设");
Slib_SetCursor(1,0);
Slib_Printf("备有限公司信息屏");
Slib_SetCursor(2,0);
Slib_Printf("应用:公路,收费");
Slib_SetCursor(3,0);
Slib_Printf("信息显示各种场所");
Slib_SetCursor(4,0);
Slib_Printf("应用:公路,收费");
Slib_SetCursor(5,0);
Slib_Printf("信息显示各种场所");
FRAME_DATA[1].disp_en='1'; //显示使能
}
#endif
for(i=0;i<11;i++)
{
#if _Debug
Disp_Data_Check(i);
#else
FRAME_DATA[i].disp_en=0;
#endif
}
FRAME_DATA[1].disp_en='1';
DISP_BUFFER_DATA.disp_light=0xff;
FRAME_DATA[1].disp_light=0xff; //显示亮度
}
/****************************************************************************
* 名称:Slib_SetCursor()
* 功能:设置光标位置
* 入口参数:
* 出口参数:无
****************************************************************************/
void Slib_SetCursor(INT8U y,INT8U x)
{
switch(P_CURRENT_FRAME_DATA->disp_font)
{
case CHAR_12:
CURSOR=21*y+x; //每行显示21字符余两个像素
break;
default:
CURSOR=16*y+x; //每行显示16字符
break;
}
}
/****************************************************************************
* 名称:PutPixelG4()
* 功能:输出像素
* 入口参数:
* 出口参数:无
****************************************************************************/
void PutPixelG1(int y,int x,char c)
{
if(((y<32)&&(x<96))||(y>31))
{
P_CURRENT_FRAME_DATA->frame[y][x/8]=(P_CURRENT_FRAME_DATA->frame[y][x/8] & ~(0x80>>(x%8)))
|(c<<(8-1-(x%8)));
}
}
/****************************************************************************
* 名称:LcdG4_Bmp()
* 功能:画4色图片
* 入口参数:
* 出口参数:无
****************************************************************************/
void LcdG4_Bmp(INT8U *bmp)
{
int x, y;
for(x=0;x<LED_YSIZE;x++) //画4色图片
{
for(y=0;y<16;y++) //画4色图片
{
P_CURRENT_FRAME_DATA->frame[x][y]=*(bmp+(x*16)+y);
}
}
}
/****************************************************************************
* 名称:Slib_FillScr(char c)
* 功能:清显示缓冲区
* 入口参数:
* 出口参数:无
****************************************************************************/
void Slib_FillScr(char c)
{
int x,y;
for(y=0;y<LED_YSIZE;y++)
{
for(x=0;x<LED_XSIZE;x++)
{
PutPixelG1(y,x,c);
}
}
}
/****************************************************************************
* 名称:Slib_PutChar_16()
* 功能:输出字符
* 入口参数:
* 出口参数:无
****************************************************************************/
void Slib_PutChar_16(INT8U y,INT8U x,char *pchar)
{
INT8U i,j,k;
char *char_add;
if(*pchar>0xa0)//16点阵汉字
{
char_add=(char*)(((((*pchar-0xa0)-1)*94)+((*(pchar+1)-0xa0)-1))*32+HZK_16);
if(((y<2)&&(x<11))||(y>1))
{
for(k=0;k<32;k+=16)
{
for (i=0;i<16;i++)
{
for(j=0;j<8;j++)
{
P_CURRENT_FRAME_DATA->frame[y*16+i][(x*8+j)/8] &= ~(0x01<<(7-(x*8+j)%8));
if((*(char_add+i+k)&(0x80>>j))!=0)
{
P_CURRENT_FRAME_DATA->frame[y*16+i][(x*8+j)/8] |= 0x01<<(7-(x*8+j)%8);
}
}
}
x++;
}
}
CURSOR+=2;
}
else
{
char_add=(char*)(*pchar*16+ASCII_16);
if(((y<2)&&(x<12))||(y>1))
{
for (i=0;i<16;i++)
{
for(j=0;j<8;j++)
{
P_CURRENT_FRAME_DATA->frame[y*16+i][(x*8+j)/8] &= ~(0x01<<(7-(x*8+j)%8));
if((*(char_add+i)&(0x80>>j))!=0)
{
P_CURRENT_FRAME_DATA->frame[y*16+i][(x*8+j)/8] |= 0x01<<(7-(x*8+j)%8);
}
}
}
}
CURSOR++;
}
}
/****************************************************************************
* 名称:Slib_PutChar_12()
* 功能:输出字符
* 入口参数:
* 出口参数:无
****************************************************************************/
void Slib_PutChar_12(INT8U y,INT8U x,char *pchar)
{
INT8U i,j,k;
char *char_add;
if(*pchar>0xa0)//12点阵汉字
{
char_add=(char*)(((((*pchar-0xa0)-1)*94)+((*(pchar+1)-0xa0)-1))*24+HZK_12);
if((((y*12)<32)&&((x*6)<90))||((y*12)>31))
{
for(k=0;k<24;k+=12)
{
for (i=0;i<12;i++)
{
for(j=0;j<(8-k/3);j++)
{
P_CURRENT_FRAME_DATA->frame[y*12+i][(x*6+j+k/6)/8] &= ~(0x01<<(7-(x*6+j+k/6)%8));
if((*(char_add+i+k)&(0x80>>j))!=0)
{
P_CURRENT_FRAME_DATA->frame[y*12+i][(x*6+j+k/6)/8] |= 0x01<<(7-(x*6+j+k/6)%8);
}
}
}
x++;
}
}
CURSOR+=2;
}
else
{
char_add=(char*)(*pchar*12+ASCII_12);
if((((y*12)<32)&&((x*6)<96))||((y*12)>31))
{
for (i=0;i<12;i++)
{
for(j=0;j<6;j++)
{
P_CURRENT_FRAME_DATA->frame[y*12+i][(x*6+j)/8] &= ~(0x01<<(7-(x*6+j)%8));
if((*(char_add+i)&(0x80>>j))!=0)
{
P_CURRENT_FRAME_DATA->frame[y*12+i][(x*6+j)/8] |= 0x01<<(7-(x*6+j)%8);
}
}
}
}
CURSOR++;
}
}
/****************************************************************************
* 名称:Slib_PutStr()
* 功能:换行和显示范围限定
* 入口参数:
* 出口参数:无
****************************************************************************/
void Slib_PutStr(char *pstr)
{
INT8U xx,yy,p,char_xnum,char_ynum;
switch(P_CURRENT_FRAME_DATA->disp_font)
{
case CHAR_12:
char_xnum=LED_XSIZE/6;
char_ynum=LED_YSIZE/12;
while(*pstr)
{
if(*pstr=='\n') //是否换行
{
CURSOR=(CURSOR/char_xnum+1)*char_xnum;
pstr++;
}
if((((CURSOR+1)%char_xnum)==0)&&(*pstr>0xa0)) CURSOR=(CURSOR/char_xnum+1)*char_xnum;//显示汉字时,行最后不够显示时换行
xx=(INT8U)(CURSOR%char_xnum); //判断每列是否满
yy=(INT8U)(CURSOR/char_xnum); //判断是否要换行
p=CURSOR;
Slib_PutChar_12(yy,xx,pstr);
p=CURSOR-p;
pstr+=p;
if(CURSOR == char_xnum*char_ynum) CURSOR=0; //超出屏幕范围 4字符行 X 16个字符列=64 ASCII16
}
break;
default://默认为16*16
char_xnum=LED_XSIZE/8;
char_ynum=LED_YSIZE/16;
while(*pstr)
{
if(*pstr=='\n') //是否换行
{
CURSOR=(CURSOR/char_xnum+1)*char_xnum;
pstr++;
}
if((((CURSOR+1)%char_xnum)==0)&&(*pstr>0xa0)) CURSOR=(CURSOR/char_xnum+1)*char_xnum;//显示汉字时,行最后不够显示时换行
xx=(INT8U)(CURSOR%char_xnum); //判断每列是否满
yy=(INT8U)(CURSOR/char_xnum); //判断是否要换行
p=CURSOR;
Slib_PutChar_16(yy,xx,pstr);
p=CURSOR-p;
pstr+=p;
if(CURSOR == char_xnum*char_ynum) CURSOR=0; //超出屏幕范围 4字符行 X 16个字符列=64 ASCII16
}
break;
}
}
/****************************************************************************
* 名称:Slib_Printf()
* 功能:格式化字符串
* 入口参数:
* 出口参数:无
****************************************************************************/
void Slib_Printf(char *fmt,...)
{
va_list ap;
char string[160];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Slib_PutStr(string);
va_end(ap);
}
/****************************************************************************
* 名称:Reflash
* 功能:LED刷新用信号
* 入口参数:
* 出口参数:无
****************************************************************************/
void Frame_Data(void) //帧数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -