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

📄 lcd-ad.c

📁 基于ARM的LCD液晶显示与输出,输出波形,以够实现,波形变换
💻 C
字号:
/***********************************************************************************************
** 文件名称:_LCD_C
** 功能说明:ST7920驱动LCD显示软件包
** 使用说明:软件包用到LPC213x的二个引脚,默认为P1.24,P1.25,如需修改,请修改头文件中的宏定义数据即可
			 (接触一天,时间不足,理解不深,代码有待优化,鉴谅)
***********************************************************************************************/
#include "config.h"
#include  "lad.h"
uint8  chartab4[1024] ={0x00 };
/***********************************************************************************************
** 函数名称:LCD_Init()
** 函数功能:LCD初始化
** 入口参数:无
** 出口参数:无
***********************************************************************************************/
void LCD_Init(void)	
{
	  PIN_INITI;
	  LCD_Dly(50); 								//启动等待,等LCD进入工作状态    	 								
	  LCD_Write(0,0x30);  						//8 位介面,基本指令集
	  LCD_Write(0,0x0c);  						//显示打开,光标关,反白关
	  LCD_Write(0,0x01);  						//清屏,将DDRAM的地址计数器归零  
	  
}

/***********************************************************************************************
** 函数名称:LCD_Write()
** 函数功能:LCD写指令或数据
** 入口参数:control_flow		数据控制流,0 为写指令 1 为写数据
			 ddata				数据
** 出口参数:无
***********************************************************************************************/
void LCD_Write(unsigned char control_flow, unsigned char ddata) 
{
	  unsigned char start_data,Hdata,Ldata;
	  if(0==control_flow) start_data=0xf8;	//写指令
	    else       start_data=0xfa;  		//写数据
	  
	  Hdata=ddata&0xf0;		 				//取高四位
	  Ldata=(ddata<<4)&0xf0;  				//取低四位
	  LCD_SendByte(start_data);	  			//发送起始信号
	  LCD_Dly(1); 							//延时是必须的
	  LCD_SendByte(Hdata);	      			//发送高四位
	  LCD_Dly(1);  						//延时是必须的
	  LCD_SendByte(Ldata);		  			//发送低四位
	  LCD_Dly(1);  						//延时是必须的
}

/***********************************************************************************************
** 函数名称:LCD_SendByte()
** 函数功能:发送一个字节
** 入口参数:bbyte		字节数据
** 出口参数:无
***********************************************************************************************/
void LCD_SendByte(unsigned char bbyte) 
{
	 unsigned char i;
	 
	 for(i=0;i<8;i++)
	 {
		if( (bbyte&0x80)!=0 ) SID_1;
    	else 
    	{
    		SID_0 ;					//SID=bbyte&0x80;取出最高位
    	}
		SCKL_1;								//SCLK=1;
		__asm
		{
			nop
		}
	 	SCKL_0;								//SCLK=0;
	 	bbyte<<=1; 							//左移
	 }  
}
/***********************************************************************************************
** 函数名称:LCD_Dly()
** 函数功能://延时
** 入口参数:dly	延时参数,值越大,延时时间越长
** 出口参数:无
***********************************************************************************************/
void LCD_Dly(unsigned int dly) 
{
 	unsigned int i,j;
 	for(i=dly;i>0;i--)
   		for(j=500;j>0;j--);
}
/***********************************************************************************************
** 函数名称:LCD_Point()
** 函数功能:写LCD画点数据
** 入口参数:uint16 x		横坐标
			 uint16 y		纵坐标
			 uint8 disp_onoff	0:清零某一点;1:点亮某一点
** 出口参数:无
***********************************************************************************************/
void  LCD_Point(uint16 x, uint16 y, uint8 disp_onoff)
{
	uint16 z=0;
	z = (63-x) * 16 + (y/8);
	if (disp_onoff == 0)
		chartab4[z] = (chartab4[z] & (~(0x80 >> (y%8))));
	else
		chartab4[z] = (chartab4[z] | (0x80 >> (y%8)));
	LCD_GRP(chartab4);
}


/***********************************************************************************************
** 函数名称:Modify_Point()
** 函数功能:修改chartab4数组函数
** 入口参数:uint16 x		横坐标
			 uint16 y		纵坐标
** 出口参数:无
***********************************************************************************************/
void Modify_Point(uint16 x, uint16 y)
{
	uint16 z=0;
	z = (63-x) * 16 + (y/8);
	chartab4[z] |= (0x80 >> (y%8));
}
void  Draw_Point(uint16 x, uint16 y)
{
	uint16 z=0;
	z = (63-x) * 16 + (y/8);
	chartab4[z] |= (0x80 >> (y%8));
	
}

/***********************************************************************************************
** 函数名称:Draw_HLine()
** 函数功能:在第row(0~63)行画从最左端至最右端的直线
** 入口参数:uint8 row ;LCD行参数,取值范围0~63
** 出口参数:无
***********************************************************************************************/
void Draw_HLine(uint8 row)
{
	uint8 x,y;
	for(x=row,y=0;y<128;y++)
    Modify_Point(x,y);
	LCD_GRP(chartab4);
}

/***********************************************************************************************
** 函数名称:Draw_HLine2()
** 函数功能:在第row(0~63)行画从starty至endy的直线
** 入口参数:uint8 row ;LCD行参数,取值范围0~63;starty和endy在0~127之间
** 出口参数:无
***********************************************************************************************/
void Draw_HLine2(uint8 starty,uint8 endy,uint8 row)
{
	uint8 x,y;
	for(x=row,y=starty;y<endy;y++)
		Modify_Point(x,y);
	LCD_GRP(chartab4);
}

/***********************************************************************************************
** 函数名称:Draw_VLine()
** 函数功能:在第colm(0~127)列画从最下端至最上端的直线
** 入口参数:uint8 row ;LCD行参数,取值范围0~63
** 出口参数:无
***********************************************************************************************/
void Draw_VLine(uint8 colm)
{
	uint8 x,y;
	for(x=0,y=colm;x<64;x++)
		Modify_Point(x,y);
	LCD_GRP(chartab4);
}

/***********************************************************************************************
** 函数名称:Draw_HLine()
** 函数功能:修改chartab4数组函数
** 入口参数:uint16 x		横坐标
			 uint16 y		纵坐标
			 uint8 disp_onoff	画点
** 出口参数:无
***********************************************************************************************/
void Draw_VLine2(uint8 startx,uint8 endx,uint8 colm)
{
	uint8 x,y;
	for(x=startx,y=colm;x<endx;x++)
		Modify_Point(x,y);
	LCD_GRP(chartab4);
}
/***********************************************************************************************
** 函数名称:Draw_HArrow()
** 函数功能:在LCD水平方向上画直线末端的箭头
** 入口参数:(x,y)需要箭头的水平直线末端点坐标
** 出口参数:无
***********************************************************************************************/

void Draw_HArrow(uint8 x,uint8 y)
{	
	Modify_Point(x,y+1);
	Modify_Point(x,y+2);
	Modify_Point(x,y+3);
	Modify_Point(x,y+4);
	Modify_Point(x,y+5);
	
	Modify_Point(x+2,y+3);
	Modify_Point(x-2,y+3);
	Modify_Point(x+1,y+4);
	Modify_Point(x-1,y+4);
	
	LCD_GRP(chartab4);						//取数组数据来绘图
}

/***********************************************************************************************
** 函数名称:LCD_HLine()
** 函数功能:在LCD垂直方向上画直线末端的箭头
** 入口参数:(x,y)需要箭头的垂直直线末端点坐标
** 出口参数:无
***********************************************************************************************/
void Draw_VArrow(uint8 x,uint8 y)
{	
	uint8 i;//i<4决定箭头大小
	Draw_VLine2(x,x+6,y);//先延长原直线3个像素点
	for(i=1;i<3;i++)
	{
		Modify_Point(x+6-i,y+i);//右侧
		Modify_Point(x+6-i,y-i);//左侧
	}
	
	LCD_GRP(chartab4);					//取数组数据来绘图
}
/***********************************************************************************************
** 函数名称:LCD_GRP()
** 函数功能:绘图函数
** 入口参数:string_num		液晶点阵数组
** 出口参数:无
***********************************************************************************************/
void LCD_GRP(uint8 const *string_num)
{     
	uint8 i,j,k;
	
  
    k = 0x80;
     
	LCD_Write(0,0x32);		// 功能设定
    LCD_Dly(2);
    LCD_Write(0,0x36);		 
    LCD_Dly(2);
    
	// 上半屏
    for (i = 0; i<32; i++)
    {
		LCD_Write(0,k);
		LCD_Dly(2);
		k++;
		LCD_Write(0,0x80);
		LCD_Dly(2);		
		for (j = 0;j <16;j++) 
		{
			LCD_Write(1,*string_num);
			string_num++;
			LCD_Dly(1);
			     
		}
		
    }
    // 下半屏
   k = 0x80;
    for (i = 0;i < 32;i++)
    {
		LCD_Write(0,k);
		LCD_Dly(2);
		k++;
		LCD_Write(0,0x88);
		LCD_Dly(2);		
		for (j = 0;j < 16;j++) 
		{
			LCD_Write(1,*string_num);
			string_num++;
			LCD_Dly(1);
		      
		}
    }
  }
    void DrawX(uint8 x,uint8 y)
{	
	Modify_Point(x,y);
	
	Modify_Point(x+1,y-1);
	Modify_Point(x+1,y+1);
	Modify_Point(x+2,y-2);
	Modify_Point(x+2,y+2);
	
	Modify_Point(x-1,y-1);
	Modify_Point(x-1,y+1);
	Modify_Point(x-2,y-2);
	Modify_Point(x-2,y+2);
	
	LCD_GRP(chartab4);					//取数组数据来绘图
}

void DrawY(uint8 x,uint8 y)
{	
	Modify_Point(x,y);
	Modify_Point(x-1,y);
	Modify_Point(x-2,y);
	
	Modify_Point(x+1,y-1);
	Modify_Point(x+1,y+1);
	
	Modify_Point(x+2,y-2);
	Modify_Point(x+2,y+2);
	
	LCD_GRP(chartab4);					//取数组数据来绘图
}



void Draw0(uint8 x,uint8 y)
{		
	Modify_Point(x,y-1);
	Modify_Point(x,y+1);
	Modify_Point(x-2,y);
	Modify_Point(x-2,y-1);
	Modify_Point(x-2,y+1);
	Modify_Point(x+2,y);
	Modify_Point(x+2,y-1);
	Modify_Point(x+2,y+1);
	Modify_Point(x+1,y-1);
	Modify_Point(x-1,y-1);
	Modify_Point(x+1,y+1);
	Modify_Point(x-1,y+1);
	
	LCD_GRP(chartab4);
}

void Draw1(uint8 x,uint8 y)
{	uint8 i;
	for(i=1;i<3;i++)
	{
		Modify_Point(x+i,y);
		Modify_Point(x-i,y);
	}
	Modify_Point(x,y);
	LCD_GRP(chartab4);
}

void Draw2(uint8 x,uint8 y)
{		
	Modify_Point(x,y);
	Modify_Point(x+1,y+1);
	Modify_Point(x,y+1);
	Modify_Point(x,y-1);
	
	Modify_Point(x+2,y);
	Modify_Point(x+2,y+1);
	Modify_Point(x+2,y-1);
	
	Modify_Point(x-2,y);
	Modify_Point(x-2,y+1);
	Modify_Point(x-2,y-1);
	
	Modify_Point(x-1,y-1);
		
	LCD_GRP(chartab4);
}

void Draw3(uint8 x,uint8 y)
{		
	Modify_Point(x,y);
	Modify_Point(x,y+1);
	Modify_Point(x,y-1);
	
	Modify_Point(x+2,y);
	Modify_Point(x+2,y+1);
	Modify_Point(x+2,y-1);
	
	Modify_Point(x-2,y);
	Modify_Point(x-2,y+1);
	Modify_Point(x-2,y-1);
	
	Modify_Point(x+1,y+1);
	Modify_Point(x-1,y+1);
	
	LCD_GRP(chartab4);
}


void Draw4(uint8 x,uint8 y)
{		
	Modify_Point(x,y);
	Modify_Point(x,y+1);
	Modify_Point(x,y-1);
	Modify_Point(x,y-2);
	
	Modify_Point(x+1,y-2);
	Modify_Point(x+2,y-2);
	Modify_Point(x-2,y);
	Modify_Point(x+1,y);
	Modify_Point(x+2,y);
	Modify_Point(x-1,y);
	
	LCD_GRP(chartab4);
}

void Draw5(uint8 x,uint8 y)
{		
	Modify_Point(x,y);
	Modify_Point(x,y+1);
	Modify_Point(x,y-1);
	
	Modify_Point(x+1,y-1);
	Modify_Point(x+2,y-1);
	
	Modify_Point(x+2,y-1);
	Modify_Point(x+2,y);
	Modify_Point(x+2,y+1);
	
	Modify_Point(x-1,y+1);
	Modify_Point(x-2,y);
	
	Modify_Point(x-2,y);
	Modify_Point(x-2,y-1);
	Modify_Point(x-2,y+1);
	
	LCD_GRP(chartab4);
}

void Draw6(uint8 x,uint8 y)
{		
	Modify_Point(x,y);
	Modify_Point(x,y-1);
	Modify_Point(x,y+1);
	Modify_Point(x-1,y+1);
	Modify_Point(x-1,y-1);
	
	Modify_Point(x-2,y);
	Modify_Point(x-2,y-1);
	Modify_Point(x-2,y+1);

	
	Modify_Point(x+1,y-1);
	
	Modify_Point(x+2,y);
	Modify_Point(x+2,y-1);
	Modify_Point(x+2,y+1);

	
	LCD_GRP(chartab4);
}

void Draw7(uint8 x,uint8 y)
{		
	Modify_Point(x+2,y+1);
	Modify_Point(x+1,y+1);
	Modify_Point(x,y+1);
	Modify_Point(x-1,y+1);
	Modify_Point(x-2,y+1);
	
	Modify_Point(x+2,y);
	Modify_Point(x+2,y-1);
	
	LCD_GRP(chartab4);
}

void Draw8(uint8 x,uint8 y)
{		
	Modify_Point(x,y);
	Modify_Point(x,y-1);
	Modify_Point(x,y+1);
	Modify_Point(x-2,y);
	Modify_Point(x-2,y-1);
	Modify_Point(x-2,y+1);
	Modify_Point(x+2,y);
	Modify_Point(x+2,y-1);
	Modify_Point(x+2,y+1);
	Modify_Point(x+1,y-1);
	Modify_Point(x-1,y-1);
	Modify_Point(x+1,y+1);
	Modify_Point(x-1,y+1);
	
	LCD_GRP(chartab4);
}


void Draw9(uint8 x,uint8 y)
{		
	Modify_Point(x-1,y);
	Modify_Point(x-2,y);
	Modify_Point(x,y);
	Modify_Point(x+1,y);
	Modify_Point(x+2,y);
	Modify_Point(x+2,y-1);
	Modify_Point(x+2,y-2);
	Modify_Point(x+1,y-2);
	Modify_Point(x,y-2);
	Modify_Point(x,y-1);
    LCD_GRP(chartab4);
}
 void  drawquxian(void)
{  uint8 dangwei;
   uint8 x;
   uint8 i;
   uint8 k=0;
   for(i=3;i<127;i++)
     {  dangwei=((i-4)%20)/10;
        switch(dangwei)
       {  case 0:
          i=i-20*k;
          x=63+13*i/5-(i*i)/10-379/10;
          i=i+20*k;                                       //还原i
          Modify_Point(x,i);
          LCD_GRP(chartab4);
          break;
         
         case 1:
          i=i-20*k;
          x=63+13*i/5-(i*i)/10-379/10;
          i=i+20*k;                                            //还原i
         Modify_Point(x,i);
         LCD_GRP(chartab4);
         break;
       }
       if(i==3+20*(k+1))
       {
        k++;
       }
    }   
 }

⌨️ 快捷键说明

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