⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 splc501.c

📁 一个arm7实例
💻 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 + -