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

📄 main.c

📁 使用LPC2131控制KM12864液晶显示屏实现绘图功能
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************************
Copyright (c) 2007 ESL of CCNU                   
--------------File Info-------------------------------------------------------------------------------
File name:			 lcd_display_driver.c
Last modified Date:  2007-07-16
Last Version:		 1.1
Descriptions:		 1.KM12232F的C51驱动程序 同时适用于KM12232H01/KM12864-12等
                       
                     2.工作于串行方式
                        
                     3.使用的是KM12864-12 V4.0显示板
------------------------------------------------------------------------------------------------------
Modified by:         lzz(炜烨兴电子有限公司)      
Modified date:       1899-12-30
Version:             1.0
Descriptions:        原始版本
------------------------------------------------------------------------------------------------------
Modified by:		 ILOVEMAGGIE
Modified date:		 2007-07-16
Version:			 1.1
Descriptions:		 针对飞利浦LPC2131的特点进行了相应的修改  
------------------------------------------------------------------------------------------------------
Modified by:		 ILOVEMAGGIE
Modified date:		 2008-09-4
Version:			 1.2
Descriptions:		 需要实现的功能包括:
                     1.在指定位置描点(实点,虚点,取反)
                     2.指定坐标到指点坐标之间画线(实线,虚线)  
********************************************************************************************************/
#include "config.h"   

/********************************************************************************************************/
#define LCD_HALF_CLOCK_CYCLE  5     //lcd显示时钟周期的一半大小  通过改变它用来控制 LCD_CLK 的周期大小
#define LCD_INIT_TIME         100   //lcd长延时,调整以保证lcd初始化完成40ms
#define LCD_READY_TIME        30    //lcd送完一帧数据后,留给lcd接收后一帧数据的需要的准备时间,调整以满足

									//使用串行方式,直接将LCD_PS引脚接GND
#define LCD_CS   (1<<20)          	//p0.20,可以直接接高电平
#define LCD_CLK  (1<<18)          	//p0.18
#define LCD_SID  (1<<19)           	//p0.19
#define LCD_RST  (1<<30)         	//p1.30


//uint16 display_ram[16][32] = {};//用于保存lcd显示内容的数组

/********************************************************************************************************
函数名称:void lcd_delay(uint32 n);
函数功能:lcd延时程序,通过参数n来控制,n越大延时越长
入口参数:无
出口参数:无
********************************************************************************************************/
void lcd_delay(uint32 n)
{
	uint32 i;	
	for ( ; n>0; n--)
		for (i=0; i<50; i++);
}

/********************************************************************************************************
函数名称:void lcd_write_cmd (uint8 mode,uint8 dat);
函数功能:写操作
入口参数:   1.
              mode    写命令 或 写数据 或 读状态 或 读数据
             对应参数    1        2         3         4
             
             2.dat
             具体的命令或数据
             
出口参数:无
********************************************************************************************************/
void lcd_write(uint8 mode, uint8 dat)
{
      uint8 i,tmpMode;
      unsigned int tmpInt = 0;
      
      if(mode==1)//针对不同的模式选定不同的首字节输入
      {
      	tmpMode=0xf8;     
      }      
      else if(mode==2)
      {
      	tmpMode=0xfa;
      }        
      else if(mode==3)
      {
      	tmpMode=0xfc;
      }      
      else if(mode==4)
      {
      	tmpMode=0xfe;
      }                  
      					//将送过来的dat转化为temInt
						//36位数据,最高8位无效,低24位按照时序要求进行组合
      tmpInt = tmpMode;
      tmpInt <<= 8;
      tmpInt |= (dat & 0xf0);
      tmpInt <<= 8;
      dat <<= 4;
      tmpInt |= (dat & 0xf0);
      
      
      PINSEL1=(PINSEL1&(~0x3f0))|0x00000000;		 //选中CLK,SID,CS为GPIO      
      
      IO0DIR=(IO0DIR | LCD_CLK | LCD_SID  | LCD_CS );//设定CLK,SID,CS为OUT口
   
      IO0SET= LCD_CS ;                               //拉高CS
      
      for (i=0;i<24;i++)
      {   
          if ((tmpInt & 0x800000)!=0)                //检查第24位是否为1
          {
			IO0SET |= LCD_SID;
          }          	
          else           
          {
          	IO0CLR |= LCD_SID ;          	         	
          }
          
          IO0CLR |= LCD_CLK;          
          lcd_delay(LCD_HALF_CLOCK_CYCLE);          
          IO0SET |= LCD_CLK;          
          lcd_delay(LCD_HALF_CLOCK_CYCLE);          
                    
          tmpInt = tmpInt << 1;
      }
      
      IO0CLR= LCD_CS ;                               //拉低CS 
                                                                
      IO0CLR=( IO0CLR | LCD_SID | LCD_CLK );         //同时拉低SID和CLK                   
       
      lcd_delay(LCD_READY_TIME);                     //延时操作
}

/********************************************************************************************************
函数名称:void lcd_reset(void);
函数功能:lcd复位程序   通过给LCD_RST发出低电平来实现复位操作
入口参数:无
出口参数:无
********************************************************************************************************/
/*void lcd_reset(void)
{
	  PINSEL1=(PINSEL1&(~0x30000000)|0x00000000);
	  
	  IO0DIR=LCD_RST;
	  IO0SET=LCD_RST;
	  
	  lcd_delay();
	  lcd_init();	  
}*/

/********************************************************************************************************
函数名称:void lcd_sleep_mode(uint8 mode)
函数功能:lcd睡眠程序  
入口参数:
               1.mode
               0x01  进入睡眠状态
               
               0x02  醒过来(脱离睡眠状态)
               
               2.需要在扩展指令模式下,才可发挥作用
出口参数:无
********************************************************************************************************/
/*void lcd_sleep_mode(uint8 mode)
{
      if(mode==0x01)
      {
      lcd_write(1,0x08);
      }
      else
      lcd_write(1,0x0c); 
}*/

/********************************************************************************************************
函数名称:void lcd_draw_switch(uint8 mode);
函数功能:lcd绘图功能切换开关
入口参数:mode   0---绘图功能关          1---绘图功能开
出口参数:无
********************************************************************************************************/
void lcd_draw_switch(uint8 mode)
{
	if(mode == 0)
	{ 
		lcd_write(1,0x34);
	}
	else
	{
		lcd_write(1,0x36);
	}		
}

/********************************************************************************************************
函数名称:void lcd_init(void);
函数功能:LCD初始化程序
入口参数:无
出口参数:无
********************************************************************************************************/
void lcd_init(void)
{
      /*LCD_PS = 0;*/    /* Serial Mode  此处直接接GND*/
      lcd_delay(LCD_INIT_TIME);//长延时>40ms
     /* lcd_write(1,0x01);       //1.清除显示设置:  清除显示屏幕
      lcd_write(1,0x30);       //6.功能设定设置:8位数据输入,使用基本指令集 
      lcd_write(1,0x02);       //2.地址归位设置:将DDRAM地址计数器调整为"00h",游标返回原点
      lcd_write(1,0x04);       //3.点设定设置:显示画面整体不移动,光标向右移动,DDRAM地址+1
      lcd_write(1,0x0c);       //4.显示状态设置 :LCD显示开,光标显示关,光标位置字符不反白
      lcd_write(1,0x01);       //1.清除显示设置:  清除显示屏幕
      */
      lcd_write(1,0x30);
      lcd_write(1,0x30);
      lcd_write(1,0x3c);
      lcd_write(1,0x38);
      lcd_write(1,0x01);
      lcd_write(1,0x34);//使用扩展指令集
      
}

/********************************************************************************************************
函数名称:   void lcd_display_str(uint8 hang,uint8 lie,uint8 *str)
函数功能:   LCD显示字符串程序
入口参数:    1.hang
             字符串想要显示的首地址的行
             
             2.lie
             字符串想要显示的首地址的列
             
             3.str
             要显示的字符串的地址
             
              注意:
             1.本程序不检查字符串的长度是否过长,在输入的时候需人工控制字符串的长度
               单排最长只能显示16个字符
             2.行总共4行,标号依次为1,2,3,4
               列总共8列,标号依次为1,2,3,4,5,6,7,8
             3.所以总计可以显示(16-2*lie)个字符               
出口参数:无
*******************************************************************************************************/
void lcd_display_str(uint8 hang,uint8 lie,uint8 str[])
{
      uint8 add_DDRAM;
      
      int i;
      
      switch(hang)                               //确定行的首地址
      {
	      case 1 :add_DDRAM=0x80;break;
	      
	      case 2 :add_DDRAM=0x90;break;
	      
	      case 3 :add_DDRAM=0x88;break;
	      
	      case 4 :add_DDRAM=0x98;break;
	      
	      default :add_DDRAM=0x99;
      }
      
      add_DDRAM|=(lie-0x01);                     //计算出开始写入的地址

      lcd_write(1,add_DDRAM);      
      
      for(i=0;str[i]!='\0';i++)
      {
      	lcd_write(2,str[i]);                     //显示单个字符
      }
}


//用于缓存显示数据的数组
uint16 display_ram[16][32] = {0};
//用于记录是否需要刷新显示单元数组的标示符,1表示需要刷新,0表示不需要
uint32 display_ram_update[16] = {0};
//按照这个显示缓存来显示这个图像来,准确的说是点阵
void display_all(void)
{
	int i,j;
	
	for(i=0;i<16;i++)
	{
		for(j=0;j<32;j++)

⌨️ 快捷键说明

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