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

📄 yj1602._c

📁 AVR单片机开发版资料测试程序里的源程序
💻 _C
字号:
/*******************************************
  文件:YJ1602.C
  环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
  硬件:ATMEGA16芯片
  日期:2006年12月10日 
  功能:驱动开发板上的1602液晶
  备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
/******************************************/
#include <iom16v.h>			//包含型号头文件
#include <macros.h>			//包含"位"操作头文件
#include <stdio.h>			//标准输入输出头文件
#include <AVR_PQ1A.h>		//包含自定义常量头文件

#pragma data:code			//在程序区定义以下常量数组
const uchar CGRAM[LCDa_CGMAX] =
{
	//8*5字模
	0x00,0x01,0x1F,0x11,0x1F,0x01,0x01,0x01,		// 第1、2行显示"中"字
	0x00,0x00,0x1E,0x02,0x1E,0x00,0x00,0x00,		
	0x00,0x01,0x1F,0x04,0x02,0x01,0x02,0x04,		// 第3、4行显示"文"字
	0x00,0x00,0x1f,0x04,0x08,0x10,0x08,0x04,		
	0x00,0x0E,0x11,0x10,0x08,0x04,0x02,0x01,		// 第5、6行显示心型
	0x00,0x0E,0x11,0x01,0x02,0x04,0x08,0x10,		
	0x00,0x0E,0x11,0x10,0x08,0x04,0x02,0x01,		// 第7、8行显示心型
	0x00,0x0E,0x11,0x01,0x02,0x04,0x08,0x10,		
};
#pragma data:data			//在数据区定义以下变量和常量
/*******************************************
函数名称: LCD1602_portini
功    能: 初始化1602液晶用到的IO口
参    数: 无
返回值  : 无
/********************************************/
void LCD1602_portini(void)
{
	LCDa_CTRL_DDR |= BIT(LCDa_RS)|BIT(LCDa_RW)|BIT(LCDa_E);//配置控制管脚为输出
	LCDa_DATA_DDR |= 0xFF;//配置数据管脚为输出
}
/*******************************************
函数名称: LCD1602_readbyte
功    能: 从1602液晶读出一个字节数据或者指令
参    数: DatCmd--为iDat时是数据,为iCmd时是指令
返回值  : dByte--读回的数据或者指令
/********************************************/
uchar LCD1602_readbyte(uchar DatCmd)
{
 	uchar dByte;
	if (DatCmd == iCmd)		 //指令操作
		LCDa_CLR_RS;
	else
		LCDa_SET_RS;
		
	LCDa_SET_RW;	   	  	 //读操作
	LCDa_SET_E;
	LCDa_DATA_DDR=0x00;	 	 //数据总线定义为输入
	dByte=LCDa_DI;			 //读数据或者指令
	Delayms(1);				 //时序调整
	LCDa_CLR_E;	
	LCDa_DATA_DDR|=0xff;	 //数据总线还原为输出
	return dByte;
}
/*******************************************
函数名称: LCD1602_sendbyte
功    能: 向1602液晶写入一个字节数据或者指令
参    数: DatCmd--为iDat时是数据,为iCmd时是指令
	  	  dByte--为写入1602的数据或者指令
返回值  : 无
/********************************************/
void LCD1602_sendbyte(uchar DatCmd, uchar dByte)
{
	if (DatCmd == iCmd)		//指令操作
		LCDa_CLR_RS;
	else
		LCDa_SET_RS;		//数据操作
		
	LCDa_CLR_RW;			//写操作操作
	LCDa_SET_E;
	LCDa_DO = dByte;		//写入数据
	Delayms(1);
	LCDa_CLR_E;	
}
/*******************************************
函数名称: LCD1602_sendstr
功    能: 向1602液晶写入一个字符串
参    数: ptString--字符串指针
返回值  : 无
/********************************************/
void LCD1602_sendstr(uchar *ptString)
{
	while((*ptString)!='\0')		 //字符串未结束就一直写
	{
		LCD1602_sendbyte(iDat, *ptString++);
	}
}
/*******************************************
函数名称: LCD1602_clear
功    能: 1602液晶清屏
参    数: 无
返回值  : 无
/********************************************/
void LCD1602_clear(void)
{
	LCD1602_sendbyte(iCmd,LCDa_CLS);//写入清屏指令
	Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!
}
/*******************************************
函数名称: LCD1602_readBF
功    能: 1602液晶清屏
参    数: 无
返回值  : busy--为1时是忙状态,为0时可以接收指令
/********************************************/
uchar LCD1602_readBF(void)
{	  
	uchar busy;
	busy=LCD1602_readbyte(iCmd);		//读回BF标志(忙标志)和地址
	if(busy&0x80)						//如果忙返回正在忙的状态
		busy=1;
	else	   							//如果不忙,可以写入
		busy=0;
	return busy;
}
/*******************************************
函数名称: LCD1602_gotoXY
功    能: 移动到指定位置
参    数: Row--指定的行
	  	  Col--指定的列
返回值  : 无
/********************************************/
void LCD1602_gotoXY(uchar Row, uchar Col)
{	
	switch (Row)		  //选择行
	{
		case 2:
			LCD1602_sendbyte(iCmd, LCDa_L2 + Col); break;	//写入第2行的指定列	
		default:
			LCD1602_sendbyte(iCmd, LCDa_L1 + Col); break;	//写入第1行的指定列	
	}
}
/*******************************************
函数名称: LCD1602_initial
功    能: 1602液晶初始化
参    数: 无
返回值  : 无
/********************************************/
void LCD1602_initial(void)
{
	Delayms(100);				//上电后等待内部复位
	LCD1602_portini();			//端口初始化
	
	LCD1602_sendbyte(iCmd, LCDa_FUNCTION);	//功能、模式设定,具体的设定功能可以看C:\icc\include\AVR_PQ1A.H里面的常量定义
	while(LCD1602_readBF());				//等待不忙为止
	LCD1602_sendbyte(iCmd, LCDa_ON);		//打开显示
	while(LCD1602_readBF());				//等待不忙为止
	LCD1602_clear();						//清屏
	while(LCD1602_readBF());				//等待不忙为止
	LCD1602_sendbyte(iCmd, LCDa_ENTRY);	// 输入模式设定		
}
/*******************************************
函数名称: LCD1602_wrCGRAM
功    能: 向CGRAM写入数据
参    数: ptCGRAM--CGRAM数据指针
返回值  : 无
/********************************************/
void LCD1602_wrCGRAM(const uchar *ptCGRAM)
{
	uchar i;
	LCD1602_sendbyte(iCmd, LCDa_CGRAM_ADDR);  //写入CGRAM首地址
	for (i = 0; i < LCDa_CGMAX; i++)		  //写入64个字节的CGRAM内容
	{
		LCD1602_sendbyte(iDat,ptCGRAM[i]);
	}
}
/*******************************************
函数名称: LCD1602_disCGRAM
功    能: 显示CGRAM内容,将64个字节写在两行,每行32个字节
参    数: 无
返回值  : 无
/********************************************/
void LCD1602_disCGRAM(void)
{
	uchar i;
	LCD1602_gotoXY(1,6);   //从第1行第6列开始显示
	for (i = 0;i <4;i++)   //显示前32个字节的内容
	{	 	
		LCD1602_sendbyte(iDat, i);		
	}
	LCD1602_gotoXY(2,6);   //从第2行第6列开始显示
	for (i = 4;i <8;i++)   //显示后32个字节的内容
	{	 	
		LCD1602_sendbyte(iDat,i);		
	}
}
/*******************************************
函数名称: main
功    能: 1602液晶驱动主程序
参    数: 无
返回值  : 无
/********************************************/
void main(void)
{
 uchar i;
 Board_init( );
 LCD1602_initial(); 
 while(1)
 {		 //滚动显示CGROM的字符
  while(LCD1602_readBF());
  LCD1602_gotoXY(1,17);
  LCD1602_sendstr("AVR_PQ1A BOARD");	
  while(LCD1602_readBF());
  LCD1602_gotoXY(2,18);
  LCD1602_sendstr("13212800564");	
  for(i=0;i<30;i++)
  {
   LCD1602_sendbyte(iCmd, LCDa_D2L);
   Delayms(500);
  }
  LCD1602_clear();
  		 //静止显示CGRAM的内容
  LCD1602_wrCGRAM(CGRAM);
  Delayms(90);
  LCD1602_disCGRAM();
  Delayms(2000);
  LCD1602_clear();
 }
}

⌨️ 快捷键说明

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