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

📄 display.c

📁 uCOSII在motorala单片机上的移植
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef  OS_MASTER_FILE
#include "includes.h"
#endif
#include "charmode.c"
/*
*****************************************************************************************************************
*	功能描述:		该函数设置控制端口和数据端口为输出端口,并且控制端口相应的控制位
*				输出初态都为1;对液晶模块进行了软件复位;对文本区,图形区和CG—
*				RAM区做了分配;设置显示模式为图形模式;清零液晶显示模块8k的RAM
*				空间。	
*				具体的命令请参见TOSHIBA的T6963C芯片数据手册;	
*	参数:		没有。
*	返回值:		没有。
*****************************************************************************************************************
*/
void initLCDResource(void)
{
	INT16U loop;
	
	*SIM_PEPAR = 0x00;		// set multi function pins as I/O pins;
	*SIM_DDRE = 0xFF;			// normal state of those pins is output;	
	
  	*TPU_PRAM11 = 0x0003;
  	*TPU_PRAM12 = 0x0003;
  	*TPU_PRAM13 = 0x0003;
  	*TPU_PRAM14 = 0x0003;
  	*TPU_PRAM15= 0x0003;
  	*TPU_CFSR0 = 0x8888;    
  	*TPU_CFSR1 = ((*TPU_CFSR1)&0x0FFF)|0x8000;    
	*TPU_CPR0 = ((*TPU_CPR0)&0x003F)|0xFFC0;
  	*TPU_HSQR0 &= 0x003F;    
  	*TPU_HSRR0 = ((*TPU_HSRR0)&0x003F)|0xFFC0;     
  	*TPU_CIER &= 0x07FF;       
 	*TPU_HSRR0 = (*TPU_HSRR0 & ~0xFFC0) | 0x5540;  /* set tch11,12,13,14,15*/

	LCD_RESET_ENABLE();	
   	NOP();
   	NOP();
   	NOP();
	LCD_RESET_DISABLE();
    	writeData(TBASE&0xFF);			// set text home address;
    	writeData(TBASE>>8);
    	writeCommand(0x40);
    	
    	writeData(TCOLUMNS&0xFF);			// set text area(Bytes per display line);
    	writeData(TCOLUMNS>>8);
    	writeCommand(0x41);
    	
    	writeData(GBASE&0xFF);			// set graphic home address;
    	writeData(GBASE>>8);		
    	writeCommand(0x42);
    	
    	writeData(GCOLUMNS&0xFF);			// set graphic area(Bytes per display line);
    	writeData(0x00);
    	writeCommand(0x43);
   	
    	setOffsetRegister(0x03);
    	
    	writeCommand(0x80);				// set OR mode;  CAUTION: when setting mode not setted , there
    									// is somthing wrong with display;
   	writeData(0x00);					// clearing all RAM begins ;
    	writeData(0x00);
    	writeCommand(0x24);
 	writeCommand(0xB0);
    	for(loop = 0; loop < 0x2000; loop++)
    	{  	
    		writeData(0x00);//writeData为向液晶显示器写数据						
    	}                 //writeCommand为向液晶显示器写命令
	writeCommand(0xB2);				// clearing all RAM ends;
	writeCommand(0x98);				// text off, graphic on;
	
	return;
}		
/*
*****************************************************************************************************************
*	功能描述:		该函数用来读状态寄存器的内容,用以决定下一步对液晶模块的读或写
*				操作是否可行;		
*	参数:		没有;
*	返回值:		液晶显示模块的状态字(1个byte,8个bits);
*				状态字每位所代表的含义请参见TOSHIBA的T6963C芯片数据手册;
*****************************************************************************************************************
*/
INT8U readStatusRegister(void)
{
	INT8U result = 0;
	
	*SIM_DDRE = 0x00;					// 使数据端口为输入端口;	
	LCD_CHIPSEL_ENABLE();
	LCD_READ_ENABLE();
	NOP();
	result = *SIM_PORTE;				// 将状态寄存器的内容读入到变量result中;	
	LCD_READ_DISABLE();
	LCD_CHIPSEL_DISABLE();
	*SIM_DDRE = 0xFF;
	
	return result;
}
/*
*****************************************************************************************************************
*	功能描述:		该函数用来读取当前地址指针所指向单元的内容,当前地址可通过函数
*				setAddressPointer函数来设置;		
*	参数:		没有;
*	返回值:		当前地址指针所指向单元的内容;
*****************************************************************************************************************
*/
INT8U readData(void)
{
	INT8U result = 0;
	
	do{
		result = readStatusRegister();
	}while((result & (0x03)) != 0x03);		// 等待液晶显示模块可进行读操作;
	*SIM_DDRE = 0x00;					// 使数据端口为输入端口;
	LCD_DATA_ENABLE();
	LCD_CHIPSEL_ENABLE();
	LCD_READ_ENABLE();
    	NOP();
    	result = *SIM_PORTE;
	LCD_READ_DISABLE();
	LCD_CHIPSEL_DISABLE();
	LCD_DATA_DISABLE();
   	
    	return result;
}
/*
*****************************************************************************************************************
*	功能描述:		该函数用来向液晶显示模块写命令,告诉显示模块为下一步的操作做相关
*				的准备;		
*	参数:		cmd代表向液晶显示模块所写入的命令;
*				命令的具体内容请参见TOSHIBA的T6963C芯片数据手册;
*	返回值:		该函数假设命令能够成功地写入液晶显示模块,没有返回值;		
*****************************************************************************************************************
*/	
void writeCommand(INT8U cmd)
{
	INT8U temp = 0xFF;
	
	do{
		temp = readStatusRegister();
	}while((temp & (0x03)) != 0x03);			// 等待液晶显示模块可进行写操作;
	*SIM_PORTE = cmd;						// put the command cmd to portA;
	LCD_CHIPSEL_ENABLE();
	LCD_WRITE_ENABLE();
	NOP();
	LCD_WRITE_DISABLE();
	LCD_CHIPSEL_DISABLE();
	
	return;
}
/*
*****************************************************************************************************************
*	功能描述:		该函数用来向液晶显示模块写数据;		
*	参数:		data代表向液晶显示模块写入的数据;
*				写该数据时,应先指定数据存放的地址,这个操作通过函数
*				setAddressPointer函数来完成;
*	返回值:		假设该函数能够成功的被调用,没有返回值;
*****************************************************************************************************************
*/
void writeData(INT8U data)
{
	INT8U temp = 0xFF;
	
	do{
		temp = readStatusRegister();
	}while((temp & (0x03)) != 0x03);		// 等待液晶显示模块可进行写操作;
	*SIM_PORTE = data;					// put the data to portA;
	LCD_DATA_ENABLE();	
	LCD_CHIPSEL_ENABLE();
	LCD_WRITE_ENABLE();
	NOP();
	LCD_WRITE_DISABLE();
	LCD_CHIPSEL_DISABLE();	
	LCD_DATA_DISABLE();
	
    	return;
}
/*
*****************************************************************************************************************
*	功能描述:	该函数用来得到参数addr所指向单元的内容;		
*	参数:		addr代表液晶显示模块内部单元的地址;
*	返回值:		addr所指向单元的内容;	
*****************************************************************************************************************
*/
INT8U getData(INT16U addr)
{
	INT8U result = 0xFF;
	
	setAddressPointer(addr);		// 将地址指针设置为addr;
	writeCommand(0xB1);			
	result = readData();				// 读addr所指向单元的内容;
	writeCommand(0xB2);	
	
	return result;
}		
/*
*****************************************************************************************************************
*	功能描述:	该函数用来设置偏置寄存器的内容,只有参数addr的低5位有效;偏置
*				寄存器的内容和寻址空间见下表:
*					offset register data			CG RAM hex. address(start to end)
*						00000					0000 to 07FFH 
*						00001					0800 to 0FFFH
*							
*						11111					F800 to FFFFH	
*	参数:		addr用来设置偏置寄存器的内容,低5位有效;
*	返回值:		假设函数能够被成功的调用,没有返回值;
*****************************************************************************************************************
*/
void setOffsetRegister(INT8U addr)
{
	writeData(addr);			// 设置偏置寄存器的内容;
	writeData(0x00);
	writeCommand(0x22);		// 告诉液晶显示模块addr用来写入偏置寄存器;
	
	return;
}
/*
*****************************************************************************************************************
*	功能描述:	该函数用来设置地址寄存器里的内容;		
*	参数:		addr代表写入地址寄存器里的内容;
*	返回值:		假设函数能够被成功的调用,没有返回值;
*****************************************************************************************************************
*/
void setAddressPointer(INT16U addr)
{
	writeData(addr&0xFF);				// 写入addr的低字节;
    	writeData(addr>>8);				// 写入addr的高字节;
    	writeCommand(0x24);				// 将addr写入地址寄存器;
    	
    	return;
}
/*
*****************************************************************************************************************
*	功能描述:	该函数用来将液晶显示关闭。		
*	参数:		没有。
*	返回值:		没有。
*****************************************************************************************************************
*/
void displayOff(void)
{
	writeCommand(0x90);
	
	return;
}
/*
*****************************************************************************************************************
*	功能描述:	该函数用来开启液晶显示。		
*	参数:		没有。
*	返回值:		没有。
*****************************************************************************************************************
*/
void displayOn(void)
{
	writeCommand(0x98);
	
	return;
}

/*
*****************************************************************************************************************
*	功能描述:	该函数用来得到指定字符(charcode)的字模在字模数组(CharMode[ ][ ])
*				中的索引值;		
*	参数:		charcode代表指定字符的内码;
*	返回值:		指定字符在字模数组中的索引;
*				如果指定字符的字模在字模数组中不存在,则返回0xFFFF;
*****************************************************************************************************************
*/	
INT16U getCharIndex(INT16U charcode)
{
	INT16U result;
	INT16U index;
	INT16U head,rear;
	
	head = 0;
	rear = CMSIZE - 1;
	
	while(head <= rear)
	{
		index = (head + rear) / 2;
		if((CharMode[index][0]&0x80) == 0x00) //CharMode为二维数组
		{
			result = CharMode[index][0];
		}
		else
		{
			result = CharMode[index][0];
			result <<= 8;
			result += CharMode[index][1];
		}
		if(charcode == result)
		{
			return index;
		}
		else
		{
			if(charcode > result) 
				head = index + 1;
			else rear = index - 1;
		}
		 
	}
	
	return 0xFFFF;
}
/*
*******************************************************************************************************
* 	功能描述:	该函数用来在指定点处(x bit, y bit)显示指定宽度(width)和
*				高度(height)的图形,图形数据由pdata(无符号字符型指针)
*				来指定;
*	参数:		x 代表横坐标,取值范围为0 -> 127;
*				y 代表纵坐标,取值范围为0 -> 159;
*				width 代表图形的宽度,取值范围为 1 -> (128 - x);
*				height代表图形的高度,取值范围为 1 -> (159 - y);
*				pdata代表图形数据,是一个无符号字符型指针,数据按如下要求
*				组织:
*					/	pdata[0](8 bits)	pdata[next colum...](8 bits)	----
*					|	pdata[1](8 bits)			|
*				height		|					|
*					|		|	(8 bits)			|(8 bits)
*					 \        	|	(8 bits)			|(8 bits)				----
*							\__________________width_________________/
*	返回值:		假设函数能够被成功的调用,没有返回值;			
*******************************************************************************************************
*/
void drawGraph(INT8U x, INT8U y, INT8U width, INT8U height, INT8U *pdata)
{
	INT8U loop, heightloop;
	INT8U screenx;
	INT16U index = 0; 
	
	for(loop = 0, screenx = x; loop < width; loop++, screenx++)
	{
		for(heightloop = 0; heightloop < (height / 8); heightloop++)
		{
			print(screenx, y + heightloop * 8, 8, pdata[index]);//数组进行传递参数时,
			                                                    //使用指针
			index++;
		}
		if((height % 8) != 0)
		{
			print(screenx, y + heightloop * 8, height % 8, pdata[index]);
			index++;
		}
	}
	
	return;
}
/*
**************************************************************************************************************
*	功能描述:	该函数用来在液晶上画水平线,线的起点由(x(bit), y(bit))来决定,
*				线的宽度由height来决定,线型由data来决定;		
*	参数:		x代表水平线起点的横坐标,取值范围为0 -> 127;
*				y代表水平线起点的纵坐标,取值范围为0 -> 159;
*				width代表水平线的宽度,取值范围为1 ->(128 - x);
*				data代表显示线的类型;
*	返回值:		假设函数能够被成功的调用,没有返回值;
**************************************************************************************************************
*/
void drawHorizLine(INT8U x, INT8U y, INT8U width, INT8U data)
{
	INT8U Lrotate,Rrotate;
	INT8U maskcode;
	INT8U bit;
	INT8U loop;
	INT8U result;
	
	switch((INT8U)(y%8))  //强制类型转换
	{
		case 0x00:	maskcode = 0x80;Lrotate = 7; break;

⌨️ 快捷键说明

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