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

📄 cursor.c

📁 STM32不完全手册 例程源码 29个
💻 C
字号:
#include "cursor.h"
#include "lcd.h" 
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//光标 驱动代码		 					    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/6/6
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////	 
 
//光标结构体初始化赋值
GUI_Cursor MY_Cursor=
{
	LCD_W/2, //光标当前所在的坐标
	LCD_H/2, 	
	WHITE,   //光标的颜色
//右键菜单弹出的窗口
	0,
	0,	  
	0,	          //光标状态,bit0:0,没有显示,1,开始显示了;bit1:右键菜单弹出与否
	Set_Cursor,   //单纯设置光标到某个坐标,并不清除		 
	Clear_Cursor, //单纯清除最近一次的光标		 
	Cursor_Draw,  //先清除最近一次的光标,再设置新的光标
};				 
//标准光标
//12*20大小
const u8 std_cur_tab[36]=	
{0xFF,0xFF,0x00,0x80,0x02,0x00,0x40,0x04,0x00,
 0x20,0x08,0x00,0x10,0x18,0x00,0x08,0x06,0x00,
 0x04,0x01,0x80,0x02,0x38,0x60,0x01,0x26,0x10,
 0x00,0xA1,0x90,0x00,0x60,0x60,0x00,0x20,0x00};
//标准光标掩码
const u8 std_cur_msk[36]=
{0xFF,0xFF,0x00,0xFF,0xFE,0x00,0x7F,0xFC,0x00,
 0x3F,0xF8,0x00,0x1F,0xF8,0x00,0x0F,0xFE,0x00,
 0x07,0xFF,0x80,0x03,0xFF,0xE0,0x01,0xE7,0xF0,
 0x00,0xE1,0xF0,0x00,0x60,0x60,0x00,0x20,0x00};

//光标覆盖区域数据缓存区
//12*20的光标实际上只需要125个字节
u16 cur_buf[125];   

//清除光标
//用于清除最近一次的光标
//(x,y)一般就是(MY_Cursor.X,MY_Cursor.Y)							    
void Clear_Cursor(u16 x,u16 y)
{
	u16 y0=y;
	u8 t,t1,temp,temp1;	  		 
	u8 rccnt=0;//读取到的颜色计数器	
	if((MY_Cursor.STA&0x01)==0)return;//如果光标还没开始画,则直接返回	  
    for(t=0;t<36;t++)
    {   												   
	    temp=std_cur_tab[t]; //得到数据 
		temp1=std_cur_msk[t];//得到掩码数据                         
        for(t1=0;t1<8;t1++)
		{
			if(temp1&0x80)
			{
              	POINT_COLOR=cur_buf[rccnt];//还原原来的颜色
				if(y<320)LCD_DrawPoint(x,y);//LCD_DrawPoint函数没有判断范围,这里我们需外部判断
				rccnt++;
 			}	   
			temp<<=1;
			temp1<<=1;
			y++;							   
			if((y-y0)==20)
			{
				y=y0;
				x++;
				if(x>=LCD_W)return;//X方向 越界
				break;
			}
		}  	 
	} 
}	 
//(x,y):设置光标的位置
//color:光标的颜色
//如果为白色,则为标准光标
void Set_Cursor(u16 x,u16 y)
{	
	u16 y0=y;
	u8 t,t1,temp,temp1;	  
	u16 out_color,in_color;	 
	u8 rccnt=0;//读取到的颜色计数器

	out_color=in_color=MY_Cursor.Color;
	if(MY_Cursor.Color==WHITE)out_color=BLACK;//如果为白色,则为标准光标 
	MY_Cursor.STA|=0X01;//标记开始
	MY_Cursor.X=x;//记录此次坐标
	MY_Cursor.Y=y;   
	POINT_COLOR=MY_Cursor.Color;
	BACK_COLOR=WHITE;
    for(t=0;t<36;t++)
    {   												   
	    temp=std_cur_tab[t]; //得到数据 
		temp1=std_cur_msk[t];//得到掩码数据                         
        for(t1=0;t1<8;t1++)
		{
			if(temp1&0x80)
			{
				if(temp&0x80)POINT_COLOR=out_color;//边框
                else POINT_COLOR=in_color;//内部 
				cur_buf[rccnt]=LCD_ReadPoint(x,y);//读取当前点的颜色值 
				rccnt++;
				if(y<320)LCD_DrawPoint(x,y);//LCD_DrawPoint函数没有判断范围,这里我们需外部判断
 			}//透明区域,不画出来 	   
			temp<<=1;
			temp1<<=1;
			y++;							  
			if((y-y0)==20)
			{
				y=y0;
				x++;
				if(x>=LCD_W)return;//X轴方向 越界
				break;
			}
		}  	 
	}   
}
//画光标,带清除
//该函数先清除上一次的光标
//再画下一个需要画出的光标
void Cursor_Draw(u16 x,u16 y)
{
	Clear_Cursor(MY_Cursor.X,MY_Cursor.Y);//清除上一次的光标
	Set_Cursor(x,y);
}







⌨️ 快捷键说明

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