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

📄 dayin.txt

📁 用于12864液晶显示的驱动程序
💻 TXT
字号:
/****************************************
** 文 件 名: delay.c				   **
** 日    期: 2007年12月28日			   **
** 描    述: 延时函数				   **
** 作    者:tonghe					   **
** 版	 本: V16.01.01				   **
** 主控芯片:M16 					   **
** 时钟频率:1MHZ 内部	   			   **
****************************************/
#include <iom16v.h>
#include <macros.h>
//数据类型的定义
#define  	uchar	unsigned char															 
#define 	uint	unsigned int

/****************************************
*  函数名称: void delay_us(uchar i)		*
*  函数功能:延时函数			 		*
*  晶振频率:1MHZ,误差较大				*
****************************************/
void delay_us(uint i)
	{
	while(i--)
	 	{
		NOP();
		}
	}
	 
/****************************************
*  函数名称: void delay_ms(uint i)		*
*  函数功能:延时函数			 		*
*  晶振频率:1MHZ						*
*  入口参数:i mS						*
****************************************/
void delay_ms(uint i)
	{
	uint a;
	for(;i;i--)
		{
		for(a=(1*143-2);a;a--)
			{;}
		}
	}



/********************************************
*		飞宇达12864汉字液晶驱动程序			*
* 文 件 名:FYD_12864_B_4.c					*
* 设 计 者:yonghe							*
* 建立日期:2007年12月28日					*
* 版    本:V16.01							*
* 修改日期:2007年12月28日					*
* 主控芯片:Mega16							*
* 时钟频率:1 MHZ 内部						*
* 联接方式:串行数据线联接					*
* 硬件环境:本站M16学习板					*
* 联接关系:LCD12864		M16				*
*			RESET _________ M16:PD7			*
*			PSB ___________ M16:PD6			*
*			CLK ___________ M16:PD4			*
*			SID ___________ M16:PD3			*
*			CS ____________ M16:PC6			*
********************************************/
#include <iom16v.h>
#include <macros.h>
#include "delay.h"

//宏定义:定义各种操作的管脚
//使用前应由主程序配置其输入、输出
//LCD控制端口
#define lcd_kz PORTD
//串行时钟端:PD4输出
#define clk 4
#define set_lcd_clk lcd_kz |= (1<<clk)	 //置高
#define clr_lcd_clk lcd_kz &= (~(1<<clk))//清0

//片选控制端CS操作:PC6输出
#define cs 6
#define set_lcd_cs PORTC |= (1<<cs)	  	  //置高
#define clr_lcd_cs PORTC &= (~(1<<cs))	  //清0

//串行数据输入端SID操作:PD3输出
#define sid 3
#define clr_lcd_sid lcd_kz &= (~(1<<sid)) //清0
#define set_lcd_sid lcd_kz |= (1<<sid)    //置位

//8/4位选择控制PSB操作:PD6输出
#define psb 6
#define clr_lcd_psb lcd_kz &= (~(1<<psb)) //清0:4位
#define set_lcd_psb lcd_kz |= (1<<psb)	  //置位:8位

//复位端RST操作:PD7输出
#define rst 7
#define clr_lcd_rst lcd_kz &= (~(1<<rst)) //清0
#define set_lcd_rst lcd_kz |= (1<<rst)	  //置位

//背光控制端:PC7
#define led_on  PORTC &= ~(1<<7)		  //开背光
#define led_off PORTC |= 1<<7			  //关背光

//宏定义:定义无符号数据的简写
#define uchar unsigned char
#define uint unsigned int
		  
/************************************
*		模拟串口专用延时函数		*
************************************/
void delay(void)
	{
	NOP();
	NOP();
	}

/*****************************************
*		写指定位数到12864的函数			 *
* 入口参数:n写入位数,data写入数据		 *
* 说    明:将data的高n位写入			 *
*****************************************/
void wr_bit(uchar n,uchar data)
	{
	for(;n;n--)	  		  	   	//写入位数
		{
		if(data&0x80)				//判断应写入1或0
			{set_lcd_sid;}
		else
			{clr_lcd_sid;}
		data=data<<1;	  			//左移一位,准备写入下一位
		delay();
		set_lcd_clk;				//产生上升沿,写入
		delay();
		clr_lcd_clk;
		}
	}

/*****************************************
*        写指令或数据到12864函数		 *
*入口参数:a=1写显示数据,a=0写指令数据	 *
*		   b需写入的数据	  		   	 *
*时    序:按手册时序进行				 *
*****************************************/
void wr_12864(uchar a,uchar b)
	{
	clr_lcd_clk;

	wr_bit(5,0xFF);			  		//写入五个1

	wr_bit(1,0x00);	 				//写入R/W=0,写入数据
	
	if(a==0)	 					//根据a值写入RS值
		wr_bit(1,0x00);				//如果a为1,写指令(RS=0)
	else
		wr_bit(1,0x80);				//如果a不为1,写数据(RS=1)

	wr_bit(1,0x00);	 				//写入一个0
	
	wr_bit(4,b);					//写入数据的高4位
	
	wr_bit(4,0x00);					//写入4个0
	
	wr_bit(4,(b<<4));				//写入数据的低4位
	
	wr_bit(4,0x00);					//写入4个0

	set_lcd_sid;					//非数据传送状态数据端置高
	}

/*****************************************
*          LCD12864初始化函数			 *
*****************************************/
void lcd12864_init(void)
	{
	clr_lcd_psb;				//串行工作方式
	delay_ms(50);
	
	led_on;		 				//开背光

	clr_lcd_rst; 				//复位
	delay_ms(100);
	set_lcd_rst;
	delay_ms(200);
	
	set_lcd_cs;				  	//片选高电平有效
	
	wr_12864(0,0x30);			//设置数据方式:8位
	delay_us(200);
	wr_12864(0,0x30);			//设置数据方式:8位
	delay_us(80);
	wr_12864(0,0x0C);			//开显示
	delay_us(80);
	wr_12864(0,0x40);			//开显示
	delay_us(200);
	wr_12864(0,0x01);			//清屏
	delay_ms(200);
	}
   
/************************************
*	LCD12864显示字符串函数			*
************************************/
//入口:待显示的字符串
void lcd(char *s)
    {
	while(*s)
	    {
		wr_12864(1,*s);
		s++;
		}
	}	

/************************************
*		LCD12864显示定位函数		*
* 入    口:h定位的行数,V列数		*
************************************/
void locate(uchar h,uchar v)
	{
	switch(h)
		{
		case 1:
			wr_12864(0,(0x80+v-1));	//写第一行V列地址
			break;
		case 2:
			wr_12864(0,(0x90+v-1));	//写第二行V列地址
			break;
		case 3:
			wr_12864(0,(0x88+v-1));	//写第三行V列地址
			break;
		case 4:
			wr_12864(0,(0x98+v-1));	//写第四行V列地址
			break;
		default:break;
		}
	}
	
/************************************
*		LCD12864显示清屏函数		*
************************************/
void cls(void)
	{
	delay_us(200);
	wr_12864(0,0x01);			//清屏
	delay_ms(20);
	}

/********************************
*		显示公司广告语函数		*
********************************/
void guanggao(void)
	{
	locate(1,3);
	lcd("欢迎光临");
	locate(2,1);
	lcd(" AVR开发讨论网!");
	locate(3,1);
	lcd(" www.iccavr.com");
	locate(4,1);
	lcd("深圳市龙岗区坂田");
	}




/****************************************
** 汉字液晶FYD12864在M16学习板上的程序 **
** 文 件 名: main.c				       **
** 日    期: 2007年12月28日			   **
** 描    述: 主函数			   		   **
** 作    者:tonghe					   **
** 版	 本: V16.01			   		   **
** 修改日期: 2007年12月28日			   **
** 主控芯片:M16 					   **
** 时钟频率:1MHZ内部	   		   	   **
** 其    它:插上PA、PB、PC、PD全部跳  **
** 		 	 线,液晶VO线不接,从液晶  **
**			 的3脚到18脚间接一10K可调  **
**			 电阻调节液晶对比度		   **
****************************************/
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#include "FYD_12864_B_4.h"

//数据类型的定义
#define  	uchar	unsigned char															 
#define 	uint	unsigned int

/********************************
*      器件端口初始化函数		*
********************************/
void port_init(void)
    {
	PORTA = 0xFF;
	DDRA  = 0x00;
	PORTB = 0x00;
	DDRB  = 0xFF;
	PORTC = 0x00;
	DDRC  = 0xFF;
	PORTD = 0x20;				 //PD5为高电平:蜂鸣器不导通
	DDRD  = 0xFF;
	}

/******************************
*           主函数			  *
******************************/
void main(void)
	{
	port_init();			   //端口定义
	
	delay_ms(50);
	lcd12864_init();		   //液晶初始化
	delay_ms(50);

	guanggao();	 			   //显示欢迎内容
	
	delay_ms(3000);			   //显示时间5秒

	cls();					   //清屏
	delay_ms(20);
	
	locate(1,1); 			   //定位于第一行第一列
	lcd(" FYD12864-0402B");
	
	locate(2,2); 			   //定位于第二行第二列
	lcd("汉字液晶测试");
	
	while(1)
	    {
		locate(3,1); 			   //定位于第三行第一列
		lcd("这里显示的是汉字");
	
		locate(4,2); 			   //定位于第四行第三列
		lcd("  欢迎试用!");
		
		delay_ms(2000);
		
		locate(3,1); 			   //定位于第三行第一列
		lcd("  作者:铜  河  ");
	
		locate(4,2); 			   //定位于第四行第二列
		lcd(" AVR开发网  ");
		
		delay_ms(2000);
		}
	}


接下来是头文件:::
/*****************************************
*        写一字节数据到12864函数		 *
*入口参数:a=1写显示数据,a=0写指令数据	 *
*		   b需写入的数据	  		   	 *
*****************************************/
void wr_12864(unsigned char a,unsigned char b);

/*****************************************
*          LCD12864初始化函数			 *
*****************************************/
void lcd12864_init(void);

/************************************
*	LCD12864显示字符串函数			*
************************************/
//入口:待显示的字符串
void lcd(char *s);

/************************************
*		LCD12864显示定位函数		*
* 入    口:h定位的行数,V列数		*
************************************/
void locate(unsigned char h,unsigned char v);

/************************************
*		LCD12864显示清屏函数		*
************************************/
void cls(void);

/********************************
*		显示广告语函数			*
********************************/
void guanggao(void);






/****************************************
*  函数名称: void delay_us(uchar i)		*
*  函数功能:延时函数			 		*
*  晶振频率:7.3728MHZ					*
****************************************/
void delay_us(unsigned int i);

/****************************************
*  函数名称: void delay_ms(uint i)		*
*  函数功能:延时函数			 		*
*  晶振频率:7.3728MHZ					*
*  实际延时:i mS						*
****************************************/
void delay_ms(unsigned int i);

⌨️ 快捷键说明

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