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

📄 lcd.c

📁 lpc2103+18b20+12864显示
💻 C
字号:
#include "config.h"
#include <math.h>

#define Z_bit 2                       //子函Disp_anynum中整数位最多为4位
#define F_bit 2                        //子函Disp_anynum中小数位最多为2位,即精度为3位
#define weishu 4                      //子函Disp_anynum中最大位数=Z_bit+F_bit=3+3=6

#define      CS      1<<8
#define      SID     1<<10
#define      SCLK    1<<13



/******************************************************************************/
void Delaynms(uint32 di) //延时
{
 uint16 da,db;
  for(da=0;da<di;da++)
     for(db=0;db<100;db++);
}


void Delay(uint32 di) //延时
{
 uint16 da,db;
  for(da=0;da<di;da++)
     for(db=0;db<50000;db++);
}


/******************************************************************************/
void Send_byte(uint8 bbyte) //发送一个字节
{
  uint8 i;
  PINSEL0=0x00000000;
  PINSEL1=0x00000000;
  IO0DIR=CS|SID|SCLK;
 
  for(i=0;i<8;i++)
    {
     if(bbyte&0x80)
       IO0SET=SID;
     else
       IO0CLR=SID;    
     IO0SET=SCLK;
     IO0CLR=SCLK;
     bbyte<<=1; //左移
    }  
}




/******************************************************************************/
void Write_char(uint8 start, uint8 ddata) //写指令或数据
{
 uint8 start_data,Hdata,Ldata;
   if(start==0) 
  start_data=0xf8;  //写指令
    else    
     start_data=0xfa;  //写数据
  
   Hdata=ddata&0xf0;    //取高四位
   Ldata=(ddata<<4)&0xf0;  //取低四位
   Send_byte(start_data);   //发送起始信号
   Delaynms(10); //延时是必须的
   Send_byte(Hdata);       //发送高四位
   Delaynms(5);  //延时是必须的
   Send_byte(Ldata);    //发送低四位
   Delaynms(5);  //延时是必须的
}





/******************************************************************************/
void Lcd_init(void) //初始化LCD 
{
   Delaynms(50); //启动等待,等LCM讲入工作状态
//  PSB=0; ;     //串口驱动模式
//  RST=0; Delaynms(1); RST=1; // 复位LCD
   IO0SET=CS;
   Write_char(0,0x30);  //8 位介面,基本指令集
   Write_char(0,0x0c);  //显示打开,光标关,反白关
   Write_char(0,0x01);  //清屏,将DDRAM的地址计数器归零  
}




/******************************************************************************/
void Disp_img(uint8  *img) //图形显示     字模221 横向取膜
{ 
 uint8 i,j;
 uint8 k =0 ;
 for(i=0;i<32;i++)
   { 
  Write_char(0,0x80+i);
  Write_char(0,0x80);
     for(j=0;j<16;j++) 
  {
   Write_char(1,img[k++]);
  }
   }

  for(i=0;i<32;i++)
   { 
  Write_char(0,0x80+i);
  Write_char(0,0x88);
     for(j=0;j<16;j++) 
  {
   Write_char(1,img[k++]);
    }
 }
}



/****************************************************************************/
void Lcd_img_Cls(void)  //图形方式下清屏
{ 
 uint8 i,j;
 for(i=0;i<32;i++)
   { 
  Write_char(0,0x80+i);
  Write_char(0,0x80);
     for(j=0;j<16;j++) 
   Write_char(1,0x00);///for test
   }

  for(i=0;i<32;i++)//
   {
     Write_char(0,0x80+i);
     Write_char(0,0x88);
     for(j=0;j<16;j++) 
       Write_char(1,0x00);
   }
}



/*-----------------------------------------------------------------------
LCD_set_xy        : 设置LCD显示的起始位置,X为行,Y为列

输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
                    LCD第一行显示寄存器地址:0X80-0X8F
                    LCD第一行显示寄存器地址:0XC0-0XCF

编写日期          :2005
最后修改日期      :2005 
-----------------------------------------------------------------------*/
void LCD_set_xy( uint8 x, uint8 y )
{
   uint8 address;
 switch(x)
 {
  case 0: address = 0x80 + y; break;     
  case 1: address = 0x90 + y; break; 
  case 2: address = 0x88 + y; break;
  case 3: address = 0x98 + y; break; 
  default:address = 0x80 + y; break;
 }
    Write_char(0, address);
}

/*-----------------------------------------------------------------------
LCD_Write_char_string  : 中英文字符串显示函数

输入参数:*s      :英文字符串指针;
          X、Y    : 显示字符串的位置 

编写日期          :2005
最后修改日期      :2005 
-----------------------------------------------------------------------*/
void LCD_Write_char_string(uint8 X,uint8 Y, uint8 *s)
{
 LCD_set_xy( X, Y );
    
    while (*s) 
    {
     Write_char( 1, *s );
     s ++;
     Delaynms(5);
 }
}




/******************************************************************************/

void Disp1num(unsigned char num)         //显示数字
{
 switch(num)
 	{
 		case 0:Write_char(1,'0');break;
 		case 1:Write_char(1,'1');break;
 		case 2:Write_char(1,'2');break;
 		case 3:Write_char(1,'3');break;
 		case 4:Write_char(1,'4');break;
 		case 5:Write_char(1,'5');break;
 		case 6:Write_char(1,'6');break;
 		case 7:Write_char(1,'7');break;
 		case 8:Write_char(1,'8');break;
 		case 9:Write_char(1,'9');break;
 	}
}





/******************************************************************************/

void Disp_anynum(uint8 x,uint8 y,fp32 num)
{
 uint8 i,j;
 uint8 LCD[weishu];               //子函Display_anynum中存储各位数的值
 uint32 date,N10;  
 
 for(i=0,N10=1;i<F_bit;i++)
 	N10*=10;           
 
 date=(int32)(num*N10);
 
 for(i=0,N10=1;i<weishu-1;i++)
    N10*=10;
 for(i=0;i<weishu;i++)          //分离各位数
    {
      LCD[i]=date/N10%10;
      N10/=10;
    }
 LCD_set_xy(x,y);   
 for(i=0;i<Z_bit;i++)           //显示整数部分
    {
      if(LCD[i]!=0)
      	  Disp1num(LCD[i]);                 //显示非0值
      else 
       	  {
       	  	if(i>0)
       	  	 {	
       	  	  for(j=0;j<i;j++)
       	       	if(LCD[j]!=0) break;
       	  	  if(j<i) 
       	  	      Disp1num(LCD[i]);     //显示0
       	  	  else if(i==Z_bit-1)
       	  	      Disp1num(LCD[i]);     //显示0
       	  	 }
       	  }		
    }

 Write_char(1,'.');      //显示小数点
 
 for(i=0;i<F_bit;i++)
 	Disp1num(LCD[i+Z_bit]);     //显示小数部分
  
}

⌨️ 快捷键说明

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