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

📄 +

📁 STM32的恒温消毒柜设计
💻
📖 第 1 页 / 共 2 页
字号:
/******************** CHD1807 Team **************************
 * 文件名  :lcd.c
 * 描述    :LCD 应用函数库。
 *           实现的功能:清屏、画点、划线、显示数字、字符串、图片、汉字         
 * 实验平台:CHD1807-STM32开发板
 * 库版本  :ST3.5.0
**********************************************************************************/
#include "lcd.h"
#include "sd_fs_app.h"
#include "ascii.h"		
#include "asc_font.h"
#include <stdlib.h>


u16 POINT_COLOR = RED;					      /*描点默认颜色*/
extern volatile u8 display_direction;		/*0:横屏 1:竖屏*/


/*************************************API START*************************************************************/


/*****************************************
 * 函数名:LCD_Init
 * 描述  :LCD 控制 I/O 初始化
 *         LCD FSMC 初始化
 *         LCD 控制器 HX8347 初始化 
 * 输入  : 无
 * 输出  :无
 * 举例  :无
 * 注意  :无
******************************************/    
void LCD_Init(void)
{
    unsigned long i;   
    LCD_GPIO_Config();
    LCD_FSMC_Config();		
    LCD_Rst();
		Lcd_init_conf();		     
    Lcd_data_start();   
    for(i=0; i<(320*240); i++)		 		
    {
        LCD_WR_Data(BLUE); 					    
    }    


}



/******************************************************
 * 函数名:LCD_Rectangle
 * 描述  :在指定坐标处显示指定长宽的矩形
 * 输入  : -x1      横向矩形起点 0~319
           -y1      纵向矩形起点 0~239
		   -len     横向长度 0~319
		   -wid     纵向宽度 0~239
		   -rgb565  填充颜色
 * 输出  :无
 * 举例  :	LCD_Rectangle(10,10,120,160,0);
		    LCD_Rectangle(200,200,120,40,0);
 * 注意  :	已测试
*********************************************************/    
void LCD_Rectangle(u16 x,u16 y,u16 len,u16 wid,u16 rgb565)
{                    
   u32 n, temp;
	 Set_direction(0);	 						/*设定方向为横向*/
   LCD_open_windows(x,y,len,wid);   
   temp = (u32)len*wid;    
   for(n=0; n<temp; n++)
	 {
        LCD_WR_Data( rgb565 );
	 }
	 
	  
}


/******************************************************
 * 函数名:LCD_Point
 * 描述  :在指定坐标处显示一个点
 * 输入  : -x 横向显示位置 0~319
           -y 纵向显示位置 0~239
 * 输出  :无
 * 举例  :	LCD_Point(100,200);
		   	LCD_Point(10,200);
		   	LCD_Point(300,220);
 * 注意  :	(0,0)位置为液晶屏左上角 已测试
*********************************************************/    
void LCD_Point(u16 x,u16 y)
{
    LCD_open_windows(x,y,1,1);   
    LCD_WR_Data(POINT_COLOR);	
} 


/******************************************************
 * 函数名:LCD_ColorPoint
 * 描述  :在指定坐标处显示一个指定颜色的点
 * 输入  : -x      横向显示位置 0~319
           -y      纵向显示位置 0~239
					 -rgb565 指定颜色
 * 输出  :无
 * 举例  :	LCD_ColorPoint(100,200,0);
		   	LCD_ColorPoint(10,200,100);
		   	LCD_ColorPoint(300,220,1000);
 * 注意  :	(0,0)位置为液晶屏左上角 已测试
*********************************************************/    
void LCD_ColorPoint(u16 x,u16 y, u16 rgb565)
{

      LCD_open_windows(x,y,1,1); 
      LCD_WR_Data(rgb565);	
} 


/******************************************************
 * 函数名:LCD_Line
 * 描述  :在指定两点之间画直线
 * 输入  : -x1  横向起点 0~319
           -y1  纵向起点 0~239
		   -x2  横向终点 0~319
		   -y2  纵向终点 0~239 
 * 输出  :无
 * 举例  :	LCD_Line(10,10, 319, 239);
			LCD_Line(10,10, 100, 150);
			LCD_Line(100, 150,10,10 );
 * 注意  :	已测试
 *********************************************************/    
void LCD_Line(u16 x1, u16 y1, u16 x2, u16 y2)
{
    u16 x, y, t;

		Set_direction(0);
    if( (x1 == x2) && (y1 == y2) )
        LCD_Point(x1, y1);
    else if( abs(y2 - y1) > abs(x2 - x1) )			/*斜率大于1*/ 
    {
				if(y1 > y2) 
        {
            t = y1;
            y1 = y2;
            y2 = t; 
            t = x1;
            x1 = x2;
            x2 = t; 
        }
        for(y=y1; y<y2; y++)						/*以y轴为基准*/ 
        {
            x = (u32)(y-y1)*(x2-x1) / (y2-y1) + x1;
            LCD_Point(x, y);

        }
    }
    else     										/*斜率小于等于1*/ 
    {
        if(x1 > x2)
        {
            t = y1;
            y1 = y2;
            y2 = t;
            t = x1;
            x1 = x2;
            x2 = t;
        }   
        for(x=x1; x<x2; x++)									/*以x轴为基准*/ 
        {
            y = (u32)(x-x1)*(y2-y1) / (x2-x1) + y1;
            LCD_Point(x, y);

        }
    } 
}





/******************************************************
 * 函数名:LCD_Char_6x12_O
 * 描述  :在指定位置悬浮显示指定字符
 * 输入  : 	-x
           	-y 
      		-acsii 要写入的字符 
      		-Color 字符颜色
 * 输出  :无
 * 举例  :无
 * 注意  :横屏 内部调用
 *********************************************************/    
void LCD_Char_6x12_O(u16 x, u16 y, u8 acsii, u16 Color)	
{       
#define MAX_CHAR_POSX (320-6)
#define MAX_CHAR_POSY (240-12)
    u8 temp, t, pos;  
 
     if(x > MAX_CHAR_POSX || y > MAX_CHAR_POSY)
     {
			 return;
		 }

    LCD_open_windows(x,y,6,12);
   
    acsii = acsii - ' ';											 /*得到偏移后的值*/
    for(pos=0; pos<12; pos++)
    {
        temp = asc2_1206[acsii][pos];
        for(t=0; t<6; t++)											/* 低位开始,丢弃高两位*/
        {                 
            if(temp & 0x01)
			 {
                if(t==0)
				{
					LCD_open_windows(x,y+pos,6,12-pos);
					LCD_WR_Data(Color);
				}
				else
				{
					LCD_WR_Data(Color);	
				}
			 }
            else 	
            {
        		if(t==5)											/*如果是末尾点--开启剩下窗户*/
				{
						LCD_open_windows(x,y+pos+1,6,12-pos-1);	 	
				}
				else
				{
						LCD_open_windows(x+t+1,y+pos,6-t,1);  		/*前进一位 开启一行线*/	
				}				
            }   
            temp >>= 1; 
        }
    }
    
#undef MAX_CHAR_POSX
#undef MAX_CHAR_POSY   
}





/******************************************************
 * 函数名:LCD_Char_6x12_O_P
 * 描述  :在指定位置悬浮显示指定字符
 * 输入  : 	-x
           	-y 
      		-acsii 要写入的字符
      		-Color 字符颜色 			 
 * 输出  :无
 * 举例  :无
 * 注意  :竖屏 内部调用
 *********************************************************/    
void LCD_Char_6x12_O_P(u16 x, u16 y, u8 acsii,u16 Color)	//竖屏
{       
#define MAX_CHAR_POSX (320-12)
#define MAX_CHAR_POSY (240-6) 
    u8 temp, t, pos;     
    if(x > MAX_CHAR_POSX || y > MAX_CHAR_POSY)
        return;
    
    LCD_open_windows(x,y,12,6);
    acsii = acsii - ' ';									//得到偏移后的值
    for(pos=0; pos<12; pos++)
    {

        if(display_direction==0)
            temp = asc2_1206[acsii][pos];
        else
            temp = asc2_1206[acsii][12-pos];

        for(t=0; t<6; t++)														// 低位开始,丢弃高两位
        {                 
            if(temp & 0x01)
			{
                if(t==0)
				{
					 LCD_open_windows(x+pos,y,12-pos,6);
					 LCD_WR_Data(Color);
				}
				else
				{
					LCD_WR_Data(Color);
				}
            }
			else 	
            {
                 if(t==5)														/*如果是末尾点--则直接开启下一个矩形*/
				{
					LCD_open_windows(x+pos+1,y,12-pos-1,6);	 	
				}
				else
				{
					LCD_open_windows(x+pos,y+t+1,1,6-t);					/*前进一位 开启一行线*/	
				}
		
            }   
            temp >>= 1; 
        }
    }
    
#undef MAX_CHAR_POSX
#undef MAX_CHAR_POSY    
}





/******************************************************
 * 函数名:LCD_Char_O
 * 描述  :在指定位置悬浮显示指定字符
 * 输入  : 	-x
 *          -y 
 *     		-acsii 要写入的字符
 *     		-Color 字符颜色  
 * 输出  :无
 * 举例  :无
 * 注意  :横屏 内部调用
*********************************************************/  
void LCD_Char_O(u16 x, u16 y, u8 acsii,u16 Color)
{       
#define MAX_CHAR_POSX (320-8)
#define MAX_CHAR_POSY (240-16)
    u8 temp, t, pos;     
    if(x > MAX_CHAR_POSX || y > MAX_CHAR_POSY)
        return;
       
    LCD_open_windows(x,y,8,16); 
    
    for (pos=0;pos<16;pos++)
    {
        temp=ascii_8x16[((acsii-0x20)*16)+pos];
        
        for(t=0; t<8; t++)
        {
            
            if(temp & 0x80)
            {
			   if(t==0)									   /*如果是一行起点--则重新开启一个矩形*/
				{
					LCD_open_windows(x,y+pos,8,16-pos);
					LCD_WR_Data(Color);
				}
				else
				{
					LCD_WR_Data(Color);	
				}
            }
			else 	
            {
				if(t==7)									/*如果是末尾点--则直接开启下一个矩形*/
				{
						LCD_open_windows(x,y+pos+1,8,16-pos-1);	 	
				}
				else
				{
						LCD_open_windows(x+t+1,y+pos,8-t,1);/*前进一位 开启一行线*/	
				}

            } 
            
            temp <<= 1;	
            
        }        
    }
#undef MAX_CHAR_POSX
#undef MAX_CHAR_POSY   
}




/******************************************************
 * 函数名:LCD_Char_O_P
 * 描述  :在指定位置悬浮显示指定字符
 * 输入  : 	-x
 *          -y 
 *     		-acsii 要写入的字符 
 *     		-Color 字符颜色 
 * 输出  :无
 * 举例  :无
 * 注意  :竖屏 
*********************************************************/  
void LCD_Char_O_P(u16 x, u16 y, u8 acsii,u16 Color) 
{       
#define MAX_CHAR_POSX (320-16)
#define MAX_CHAR_POSY (240-8)
    u8 temp, t, pos;       
    if(x > MAX_CHAR_POSX || y > MAX_CHAR_POSY)
        return;
      
    LCD_open_windows(x,y,16,8);    
    
    for (pos=0;pos<16;pos++)
    {
        temp=ascii_8x16[((acsii-0x20)*16)+16-pos];
        
        for(t=0; t<8; t++)
        {
            
            if(temp & 0x80)
			{
				if(t==0)
				{
					LCD_open_windows(x+pos,y,16-pos,8);
					LCD_WR_Data(Color);
				}
				else
				{
                	LCD_WR_Data(Color);
				}
            }
			else 	
            {
                if(t==7)									/*如果是末尾点--则直接开启下一个矩形*/
				{
						LCD_open_windows(x+pos+1,y,16-pos-1,8);	 	
				}
				else
				{
						LCD_open_windows(x+pos,y+t+1,1,8-t);/*前进一位 开启一行线*/	
				}
            } 
            
            temp <<= 1;	
            
        }
        
        
    }
#undef MAX_CHAR_POSX
#undef MAX_CHAR_POSY     
}







/****************************************************************
 * 函数名:LCD_Str_O
 * 描述  :在指定坐标处悬浮显示8*16大小的字符串
 * 输入  : -x   显示位置横向坐标 0 ~ 319
           -y   显示位置纵向坐标 0 ~ 239
 * 		   -str 字符串首址
 * 		   -Color字符颜色
 * 输出  :无
 * 举例  :	LCD_Str_O(0, 0, "Runing", 0);
		    LCD_Str_O(320-8*6, 239-16, "Runing",0); 
 * 注意  :	字符串显示方向为横向 已测试					
******************************************************************/    
void LCD_Str_O(u16 x, u16 y,const u8 *str,u16 Color)
{

   	Set_direction(0);     
    while(*str != '\0')
    {       
        if(x > (320-8)) 
        {	
					//换行
           x = 0;
           y += 16;
        }
        if(y > (240-16)) 
        {	
					//一屏
           x = y = 0;
        }
        
        LCD_Char_O(x ,y, *str,Color);
        x += 8;
        str ++ ;
    }
		
}






/************************************************************
 * 函数名:LCD_Char
 * 描述  :在液晶坐标(x,y)中,显示一个16*8大小的字符
 * 输入  : 	-x 0~(239-6)
 *         	-y 0~(319-12)
 *      	-acsii    要写入的字符
 *			-Color    字符颜色
 *			-bkColor  背景颜色
 * 输出  :无
 * 举例  :无
 * 注意  :字符串显示方向为横 已测试
******************************************************************/    
void LCD_Char(u16 x, u16 y,const u8 ascii, u16 Color, u16 bkColor)
{       
#define MAX_CHAR_POSX (320-8)
#define MAX_CHAR_POSY (240-16)
    u8 temp, t, pos;     
    if(x > MAX_CHAR_POSX || y > MAX_CHAR_POSY)
        return;
       
    LCD_open_windows(x,y,8,16); 
    
    for (pos=0;pos<16;pos++)
    {
        temp=ascii_8x16[((ascii-0x20)*16)+pos];
        
        for(t=0; t<8; t++)
        {
            
            if(temp & 0x80)              
						{
							LCD_WR_Data(Color);
						}
            else 	
            {
              LCD_WR_Data(bkColor);  
            }            
            temp <<= 1;	
            
        }
        
        
    }
#undef MAX_CHAR_POSX
#undef MAX_CHAR_POSY   
}





/************************************************************
 * 函数名:LCD_Str_R
 * 描述  :在液晶坐标(x,y)中,显示一个16*8大小的字符串,右对齐
 * 输入  : -x 0~(239-6)
 *         -y 0~(319-12)
 *         -str 字符串首址
 		   -len 字符串长度
		   -strColor 字符颜色
		   -bkColor  背景颜色
 * 输出  :无
 * 举例  :LCD_Str_R(304,59,“12345”,14,0x0000,0xffff)
 * 注意  :字符串显示方向为横 已测试
******************************************************************/    
void LCD_Str_R(u16 x,u16 y,const u8 *str,u8 len,u16 Color,u16 bkColor)    //右对齐,超过35位,仅显示最后35位
{
  u16 i=1,strlen=0;	

⌨️ 快捷键说明

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