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

📄 fm12864_dreiver_for_parallel.c

📁 12864液晶驱动程序
💻 C
字号:
/**********************************************************
 *	Copyright (C) 2007, 华中科技大学电工与电子科技创新中心*
 *	All Rights Reserved.                                  *
 *	                                                      *
 *	文件名:		FM12864_driver_for_Parallel.c             *
 *	文件描述:	128*64点阵式液晶驱动主文件                *
 *			                                              *
 *	当前版本:	3.1                                       *
 *	作者:		Zeng Kevin(huakekaiwen@163.com)           *
 *	完成日期:	2007年8月8日下午                          *
 *********************************************************/
#include<FM12864.h>
/***************************************
说明: 	LCD读函数,完成LCD读操作的物理时序
RS:		0 - 读出忙标志及地址计数器的状态
		1 - 从数据寄存器DR 读出指令
return:	读出的具体值
*****************************************/
unsigned char LcdRead(bit RS)
{
	unsigned char rt ;

	/* 1. 设置RS信号线 */
	Lcd_RS = RS ;
	/* 2. 设置RW信号线为读 */
	Lcd_RW = 1 ;
	/* 3. 释放Data口 */
	Data = 0xff ;
	/* 4. 设置LCD使能*/
    LCD_E=1;
    _nop_();
	/* 5. 通过Data端口读值 */
	rt = Data ;
	/* 6. 锁存 */
	LCD_E=0;

	return rt ;
}
/***************************************
说明: 	LCD写函数,完成LCD写操作的物理时序
value:	写的具体值
RS:		0 - 写指令到指令寄存器IR
		1 - 写指令到数据寄存器DR
*****************************************/	
void LcdWrite(unsigned char value , bit RS)
{
	/* 1. 设置RS信号线 */
	Lcd_RS = RS ;
	/* 2. 设置RW信号线为读 */
	Lcd_RW = 0 ;
	/* 3. 通过Data端口写值 */
	Data = value ;
	LCD_E=1;
	_nop_();
	_nop_();
	LCD_E=0;
}/***************************************
说明: 	LCD写指令
value:	写的具体值
***************************************/
void LcdWriteCmd(unsigned char value)
{
	/* 监测忙状态 */
		while( LcdRead(0)&0x80 ) ;
	LcdWrite(value , 0);
}
/***************************************
说明: 	LCD写数据
*****************************************/
void LcdWriteData(unsigned char value)
{
 	/* 监测忙状态 */
	while( LcdRead(0)&0x80 ) ;
	LcdWrite(value , 1);
}
/***************************************
说明: 	LCD读数据
*****************************************/
unsigned char LcdReadData()
{
	/* 监测忙状态 */
	while( LcdRead(0)&0x80 ) ;

	return LcdRead(1);
}
/***************************************
说明: 	超短延时,150us
*****************************************/
void Delay150us(void)
{
	unsigned int i = 150;
	while(i--);
}
/***************************************
说明: 	短延时, 5ms
*****************************************/
void Delay5Ms(void)
{
	unsigned int i = 5552;
	while(i--);
}

/***************************************
说明: 	可控延时 , (5*time)ms
*****************************************/
void Delay5_time_Ms(unsigned char time)
{
	unsigned char i;
    i=time;
	while(i--)
		Delay5Ms();
}
/***************************************
说明: 	LCD初始化函数,需要按照产品
        说明书完成
*****************************************/
void LcdInit(void)
{/*延时>40ms,此处延时50ms*/
  Delay5_time_Ms(10);
 /*功能设定,控制字 30H,即设定8位MCU并行接口,选择基本功能*/
  Function_1(); 
 /*延时>100us,此处延时150us*/
  Delay150us();
 /*功能设定,控制字 30H,即设定8位MCU并行接口,选择基本功能*/
  Function_1(); 
 /*延时>37us,此处延时150us*/
  Delay150us();
 /*显示开/关,控制字0CH,即,整体显示开*/ 
  Display_open(); 
 /*延时>100us,此处延时150us*/
  Delay150us();
 /*清除屏幕控制字01H*/
  Screen_clear();
 /*延时>10ms,此处延时15ms*/
  Delay5_time_Ms(3);
 /*进入设定点控制字06H,即指定在显示数据的读取与写入
  时,游标的移动方向右移,DDRAM 地址计数器(AC)加1*/
  Cursor_move_right();
}
/*******************************
说明:设定字符的输入位置(x,y)
*******************************/
void Locate_CH_XY(unchar x , unchar y)
{unchar adress;
 /*共4行,每行只能显示8个字符,故x<8,y<4*/
 /*只取x的低3位,高5位无效,屏蔽*/
  x%=0x8;
 /*只取y的低2位,屏蔽高6位*/
  y%=0x4;
 /*当y=0,2时,adress=80H+4*y+x*/
 /*当y=1,3时,adress=90H+4*(y-1)+x*/
  adress=x+4*y; 
  if(y%2)
   adress+=0x0c;
  adress|=0x80;
 /*写(x,y)的地址*/
  LcdWriteCmd(adress);
 }
/*******************************
说明:设定绘图的输入位置(x,y)
*******************************/
void Locate_Draw_XY(unchar x , unchar y)
{//选择扩展功能
  Function_2();
 //只取x的低3位,高5位无效,屏蔽
  x&=0x7;
 //Y方向有64个点,故Y<64
  y&=0x3F;
  if(y>31)
   {y=y-32;
    x=x+0x08;
    }
  x|=0x80; 
  y|=0x80;   
 //写Y的地址
  LcdWriteCmd(y);
 //写X的地址
  LcdWriteCmd(x);
 //选择基本功能
  Function_1();
 }
/*******************************
说明:画直角坐标系
   x:圆心横坐标
   y:圆心纵坐标
*******************************/
void Polt_coordinate_XY(unchar x , unchar y)
{unchar i;
 Clear_GDRAM();
 for(i=0;i<64;i++)
  {Locate_Draw_XY(x,i);
   LcdWriteData(0x80);
   LcdWriteData(0x00);
   }
 Locate_Draw_XY(0,y); 
 for(i=0;i<16;i++)
  LcdWriteData(0xFF);
 for(i=1;i<5;i++)
  {Locate_Draw_XY(7,y+i);
   LcdWriteData(0x00);
   LcdWriteData(1<<i);  
   Locate_Draw_XY(7,y-i);
   LcdWriteData(0x00);
   LcdWriteData(1<<i);  
   }
 for(i=1;i<5;i++)
  {Locate_Draw_XY(x-1,i);
   LcdWriteData(0x00);
   LcdWriteData(1<<(i-1));  
   Locate_Draw_XY(x,i);
   LcdWriteData(0x80|(0x80>>i));
   LcdWriteData(0x00);  
   }
 }
/***************************************
 说明: 图像RAM清零
/***************************************/
void Clear_GDRAM(void)
{unchar i,j;
 for(i=0;i<64;i++)
  {Locate_Draw_XY(0,i);
   for(j=0;j<16;j++)
    LcdWriteData(0x00);
   }
 }
   
/***************************************
 说明:  显示字符串
    x:  起始横 坐标
    y:  起始纵坐标
speed:  字符显示速度,推荐值为2
*****************************************/
void Put_Str(unchar x , unchar y , unchar* str,unchar speed)
{	unsigned char i,temp_x,temp_y;
    unint len=0;
    temp_x=2*x;
    temp_y=y;
	/* 计算字符串长度 */
	while (str[len]!='\0')
		len++;
	Locate_CH_XY(x,y);
	/* 显示字符串 */
	for (i=0;i<len;i++) 
     {if(temp_x>15)
       {temp_x=0;
        temp_y++;
        if(temp_y<4)
    	 Locate_CH_XY(0,temp_y);    
        else
         break;  
        }
	  LcdWriteData(str[i]);
      Delay5_time_Ms(speed);
      temp_x++;
      }
}

/********************************************
说明:  在全屏显示图片
*********************************************/
void Plot(unchar* str)
{unchar temp_x,temp_y;
 unint i=0;
   for(temp_y=0;temp_y<64;temp_y++)
   {Locate_Draw_XY(0,temp_y);
    for(temp_x=0;temp_x<16;temp_x++)
     {LcdWriteData(str[i]);
	  i++;
	  } 
    }
 }


	

⌨️ 快捷键说明

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