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

📄 t6963.c

📁 uCOS-II for AT91M55800A完整实例
💻 C
字号:

#include <stdarg.h>
#include <stdio.h>
#include "..\uCOS270\ucos_ii.h"
#include "..\CPU\config.h"
#include "..\Main\ebi.h"
#include "..\Main\T6963.h"
#include "..\Main\font.h"
#include "..\Main\pic.h"
unsigned char gCurRow,gCurCol;	// 当前行、列存储,行高16点,列宽8点
const unsigned char uPowArr[]  = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};


unsigned char gCurRow,gCurCol;	// 当前行、列存储,行高16点,列宽8点

unsigned char fnGetRow(void)
{
	return gCurRow;
}

unsigned char fnGetCol(void)
{
	return gCurCol;
}

unsigned char test_state1(void)		// 状态位STA1,STA0判断(读写指令和读写数据)
{
	unsigned char i;
	
	for(i=10;i>0;i--)
	{
		if((LCMCW & 0x03) == 0x03)
			break;
	}
	return i;						// 若返回零,说明错误
}

unsigned char test_state2(void)		// 状态位ST2判断(数据自动读状态)
{
	unsigned char i;
	
	for(i=10;i>0;i--)
	{
		if((LCMCW & 0x04) == 0x04)
			break;
	}
	return i;	                   // 若返回零,说明错误
}


unsigned char test_state3(void)		// 状态位ST3判断(数据自动写状态)
{
	unsigned char i;
	
	for(i=10;i>0;i--)
	{
		if((LCMCW & 0x08) == 0x08)
			break;
	}
	return i;	// 若返回零,说明错误
}


unsigned char test_state6(void)		// 状态位ST6判断(屏读/屏拷贝状态)
{
	unsigned char i;
	
	for(i=10;i>0;i--)
	{
		if((LCMCW & 0x40) == 0x40)
			break;
	}
	return i;						// 若返回零,说明错误
}
unsigned char lcd_comm_w_2(unsigned char uCmd,unsigned char uPar1,unsigned char uPar2)	// 写双参数的指令
{
	if(test_state1() == 0)
		return 1;
	LCMDW = uPar1;
	if(test_state1() == 0)
		return 2;
	LCMDW = uPar2;
	if(test_state1() == 0)
		return 3;
	LCMCW = uCmd;
	return 0;	// 返回0成功
}

unsigned char lcd_comm_w_1(unsigned char uCmd,unsigned char uPar1)	// 写单参数的指令
{
	if(test_state1() == 0)
		return 1;
	LCMDW = uPar1;
	if(test_state1() == 0)
		return 2;
	LCMCW = uCmd;
	return 0;	// 返回0成功
}

unsigned char lcd_comm_w(unsigned char uCmd)		// 写无参数的指令
{
	if(test_state1() == 0)
		return 1;
	LCMCW = uCmd;
	return 0;	// 返回0成功
}

unsigned char lcd_data_w(unsigned char uData)		// 写数据
{
	if(test_state3() == 0)
		return 1;
	LCMDW = uData;
	return 0;	// 返回0成功
}

unsigned char lcd_data_r(void)				// 读数据
{
	if(test_state1() == 0)
		return 1;
	return LCMDW;
}

// 设置当前地址
void fnSetPos(unsigned char urow, unsigned char ucol)
{
	unsigned int  iPos;

	iPos = urow *32 + ucol;
	lcd_comm_w_2(LC_ADD_POS,iPos & 0xFF,iPos / 256);
	gCurRow = urow;
	gCurCol = ucol;
}

// 设置当前显示行、列
void cursor(unsigned char uCol,unsigned char uRow)
{
	fnSetPos(uRow, uCol);
}

// 清屏
void cls(void)
{
	unsigned int  i;

	lcd_comm_w_2(LC_ADD_POS,0x00,0x00);	// 置地址指针
	lcd_comm_w(LC_AUT_WR);				// 自动写
	for(i=0;i<128*16;i++)
	{
		test_state3();
		lcd_data_w(0x00);				// 写数据
	}
	lcd_comm_w(LC_AUT_OVR);				// 自动写结束
	lcd_comm_w_2(LC_ADD_POS,0x00,0x00);	// 重置地址指针
	gCurRow = 0;					// 置地址指针存储变量
	gCurCol = 0;
}

// LCM 初始化
char fnLCMInit(void)
{
     __EBI_CSR2 = 0x20000000
                | EBI_DBW_8 
                | EBI_NWS_8
                | EBI_WSE
                | EBI_PAGES_16M
                | EBI_TDF_7
                | EBI_BAT_BYTE_WRITE
                | EBI_CSEN  ;
                
	if(lcd_comm_w_2(LC_TXT_STP,0x00,0x00) != 0)	// 文本显示区首地址
		return (char)-1;
	
	lcd_comm_w_2(LC_TXT_WID,32,0x00);	// 文本显示区宽度
	lcd_comm_w_2(LC_GRH_STP,0x00,0x00);	// 图形显示区首地址
	lcd_comm_w_2(LC_GRH_WID,32,0x00);	// 图形显示区宽度
	lcd_comm_w(LC_CUR_SHP | 0x01);		// 光标形状
	lcd_comm_w(LC_MOD_OR);				// 显示方式设置
	lcd_comm_w(LC_DIS_SW | 0x08);		// 显示开关设置
	
	return 0;
}


// ASCII(8*16) 及 汉字(16*16) 显示函数

void display_string(unsigned char uLen,char *tmpBuf)
{
    unsigned char i=0,uRow,uCol;
    signed   char  j,c1,c2,cData;
	unsigned int  k;
	while(i<uLen)
	{
		c1 = tmpBuf[i];
		c2 = tmpBuf[i+1];
		uRow = fnGetRow();
		uCol = fnGetCol();
		if(c1 >= 0)
		{	// ASCII
			if(c1 < 0x20)
			{
				switch(c1)
				{
					case CR:
					case LF:		// 回车或换行
						i++;
						if(uRow < 112)
							fnSetPos(uRow+16,0);
						else
							fnSetPos(0,0);
						continue;
					case BS:		// 退格
						if(uCol > 0)
							uCol--;
						fnSetPos(uRow,uCol);
						cData = 0x00;
						break;
					default:		// 其他
						c1 = 0x1f;
				}
			}
			for(j=0;j<16;j++)
			{
				lcd_comm_w(LC_AUT_WR);		// 写数据
				if(c1 >= 0x1f)
				{
					if(j < (16-ASC_CHR_HEIGHT))
						lcd_data_w(0x00);
					else
						lcd_data_w(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);
				}
				else
					lcd_data_w(cData);
				lcd_comm_w(LC_AUT_OVR);
				fnSetPos(uRow+j+1,uCol);
			}
			if(c1 != BS)		// 非退格
				uCol++;
		}
		else
		{	// 中文
			for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
			{
				if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
					break;
			}
			for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
			{
				fnSetPos(uRow+k,uCol);
				lcd_comm_w(LC_AUT_WR);			// 写数据
				if(j < sizeof(GB_16)/sizeof(GB_16[0]))
				{
					lcd_data_w(GB_16[j].Msk[k*2]);
					lcd_data_w(GB_16[j].Msk[k*2+1]);
				}
				else						// 未找到该字
				{
					if(k < sizeof(GB_16[0].Msk)/4)
					{
						lcd_data_w(0x00);
						lcd_data_w(0x00);
					}
					else
					{
						lcd_data_w(0xff);
						lcd_data_w(0xff);
					}
				}
				lcd_comm_w(LC_AUT_OVR);
			}
			uCol += 2;
			i++;
		}
		if(uCol >= 32)			// 光标后移
		{
			uRow += 16;
			if(uRow < 256)
				uCol -= 32;
			else
			{
				uRow = 0;
				uCol = 0;
			}
		}
		fnSetPos(uRow,uCol);
		i++;
	}
}
void display_string_2(unsigned char uLen,char *tmpBuf,unsigned char black_white)
{
    unsigned char i=0,uRow,uCol;
    signed   char  j,c1,c2,cData;
	unsigned int  k;
	while(i<uLen)
	{
		c1 = tmpBuf[i];     //第一个
		c2 = tmpBuf[i+1];	//第二个
		uRow = fnGetRow();
		uCol = fnGetCol();
		if(c1 >= 0)
		{	// ASCII
			if(c1 < 0x20)
			{
				switch(c1)
				{
					case CR:
					case LF:		// 回车或换行
						i++;
						if(uRow < 112)
							fnSetPos(uRow+16,0);//,LAYER_1);
						else
							fnSetPos(0,0);
						continue;
					case BS:		// 退格
						if(uCol > 0)
							uCol--;
						fnSetPos(uRow,uCol);
						cData = 0x00;
						break;
					default:		// 其他
						c1 = 0x1f;
				}
			}
			for(j=0;j<16;j++)
			{
				lcd_comm_w(LC_AUT_WR);		// 写数据
                //lcd_auto_wdata();
				if(c1 >= 0x1f)
				{
					if(j < (16-ASC_CHR_HEIGHT))
					    if(black_white){
							lcd_data_w(0xff);
						}
						else{
							lcd_data_w(0x00);
						}
					else
						if(black_white){
							lcd_data_w(~(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]));
						}
						else{
							lcd_data_w(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);//fnPR13(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);
						}
				}
				else
					if(black_white){
						lcd_data_w(~cData);
					}
					else{
						lcd_data_w(cData);//fnPR13(cData);
					}
				    lcd_comm_w(LC_AUT_OVR);
				    fnSetPos(uRow+j+1,uCol);
			}
			if(c1 != BS)		// 非退格
				uCol++;
		}
		else
		{	// 中文
			for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
			{
				if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
					break;
			}
			for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
			{
				fnSetPos(uRow+k,uCol);
				//fnPR12(LC_AUT_WR);			// 写数据
				lcd_comm_w(LC_AUT_WR);	
				//lcd_auto_wdata();
				if(j < sizeof(GB_16)/sizeof(GB_16[0]))
				{
					if(black_white){
						lcd_data_w(~(GB_16[j].Msk[k*2]));
						lcd_data_w(~(GB_16[j].Msk[k*2+1]));
					}
					else{
						lcd_data_w(GB_16[j].Msk[k*2]);
						lcd_data_w(GB_16[j].Msk[k*2+1]);
					}
				}
				else						// 未找到该字
				{
					if(k < sizeof(GB_16[0].Msk)/4)
					{
						if(black_white){
							lcd_data_w(0xff);
							lcd_data_w(0xff);
						}
						else{
							lcd_data_w(0x00);
							lcd_data_w(0x00);
						}
					}
					else
					{
						if(black_white){
							lcd_data_w(0x00);
							lcd_data_w(0x00);
						}
						else{
							lcd_data_w(0xff);
							lcd_data_w(0xff);
						}
					}
				}
				lcd_comm_w(LC_AUT_OVR);
			}
			uCol += 2;
			i++;
		}
		if(uCol >= 32)			// 光标后移
		{
			uRow += 16;
			if(uRow < 128)
				uCol -= 32;
			else
			{
				uRow = 0;
				uCol = 0;
			}
		}
		fnSetPos(uRow,uCol);
		i++;
	}
}
unsigned char dprintf(char *fmt, ...)
{
	va_list arg_ptr;
	//char  c1,c2,cData;
	char tmpBuf[64];				// LCD显示数据缓冲区
	//unsigned char i=0,j,uLen,uRow,uCol;
	unsigned char uLen;
	//unsigned int  k;
	
	//函数应用套用
	va_start(arg_ptr, fmt);
	uLen = (unsigned char)vsprintf(tmpBuf, fmt, arg_ptr);
	va_end(arg_ptr);
    display_string(uLen,tmpBuf);
	return uLen;
}
void draw_pic(unsigned char x0,unsigned int y0,
		      unsigned char x1,unsigned int y1,
		      unsigned char *picture)
{

	unsigned char add_h=0;
	unsigned char add_l=0;
	unsigned int  add=0;
	unsigned char x=0;
	unsigned char y=0;
	unsigned char i=0;
	for(y=y0;y<y1;y++){
		add=x0+y*32;
		add_l=0;
	    add_l=add;
		add_h=0;
		add_h=add>>8;
		lcd_comm_w_2(LC_ADD_POS,add_l,add_h);
		lcd_comm_w(LC_AUT_WR);
		for(x=x0;x<x1;x++){
			lcd_data_w(picture[i]);
			i++;
		}
		lcd_comm_w(LC_AUT_OVR);
	}
}
void draw_dot(unsigned int x0,unsigned int y0)
{
	unsigned int  x;
	unsigned char draw_data=0x80;
	unsigned char add_h=0;
	unsigned char add_l=0;
	unsigned int  add=0;
	//int xdata temp;

	
	x=x0/8;
	draw_data=draw_data>>x0%8;

	add=x+y0*32;
	add_l=0;
    add_l=add;
	add_h=0;
	add_h=add>>8;
	lcd_comm_w_2(LC_ADD_POS,add_l,add_h);
	
    lcd_comm_w(LC_NOC_RD);
	draw_data=draw_data|lcd_data_r();
	lcd_comm_w(LC_AUT_WR);
	lcd_data_w(draw_data);

	lcd_comm_w(LC_AUT_OVR);

}

void draw_hor_line(unsigned int x0,
                   unsigned int y0,
		   unsigned int x1)
{
	unsigned int   x_0;
	unsigned int   x_1;
	unsigned char  draw_data_first=0xff;
	unsigned char  draw_data_last=0xff;
	unsigned char add_h=0;
	unsigned char add_l=0;
	unsigned int  add=0;
	//int xdata temp;
    //x1-x0  <8
	unsigned int i;
	x_0=x0/8;
	x_1=x1/8;
	if(x_0!=x_1){
		draw_data_first=draw_data_first>>x0%8;	
		draw_data_last=draw_data_last<<(8-x1%8);
		if((x1%8)==0){
			draw_data_last=0xff;
		}
	}
	else{
		draw_data_first=draw_data_first>>x0%8;
		if((x1%8)!=0){
			draw_data_first=draw_data_first<<(8-x1%8);
			draw_data_first=draw_data_first>>(8-x1%8);
		}
	}
		
	if(x_0!=x_1){
	    //draw_firt;
		add=x_0+y0*32;
		add_l=0;
	    add_l=add;
		add_h=0;
		add_h=add>>8;
		lcd_comm_w_2(LC_ADD_POS,add_l,add_h);
		
	    //command_null(LC_NOC_RD);
		//draw_data=draw_data|lcd_data_r();
		lcd_comm_w(LC_AUT_WR);
		lcd_data_w(draw_data_first);
		if((x1%8)==0)
			x_1--;
		for(i=x_0+1;i<x_1;i++){
		   lcd_data_w(0xff);
		}
		lcd_data_w(draw_data_last);
	
		lcd_comm_w(LC_AUT_OVR);
	}
	else{
		add=x_0+y0*32;
		add_l=0;
	    add_l=add;
		add_h=0;
		add_h=add>>8;
		lcd_comm_w_2(LC_ADD_POS,add_l,add_h);
		
	    //command_null(LC_NOC_RD);
		//draw_data=draw_data|lcd_data_r();
		lcd_comm_w(LC_AUT_WR);
		lcd_data_w(draw_data_first);
		lcd_comm_w(LC_AUT_OVR);
	}
}

void draw_ver_line(unsigned int x0,
                   unsigned int y0,
				   unsigned int y1)
{
	unsigned int  x;
	unsigned char draw_data=0x80;
	unsigned char add_h=0;
	unsigned char add_l=0;
	unsigned int  add=0;
	unsigned int  i;
	unsigned char draw_data_temp;
	//int temp;
    x=x0/8;
	draw_data=draw_data>>x0%8;
	for(i=y0;i<y1;i++){
		
		add=x+i*32;
		add_l=0;
	    add_l=add;
		add_h=0;
		add_h=add>>8;
		lcd_comm_w_2(LC_ADD_POS,add_l,add_h);
		
	    lcd_comm_w(LC_NOC_RD);
		draw_data_temp=draw_data|lcd_data_r();
		lcd_comm_w(LC_AUT_WR);
		lcd_data_w(draw_data_temp);
		lcd_comm_w(LC_AUT_OVR);
    }
}
void creat_button(unsigned char x0,unsigned char y0,//
				  unsigned char x1,unsigned char y1,//
				  unsigned char black_white,
				  char *fmt, ...)
{
	
	va_list arg_ptr;
	char tmpBuf[64];				// LCD显示数据缓冲区
	unsigned char uLen;
	
	unsigned int x0_0=0;
	unsigned int x1_1=0;
	//函数应用套用
	va_start(arg_ptr, fmt);
	uLen = (unsigned char)vsprintf(tmpBuf, fmt, arg_ptr);
	va_end(arg_ptr);
    
	x0_0=x0*8;
	x1_1=x1*8;

	draw_hor_line(x0_0,y0-1,x1_1);
	draw_hor_line(x0_0,y1,x1_1+1);
	draw_hor_line(x0_0+1,y1+1,x1_1);
	draw_ver_line(x0_0-1,y0,y1);
	draw_ver_line(x1_1,y0,y1);
	draw_ver_line(x1_1+1,y0+1,y1);
	
	//设置光标位置
	//显示字符串

	cursor(x0,y0);
	display_string_2(uLen,tmpBuf,black_white);

}

void creat_dialog(unsigned int x0,unsigned int y0,
                  unsigned int x1,unsigned int y1,
				  char *fmt, ...)
{
	va_list arg_ptr;
	char tmpBuf[64];				// LCD显示数据缓冲区
	unsigned char uLen;

	unsigned int x0_0=0;
	unsigned int x1_1=0;

	//函数应用套用
	va_start(arg_ptr, fmt);
	uLen = (unsigned char)vsprintf(tmpBuf, fmt, arg_ptr);
	va_end(arg_ptr);

	x0_0=x0*8;
	x1_1=x1*8;
	draw_hor_line(x0_0,y0-1,x1_1);
	//draw_pic(x0,y0, x0+counter_temp, y0+16,picture);
	cursor(x0,y0);
	display_string(uLen,tmpBuf);
	draw_hor_line(x0_0,y0+17,x1_1);



	draw_hor_line(x0_0,y1,x1_1+1);
	draw_hor_line(x0_0+1,y1+1,x1_1);
	draw_ver_line(x0_0-1,y0,y1);
	draw_ver_line(x1_1,y0,y1);
	draw_ver_line(x1_1+1,y0+1,y1);	
}

void diplay_top_state(void){
	draw_hor_line(2  ,1 ,317-64);
	draw_ver_line(1  ,2 ,21 );
	draw_ver_line(317-64,2 ,22 );
    draw_ver_line(318-64,3 ,21 );
	draw_hor_line(2  ,21,318-64);
	draw_hor_line(3  ,22,317-64);   
}

void diplay_bottom_state(void){

    draw_hor_line(2  ,1+216+16 ,317-64   );
	draw_ver_line(1  ,2+216+16 ,21+216+16);
	draw_ver_line(317-64,2+216+16 ,22+216+16);
    draw_ver_line(318-64,3+216+16 ,21+216+16);
	draw_hor_line(2  ,21+216+16,318-64   );
	draw_hor_line(3  ,22+216+16,317-64   );
}

//leaf logo
void display_logo(void){

	draw_pic(0,0,30,64,tr_elec);
        OSTimeDly(256);                       /* Delay 256 clock tick  */	
//	cls();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -