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

📄 t6963c.c

📁 t6963驱动LCD12864显示汉字菜单仿真例
💻 C
📖 第 1 页 / 共 2 页
字号:
{
    DDRA =  0xFF;  // 数据方向为输出
//   PORTA = 0xFF;  // 使能内部上拉电阻

    DDRB =  0x0F;  // 数据方向为输出

	if(fnST3() == 0)
		return 1;
	PORTB &= ~(1 << CD) ;   // CD (PB2) 赋值0,低电平表示数据
//	_NOP();
//	lcd_delay(1);
	PORTA = uData;
//	_NOP();
//	lcd_delay(1);
	PORTB &= ~(1 << WR);    // WR (PB0) 赋值0,低电平写操作有效
//	_NOP();
//	lcd_delay(1);
    PORTB |= (1 << WR);       // WR (PB0) 赋值1,高电平写操作无效
	return 0;	// 返回0成功
}

/************************************************************************************/
/* 函数名称:fnCWD 													   	            */
/* 输入参数:uchar uData  数据                              						*/
/* 输出参数:uchar		  0 成功,否则失败											*/
/* 函数功能:写命令                                         						*/
/* 作 者   :安车科技大灯仪开发小组 许孝刚											*/
/* 开发日期: 2005.08														        */
/* 版 本   : v1.0																	*/
/************************************************************************************/
uchar fnCWD(uchar uData)		
{
    DDRA =  0xFF;  // 数据方向为输出
    PORTA = 0xFF;  // 使能内部上拉电阻

    DDRB =  0x0F;  // 数据方向为输出

	if(fnST01() == 0)	
		return 1;
	PORTB |= (1 << CD) ;    // CD (PB2) 赋值1,高电平表示命令
	PORTA = uData;
//	lcd_delay(1);
	PORTB &= ~(1 << WR);    // WR (PB0) 赋值0,低电平写操作有效
//	_NOP();
//	lcd_delay(1);
    PORTB |= (1 << WR);       // WR (PB0) 赋值1,高电平写操作无效
	return 0;	// 返回0成功
}

/************************************************************************************/
/* 函数名称:fnDRD													   	        	*/
/* 输入参数:void                               									*/
/* 输出参数:uchar  成功,返回数据;失败返回1											*/
/* 函数功能:读数据                                         						*/
/* 作 者   :安车科技大灯仪开发小组 许孝刚											*/
/* 开发日期: 2005.08														        */
/* 版 本   : v1.0																	*/
/************************************************************************************/
uchar fnDRD(void)				
{  
    uchar data;
    DDRA =  0xFF;  // 数据方向为输出
//    PORTA = 0x00;  // 禁止内部上拉电阻

    DDRB =  0x0F;  // 数据方向为输出
	if(fnST01() == 0)	
		return 1;

	PORTB &= ~(1 << CD);    // CD (PB2) 赋值0,低电平表示数据
	PORTB &= ~(1 << RD);    // RD (PB1) 赋值0,低电平表示读操作有效
//	_NOP();      
//	lcd_delay(1);          // 延时
	data = PINA;
//	_NOP();   
	PORTB |= (1 << RD);     // RD (PB1) 赋值1,高电平表示读操作无效
	return data;
}


/************************************************************************************/
/* 函数名称:fnSetPos 													   	        */
/* 输入参数:uchar urow, 欲设置的行                     		    				*/
/*           uchar ucol,欲设置的列                                                  */
/*           行的定义为,从上到下为行;列的定义为从左到右为列,类似矩阵中行列          */                                                                        
/* 输出参数:void																	*/
/* 函数功能:设置当前任意地址,每水平8像素为一字节                                   */
/* 作 者   :安车科技大灯仪开发小组 许孝刚											*/
/* 开发日期: 2005.08														        */
/* 版 本   : v1.0																	*/
/************************************************************************************/
void fnSetPos(uchar urow, uchar ucol)
{
	uint  iPos;
	
	iPos =( (urow << 4) + (ucol >> 3) );		    // iPos =urow *16 + ucol /8 ;
	fnCW2P(LC_ADD_POS,iPos & 0xFF,iPos >> 8);
	
}

/************************************************************************************/
/* 函数名称:cursor 													   	        */
/* 输入参数:uchar uRow, uchar uCol 当前行、列                               		*/
/* 输出参数:void																	*/
/* 函数功能:设置当前显示行、列                                                     */
/* 作 者   :安车科技大灯仪开发小组 许孝刚											*/
/* 开发日期: 2005.08														        */
/* 版 本   : v1.0																	*/
/************************************************************************************/ 
void cursor(uchar uRow, uchar uCol)
{   
    gCurRow = uRow;
	gCurCol = uCol;
	fnSetPos(gCurRow,gCurCol);
}

/************************************************************************************/
/* 函数名称:cls 													   	            */
/* 输入参数:void                               									*/
/* 输出参数:void																	*/
/* 函数功能:清屏							                                        */
/* 作 者   :安车科技大灯仪开发小组 许孝刚											*/
/* 开发日期: 2005.08														        */
/* 版 本   : v1.0																	*/
/************************************************************************************/
void cls(void)
{
	uint  i;
	
	fnSetPos(0,0);
	fnCW0P(LC_AUT_WR);			 	// 自动写
	
    for(i=0;i<LCM_HEIGHT *(LCM_WIDTH/8);i++)  // 将所有单元内容都写1
    {   
		fnST3();
		fnDWD(0x00);
//		_NOP();   	
	}	                            // 写数据
//	lcd_delay(15);  
	fnCW0P(LC_AUT_OVR);				// 自动写结束
	fnCW2P(LC_ADD_POS,0x00,0x00);	// 重置地址指针

}


/************************************************************************************/
/* 函数名称:fnLCMInit 													   	        */
/* 输入参数:void                               									*/
/* 输出参数:char																	*/
/* 函数功能:LCM 初始化                                                             */
/* 作 者   :安车科技大灯仪开发小组 许孝刚											*/
/* 开发日期: 2005.08														        */
/* 版 本   : v1.0																	*/
/************************************************************************************/ 



char fnLCMInit(void)
{
   
	if(fnCW2P(LC_TXT_STP,0x00,0x00) != 0)	// 文本显示区首地址
		return -1;
	fnCW2P(LC_TXT_WID,LCM_WIDTH/8,0x00);	// 文本显示区宽度
	fnCW2P(LC_GRH_STP,0x00,0x00);	        // 图形显示区首地址
	fnCW2P(LC_GRH_WID,LCM_WIDTH/8,0x00);	// 图形显示区宽度	
	fnCW0P(LC_CUR_SHP | 0x01);	        	// 光标形状
	fnCW0P(LC_MOD_OR);						// 显示方式设置
	fnCW0P(LC_DIS_SW | 0x08);			    // 显示开关设置
//	lcd_delay(15);  
	return 0;
}

void lcd_delay(uint time)
{
    int i;
    while(time--)
    {
        i = 1000;
        while(i--);
     }
}
/******************************************************************************/

/************************************************************************************/
/* 函数名称:dprintf													   	        */
/* 输入参数:uchar * fmt    欲显示字符串                           				    */
/* 输出参数:uchar  uLen    字符串长度												*/
/* 函数功能:字符显示                                    						    */
/* 作 者   :安车科技大灯仪开发小组 许孝刚											*/
/* 开发日期: 2005.08														        */
/* 版 本   : v1.0																	*/
/************************************************************************************/
uchar dprintf(uchar *ptr)
{
 
	uchar c1,c2;
    uchar *tmpBuf;                           // LCD显示数据缓冲区
	uchar i=0,j=0,j1=0,k,uLen=0,uRow,uCol,uVal=0;
	const typFNT_GB12 data ;

	uchar uIndex1,uIndex2;  // 存储汉字的索引
	uchar uMask1,uMask2; // 1个字横向字模信息的2个字节
	uchar k1,k2;
   while (ptr[uLen]!=0)
   {
     uLen++; ////探测字串长度
   }; 

    tmpBuf = ptr;
	i = 0;
	while(i<uLen)
	{
		c1 = tmpBuf[i];
		c2 = tmpBuf[i+1];
		uRow = fnGetRow();
		uCol = fnGetCol();
		
		if(c1 >= 0x20 && c1 <= 0x7f)		// 0x20---0x7f
		{	// ASCII 的 12行 * 6列 字符显示
			for( j = 0; j < 12; j++)            // 逐行显示
			{
				for ( k = 0; k < 6; k++)        // 逐列显示
				{
					cursor(uRow + j,uCol + k);  // 置当前显示地址
					k1 =   (uCol + k) & 0x07 ;  // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
  												// 每字节8个像素点,从左到右为01234567点,  
												// 对应数据的76543210位
					k2 = 7 - k1;                // 当前屏幕点属于的字节单元的位
					k1 = BIT(7-k);              // 当前屏幕点属于的字节单元的数据的第7-k个数据位置1,其余置0
					uVal = pgm_read_byte(ASCII_TBL+(c1-0x20)*12 + j);
					k1 =  ( uVal  & k1 ) == k1 ? 1 : 0;  // 测试对应字库中字的第j行1字节数据中的7-k个数据位是否为1
					if(k1 == 1)
						fnCW0P(LC_BIT_OP | 0x08 | k2 );    // 是1
					else
						fnCW0P(LC_BIT_OP |  k2 );          // 是0
				}
				
			}   
			
			cursor(uRow ,uCol + 6);             // 下一个字符
			i++;
		}
		else    // 0x80 -- 0xff
			
		{	    // 中文12行*12列汉字显示 
			 
           for(j1 = 0; j1 < sizeof(GB_12)/sizeof(GB_12[0]);j1 ++) // 找字
			{
			    memcpy_P(&data, &GB_12[j1], sizeof(typFNT_GB12)); // 从程序区拷贝一个结构体数据

			    uIndex1 = data.Index[0];
                uIndex2 = data.Index[1];

 				if(c1 == uIndex1 && c2 == uIndex2)
 					break;
 			}
			
 			if(j1 >= sizeof(GB_12)/sizeof(GB_12[0]) )       // 找不到,屏幕就是空白
 				return 0;
 			for( j=0;j<12;j++)								// 逐行显示
			{
				for ( k = 0; k < 8; k++)                    // 逐列显示
				{
					cursor(uRow + j,uCol + k);              // 置当前显示地址
					k1 = (uCol + k) & 0x07 ;                // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
					                                        // 每字节8个像素点,从左到右为01234567点,  
												            // 对应数据的76543210位
					k2 = 7 - k1;							// 当前屏幕点属于的字节单元的位
					k1 = BIT(7 - (k & 0x07));               // 当前屏幕点属于的字节单元的数据的第7 - k & 0x07个数据位置1,其余置0
			     
				 	memcpy_P(&data, &GB_12[j1], sizeof(typFNT_GB12));

					uMask1 = data.Msk[2*j];
					 
					k1  =  (uMask1 & k1 ) == k1 ? 1 : 0;  // 汉字左边部分
 
					if(k1 == 1)                             // 为 1
						fnCW0P(LC_BIT_OP | 0x08 | k2 );
					else
						fnCW0P(LC_BIT_OP |  k2 );           // 为 0  		
				} 

                for ( k = 0; k < 4; k++)                    // 逐列显示
				{
					cursor(uRow + j,uCol + k +8);           // 置当前显示地址
					k1 = (uCol + k + 8) & 0x07 ;            // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
					                                        // 每字节8个像素点,从左到右为01234567点,  
												            // 对应数据的76543210位
					k2 = 7 - k1;							// 当前屏幕点属于的字节单元的位
					k1 = BIT(7 - (k & 0x07));               // 当前屏幕点属于的字节单元的数据的第7 - k & 0x07个数据位置1,其余置0
				
					uMask2 = data.Msk[2*j+1];
					k1  =  (uMask2 & k1 ) == k1 ? 1 : 0;    // 汉字右边部分
 
					if(k1 == 1)                             // 为 1
						fnCW0P(LC_BIT_OP | 0x08 | k2 );
					else
						fnCW0P(LC_BIT_OP |  k2 );           // 为 0  		
				} 

			} 
				cursor(uRow ,uCol + 13);                    // 下一个汉字
				i +=2;                                      // 在字符串中一个汉字占2个字节
		}  	
		
		
	} 
	return uLen;  
}  

⌨️ 快捷键说明

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