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

📄 display.c

📁 AVR 单片机的一个系统设计方案
💻 C
字号:
#include "Includes.h"
/*--------------------------------变量定义------------------------------------*/
INT8U  DispBuf[4][16];			     											// 显示缓冲区
INT8U  SignBuf[4][16];				 											// 反显标志
INT8U  BoolBuf[4][8]; 				 											// 全角标志
INT8U  Buf[5];   																// 数字缓存区
/*------------------------向DB0~DB7三态数据线写数据--------------------------*/
void LCD_Write( INT8U flag,INT8U val )
{
    INT8U temp;

    temp = LCD_IO_PORT; 														// 记下LCD对应端口方向
	CS_L();          															// 液晶屏驱动芯片使能
	asm("nop");asm("nop");asm("nop");
	if( flag )																	// flag 1:val为指令;0:val为数据
	{
	 	A0_L();       															// 写指令
	}
	else    
	{
	 	A0_H();     															// 写数据
	}
  	LCD_IO_PORT = 0xff;														    // 将口线置为输出
	asm("nop");asm("nop");asm("nop");
	LCD_W_PORT = val;															// 将显示数据送出
  	asm("nop");asm("nop");asm("nop");
 	WR_L();                      
 	asm("nop");asm("nop");asm("nop");
	WR_H();																		// 数据被写到DB0~DB7                     
 	asm("nop");asm("nop");asm("nop");
	CS_H();
	LCD_IO_PORT = temp; 														// 还原LCD对应端口方向
}
/*-------------------------------初始化液晶屏---------------------------------*/ 
void LCD_Init ( void )
{         
	LCD_Write ( COMMAND, 0xae );												// 关显示 0xae:关显示;0xaf:开显示
	LCD_Write ( COMMAND, 0xe2 );												// 软件复位
	LCD_Write ( COMMAND, 0xa2 );												// 设置液晶驱动电压偏压比
	LCD_Write ( COMMAND, 0xa0 );												// 选择屏列扫描方式 0xa0:SEG0-SEG127;0xa1:SEG127-SEG0 
	LCD_Write ( COMMAND, 0xc8 );												// 选择屏列扫描方式 0xc0:COM0-COM63 ;0xc8:COM63-COM0 
	LCD_Write ( COMMAND, 0x2f );												// 选择内部操作电压为VCC
	LCD_Write ( COMMAND, 0xa4 );												// 0xa4:正常显示;0xa5:所有点不显示
	LCD_Write ( COMMAND, 0x23 );												// 选择内部电阻比Rb/Ra=0x20~0x27(调节液晶对比度) 
	LCD_Write ( COMMAND, 0x81 );												// 设置可编程电压调整模式       
	LCD_Write ( COMMAND, 0x38 );												// 设置电压编程寄存器  0x00~0x3f(调节液晶亮度)
	LCD_Write ( COMMAND, 0xa6 );												// 图像显示方式 0xa6:正常;0xa7:反显
	LCD_Write ( COMMAND, 0xaf );												// 关显示 0xae:关显示;0xaf:开显示
}
/*-----------------------------------清屏-------------------------------------*/	  
void LCD_Clr( void )
{
  	INT8U i,j;
  	
	LCD_Write(COMMAND,0xae);													// 关显示
	for (i=0; i<PAGE; i++)
	{
       	LCD_Write(COMMAND,0x40  );												// 初始行
	   	LCD_Write(COMMAND,0xb0+i);
	   	LCD_Write(COMMAND,0x10  );											 	// 初始列
	   	LCD_Write(COMMAND,0x00  );
	   	for (j=0; j<COLUMN; j++)
	   	{
      	  	LCD_Write(DATA,0);   												// 清零
      	}
	} 
    LCD_Write(COMMAND,0xaf);       												// 开显示
}	
/*--------------------------------行(页)设置--------------------------------*/
void Setpage(INT8U page)
{
   	if(page > (PAGE-1))      													// 此屏有8页
   	{ 
   		return; 
   	}    
   	LCD_Write(COMMAND,0x40);    			 									// 初始行 
   	LCD_Write(COMMAND,0xb0+page);
}
/*-----------------------------------列设置-----------------------------------*/  
void Setcolumn(INT8U column, INT8U hz)
{
	if(hz) 
	{
		column<<=4;    															// 相当于column=column*16 液晶屏幕16列为汉字显示1列
	}
	else    
	{
		column<<=3;    															// 相当于column=column*8  液晶屏幕 8列为字符显示1列
	}
	if(column > COLUMN)															// 此屏有128列
	{
		return;                      
	}
	LCD_Write(COMMAND,0x10);     												// 初始列
   	LCD_Write(COMMAND,0x10 +((column>>4)&0x0f));								// 写列址高4位
  	LCD_Write(COMMAND,0x00 +     (column&0x0f));								// 写列址低4位
}
/*-----------------------------------显示处理---------------------------------*/
void SendDot(INT8U page,INT8U column,INT8U value,INT8U type,INT8U fan)
{
	INT8U i;

	Setpage(page);	
	   
	if (type==SBCcase)															// 全角(汉字)
	{ 
	    Setcolumn(column,1); 	
	    for (i=0; i<16; i++)													// 上半部分
		{
		   if (fan)
		    {
		    	LCD_Write(DATA,~gb16Dot[value].Msk[2*i]);  						// 反显
		    }
			else   
			{
				LCD_Write(DATA,gb16Dot[value].Msk[2*i]);
			}
		}
	    Setpage(page + 1);
	    Setcolumn(column,1); 
	   	for (i=0;i<16;i++)														// 下半部分
	    {
		   	if (fan)
		    {
		    	LCD_Write(DATA,~gb16Dot[value].Msk[2*i+1]);  					// 反显
		    }
			else   
			{
				LCD_Write(DATA,gb16Dot[value].Msk[2*i+1]);
			}
		}
	}
	else 																		// 半角(字符)
	{  
		value -= ' ';															// 首字空格ASIIC码
		Setcolumn(column,0); 
	    for (i=0; i<8; i++)
		{
		    if (fan)
		    {
		    	LCD_Write(DATA,~nAsciiDot[value*16+2*i]);  						// 反显
		    }
			else   
			{
				LCD_Write(DATA,nAsciiDot[value*16+2*i]);
			}
		}
	    Setpage(page + 1);
	    Setcolumn (column,0);
	    for (i=0; i<8; i++ )
		{
		    if (fan)
		    {
		    	LCD_Write(DATA,~nAsciiDot[value*16+2*i+1]);  											// 反显
		    }
			else   
			{
				LCD_Write(DATA,nAsciiDot[value*16+2*i+1]);
			}
		}
	}
}
/*------------------------------显示缓存初始化--------------------------------*/
void DispInit(void)
{
  	INT8U i,j;
  
  	for (i=0;i<4;i++)
  	{
  		for (j=0;j<8;j++)
  		{
			DispBuf[i][j*2]		= ' ';                                          // 空白
			DispBuf[i][j*2+1] 	= ' ';
			SignBuf[i][j*2]		= 0;
			SignBuf[i][j*2+1]	= 0;
			BoolBuf[i][j]		= 0;
		}
  	}
}
/*-------------------------------将缓存内容显示-------------------------------*/
void DispAll(void)
{
 	INT8U i,j;
	
	for (i=0; i<4; i++)
	{
	   	for (j=0; j<8; j++)
    	{
			
			if(BoolBuf[i][j]==SBCcase)											// 全角(汉字)
			{
				SendDot(2*i,j,DispBuf[i][j*2+1],SBCcase,SignBuf[i][j*2+1]);
			}
			else 																// 半角(字符)
			{
				SendDot(2*i,2*j,DispBuf[i][j*2],DBCcase,SignBuf[i][j*2]);
				SendDot(2*i,2*j+1,DispBuf[i][j*2+1],DBCcase,SignBuf[i][j*2+1]);
			}
		}
	}
}
/*----------------------------------单字符处理--------------------------------*/
void MakeChar(INT8U x,INT8U y,INT8U value,INT8U fan)
{
	if ((x>4)||(y>16)){return;}
	DispBuf[x-1][y-1] = value;
	SignBuf[x-1][y-1] = fan;
}
/*--------------------------------字符串处理----------------------------------*/
void MakeText(INT8U x,INT8U y,INT8U *ptr,INT8U fan)
{
	INT8U uLen,n;
	
	uLen=0;
    while ( *(ptr+uLen) >= 0x10 ){WDR();uLen++;};            					// 探测字串长度          
    n=0;
    while (n<uLen)
    {
		WDR();
		/*ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码*/
        if ( *(ptr+n) <= 128)                        							// ASCII
        {
			//if ( *(ptr+n) >= 0x10 )											// 换行符ASCII码
				MakeChar(x,y,ptr[n],fan);		
        }
        else     	  															// 中文
        { 
			if ((x>4)||((2*y)>16)){return;}
			DispBuf[x-1][2*y-1] = GetWordAddress(ptr+n);						// 查找汉字地址
			SignBuf[x-1][2*y-1] = fan;
			BoolBuf[x-1][y-1]   = SBCcase;										// 全角(汉字)
			n++;
		}
		n++;
		y++;
    } 
}
/*-----------------------------------图形显示处理-----------------------------*/
void DispBmp ( void )
{
   	INT8U i,j;
    
	for( i=0; i<PAGE; i++ )
	{
       	LCD_Write ( 1, 0x40 );     												// 初始行
	   	LCD_Write ( 1, 0xb0+i );
	   	LCD_Write ( 1, 0x10 );     												// 初始列
	   	LCD_Write ( 1, 0x00 );
		
	   	for ( j=0; j<COLUMN; j++ )
	   	{
			LCD_Write ( 0, FaceBmp[ 128 * i + j ] );
		}
	} 
}
/*-------------------------------显示数据转换---------------------------------*/
void HextoBcd ( INT16U count, INT8U zero )
{ 
  	INT8U i;
  
  	for ( i=0; i<5; i++ )
  	{
	  	Buf[i] = count % 10 + '0';
	  	count /= 10;
	}
	if(!zero)
	{
  		for ( i=4; i!=0; i-- ) 
  		{
	  		if ( Buf[i] == '0' ){Buf[i] = ' ';}
	  		else		  {break;}
		}
	}
} 
/*------------------------------------------------------------------------------
                                        0ooo
						      ooo0     (   ) 
                              (   )     ) /
						       \ (     (_/
	    				        \_) 
------------------------------------------------------------------------------*/

⌨️ 快捷键说明

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