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

📄 lcd.c

📁 用GCC编写ATMEG128应用软件源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/***********************************************************/
/*														   */
/*文 件 名:lcd.c							               */
/*功    能:液晶终端机主系统文件                           */
/*当前版本:V1.0										   */
/*作    者:白广斌									       */
/*														   */
/*授    权:										       */
/*														   */
/*开始日期:2007.10.01								       */
/*完成日期:2007.10.01								       */
/*      	                                               */
/***********************************************************/
#include <avr/io.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <LCM.h>

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int

/*********************************************************/
//函数名称:FullScreenFill(x,x,x)
//函数功能:整屏幕写入数据函数
//输入参数:low、high、fill_data
//输出参数:无
//返 回 值:无
/********************************************************/
void FullScreenFill(uchar low,uchar high,uchar fill_data)
{
    uchar i,j;
    CmdWrite(0x46);    //光标显示位置设置
	DataWrite(low);
	DataWrite(high);
    CmdWrite(0x42);
	for(i=0;i<240;i++)
	for(j=0;j<40;j++)
	DataWrite(fill_data);
}

/******************************************************/
//函数名称:LcdRead(void)
//函数功能:读数据函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*****************************************************/
uchar LcdRead(void)
{
	uchar x;
	
	DDRC =0x00;//定义端口C为输入引脚
	PORTC=0x00;//上拉电阻有效
	
	_WR(1);                // init all control signal
    _RD(1);
    A0(0); 
	
    _CS(0);                // enable the access
    _RD(0);
    _RD(1);
	x=bit_is_set(PINC,PINC6);
    _CS(1);
	
	DDRC =0xff;//定义端口C为输出引脚
	PORTC=0xFF;//上拉电阻无效
	return(x);
}

/********************************************************/
//函数名称:DataWrite(unsigned char wrdata)
//函数功能:写命令函数
//输入参数:unsigned char wrdata
//输出参数:无
//返 回 值:无
/*******************************************************/
void CmdWrite(uchar cmdcode)
{
	_WR(1);                 // init all control signal
    _RD(1);
    A0(1);                  // for command
    LCDBUS = cmdcode;       //写入数据或参数
    _CS(0);                 // enable the access
    _WR(0);
    _WR(1);
    _CS(1);
}

/******************************************************/
//函数名称:DataWrite(unsigned char wrdata)
//函数功能:写数据或参数函数
//输入参数:unsigned char wrdata
//输出参数:无
//返 回 值:无
/*****************************************************/
void DataWrite(uchar wrdata)
{
	while(!(LcdRead()==0));/*消除雪花显现*/
	
	_WR(1);                // init all control signal
    _RD(1);
    A0(0); 
    LCDBUS = wrdata;
    _CS(0);                // enable the access
    _WR(0);
    _WR(1);
    _CS(1);
}

/****************************************************/
//函数名称: LCD_Initial()
//函数功能:显示系统初始化函数
//输入参数:无
//输出参数:无
//返 回 值:无
/***************************************************/
void LCD_Initial(void)
{
    LCD_RES(0);
	_delay_ms(5);
    LCD_RES(1);
    _delay_ms(5);

	CmdWrite(0x40);                   //系统设置
	DataWrite(0x30);                  //P1参数:单屏幕,CGROM+CGRAM1+CGRAM2
	DataWrite(0x87);                  //P2参数:8点列
	DataWrite(0x07);                  //P3参数:8点行
	DataWrite(0x27);                  //P4参数:显示窗口宽度为40
	DataWrite(0x42);                  //P5参数:TC/R>=C/R+4
	DataWrite(0xEF);                  //P6参数:240行扫描
	DataWrite(0x28);                  //P7参数:APL  显示一行占用40字节,即0x0028
	DataWrite(0x00);                  //P8参数:APH

	CmdWrite(0x44);                   //显示区域设置
	DataWrite(0x00);                  //显示一区首地址为0000H
	DataWrite(0x00);                  //
	DataWrite(0xef);                  //显示一区扫描行数为120行
	DataWrite(0x00);                  //显示二区首地址为2800H
	DataWrite(0x28);                  //
	DataWrite(0xef);                  //显示二区的扫描行数为240行
	DataWrite(0x00);                  //显示三区首地址为5000H
	DataWrite(0x50);                  //
    
	CmdWrite(0x58);                   //显示状态设置,显示总开关关闭
	DataWrite(0x54);                  //打开各区显示和光标

	CmdWrite(0x4c);                   //设置光标移动方向,自动右移

	CmdWrite(0x5b);                   //合成方式设置
	DataWrite(0x1c);                  //两重合成显示,一、三区为文本,三个区"或"关系

	CmdWrite(0x5c);                   //CGRAM的起始地址为7800H
	DataWrite(0x00);                  //
	DataWrite(0x78);                  //

	CmdWrite(0x5d);                   //光标形状设置
	DataWrite(0x07);                  //
	DataWrite(0x07);                  //

    ClearScreen();     //清屏
 
	CmdWrite(0x59);                   //打开显示总开关
}

/******************************************************/
//函数名称:ClearScreen(void)
//函数功能:清屏函数
//输入参数:无
//返 回 值:无
/*****************************************************/
void ClearScreen(void)
{
	FullScreenFill(0x00,0x00,0x00);   //清显示三区
	FullScreenFill(0x00,0x28,0x00);   //清显示二区
 	FullScreenFill(0x00,0x50,0x00);   //清显示三区
}

/****************************************************************************************/
//函数名称:LCM_Screen_str(uchar low,uchar high,const prog_char *pstr,uchar Layer,uchar fs)
//函数功能:16X8点阵字符串输出到屏幕指定位置显示
//输入参数:low            行地址
//输入参数:high	       列地址
//输入参数:*pstr          字符串
//输入参数:Layer		   显示区(Layer=2时在3区,否则在1区)
//输入参数:fs		       显示方式(0,反显,否则正常显示)
//返 回 值:无
/****************************************************************************************/
void LCM_Screen_str(uchar low,uchar high,const prog_char *pstr,uchar Layer,uchar fs)
{
    uchar i,Temp;
	const prog_char  *STR_p;
	uint CN=0;
	uint Screen_Addr;    //屏幕地址
	if(Layer==2)
	{
		Screen_Addr=low*40+high+0x5000; //3区
	}
	else
	{
		Screen_Addr=low*40+high+0x2800; //1区
	}
	CN=high;
	low=(uchar)(Screen_Addr);
	high=(uchar)(Screen_Addr>>8);
	CmdWrite(0x4f);              //设置光标自动下移
	while(*pstr)                 //指针内容非空
	{
	     CmdWrite(0x46);    //光标显示位置设置
	     DataWrite(low++);
	     DataWrite(high);
         CmdWrite(0x42);
		 STR_p=&ASCII_16X8[0]; //取16x8 ASCII码点阵库地址
		 for(i=0;i<(*pstr-32);i++){STR_p+=16;}
	     for(i=0;i<16;i++)
	     {
	        Temp=pgm_read_byte(STR_p);
			if(fs==0)	   //当fs=0时反显,否则正常显示
	        {
			   DataWrite(~Temp);	//反显
			}
			else
			{
			   DataWrite(Temp);
			}
			STR_p++;
	     }
		 pstr++;
		 CN++;
		 if(CN>39){break;}
	}
	CmdWrite(0x4c);    //恢复光标自动移动方向
}

/****************************************************************************/
//函数名称:LCM_Screen_HZ(uchar Row,uchar Col,uchar bm,uchar Layer,uchar fs)
//函数功能:将16x16点阵汉字输出到屏幕指定位置显示
//输入参数:low       行地址
//输入参数:Col	     列地址
//输入参数:bm        汉字编码
//输入参数:Layer	 显示区(Layer=2时在3区,否则在1区)
//输入参数:fs		 显示方式(0,反显,否则正常显示)
//返 回 值:无
/****************************************************************************/
void LCM_Screen_HZ(uchar Row,uchar Col,uchar bm,uchar Layer,uchar fs)
{
    uchar i,j,low,high,Temp;
	const prog_char  *STR_p;
	uint Screen_Addr;    //屏幕地址
	STR_p=&HZ_16X16[bm*32]; //取16x16 中文点阵库地址
	CmdWrite(0x4c);    //设置光标自动右移
    for(j=0;j<16;j++)
	{
	    if(Layer==2)
		{
		   Screen_Addr=Row*40+Col+0x5000; //3区
		}
		else
		{
		   Screen_Addr=Row*40+Col+0x2800; //1区
		}
	    low=(uchar)(Screen_Addr);
	    high=(uchar)(Screen_Addr>>8);
	    CmdWrite(0x46);    //光标显示位置设置
	    DataWrite(low);
 	    DataWrite(high);
	    CmdWrite(0x42);
	    for(i=0;i<2;i++)
	    {
			Temp=pgm_read_byte(STR_p);
			if(fs==0)	   //当fs=0时反显,否则正常显示
	        {
			   DataWrite(~Temp);	//反显
			}
			else
			{
			   DataWrite(Temp);
			}
			STR_p++;
	    }
	    Row++;
	}
}

/********************************************************************************/
//函数名称:LCM_Screen_RAMstr(uchar Row,uchar Col,uchar *pstr,uchar Layer,uchar fs)
//函数功能:将动态(内存中)字符串输出到屏幕指定位置显示
//输入参数:low       行地址
//输入参数:Col       列地址
//输入参数:*pstr     字符串
//输入参数:Layer	 显示区(Layer=2时在3区,否则在1区)
//输入参数:fs		 显示方式(0,反显,否则正常显示)
//返 回 值:无
/********************************************************************************/
void LCM_Screen_RAMstr(uchar Row,uchar Col,uchar *pstr,uchar Layer,uchar fs)
{
    uchar i,Temp;
	const prog_char *STR_p;
	uint CN=0;
	uint Screen_Addr;    //屏幕地址
	if(Layer==2)
	{
		Screen_Addr=((Row*40)+Col+0x5000); //3区
	}
	else
	{
		Screen_Addr=((Row*40)+Col+0x2800); //1区
	}
	Row=(uchar)(Screen_Addr);
	Col=(uchar)(Screen_Addr>>8);
	CmdWrite(0x4f);    //设置光标自动下移
	while(*pstr)       //指针内容非空
	{
	     CmdWrite(0x46);    //光标显示位置设置
	     DataWrite(Row++);
	     DataWrite(Col);
         CmdWrite(0x42);
		 STR_p=&ASCII_16X8[0]; //取16x8 ASCII码点阵库地址
		 for(i=0;i<(*pstr-32);i++)
		 {
			STR_p+=16;
		 }
	     for(i=0;i<16;i++)
	     {
		    Temp=pgm_read_byte(STR_p);
			if(fs==0)	   //当fs=0时反显,否则正常显示
	        {
			   DataWrite(~Temp);	//反显
			}
			else
			{
			   DataWrite(Temp);
			}
			STR_p++;
	     }
		 pstr++;
		 CN++;
		 if(CN>39){break;}
	}
	CmdWrite(0x4c);    //恢复光标自动移动方向
}

/*************************************************************************************************/
//函数名称:LCM_BigStrDisplay(uchar Row,uchar Col,uchar Layer,uchar Number)
//函数功能:数值输出到屏幕指定位置显示
//输入参数:low            行地址
//输入参数:high	       列地址
//输入参数:Layer		   显示区(Layer=2时在3区,否则在1区)
//输入参数:Number		   显示的数值
//返 回 值:无
/*************************************************************************************************/
void LCM_NumberDisplay(uchar Row,uchar Col,uchar Layer,uchar Number,uchar fs)
{
    switch (Number)
	{
	    case 0:
		{
		    LCM_Screen_str(Row,Col,"0",Layer,fs);
			break;
		}
		case 1:
		{
		    LCM_Screen_str(Row,Col,"1",Layer,fs);
			break;
		}
		case 2:
		{
		    LCM_Screen_str(Row,Col,"2",Layer,fs);
			break;
		}
		case 3:
		{
		    LCM_Screen_str(Row,Col,"3",Layer,fs);
			break;
		}
		case 4:
		{
		    LCM_Screen_str(Row,Col,"4",Layer,fs);
			break;
		}
		case 5:
		{
		    LCM_Screen_str(Row,Col,"5",Layer,fs);
			break;
		}
		case 6:
		{
		    LCM_Screen_str(Row,Col,"6",Layer,fs);
			break;
		}
		case 7:
		{
		    LCM_Screen_str(Row,Col,"7",Layer,fs);
			break;
		}
		case 8:
		{
		    LCM_Screen_str(Row,Col,"8",Layer,fs);
			break;
		}
		case 9:
		{
		    LCM_Screen_str(Row,Col,"9",Layer,fs);
			break;
		}
		default:
		{
			LCM_Screen_str(Row,Col," ",Layer,fs);
			break;
		}
	}
}

/****************************************************************/
//函数名称:On_Pic(void)
//函数功能:公司名头显示函数
//输出参数:无
//返 回 值:无
/****************************************************************/
void GS_NameDisplay(uchar Row,uchar Col,uchar Layer,uchar fs)
{
    LCM_Screen_HZ(Row,Col,0,Layer,fs);       //盘锦利方石油科技有限公司
    LCM_Screen_HZ(Row,(Col+2),1,Layer,fs); 
	LCM_Screen_HZ(Row,(Col+4),2,Layer,fs); 
	LCM_Screen_HZ(Row,(Col+6),3,Layer,fs); 	LCM_Screen_HZ(Row,(Col+8),4,Layer,fs); 
	LCM_Screen_HZ(Row,(Col+10),5,Layer,fs); 
	LCM_Screen_HZ(Row,(Col+12),6,Layer,fs); 
	LCM_Screen_HZ(Row,(Col+14),7,Layer,fs); 

⌨️ 快捷键说明

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