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

📄 menu.c

📁 avr单片机的12864Lcd程序
💻 C
字号:
// menu.c
//
#include "includes.h"
 
 
    // 菜单信息结构

	MenuInfor  MenuInforFile  = {"文件",1,20,10,24,12,1,4};

	MenuInfor  MenuInforNew   = {"新建",1,20,10,24,12,1,2};
	MenuInfor  MenuInforEmpy  = {"空白",1,20,10,24,12,1,0};
	MenuInfor  MenuInforTemplate = {"模板",1,20,50,24,12,0,0};
	MenuInfor  MenuInforOpen  = {"打开",1,20,40,24,12,0,0};
	MenuInfor  MenuInforClose = {"关闭",1,20,70,24,12,0,0};
	MenuInfor  MenuInforSave  = {"保存",1,20,100,24,12,0,0};

	MenuInfor  MenuInforEdit = {"编辑",1,20,50,24,12,0,4};
	MenuInfor  MenuInforCut =  {"剪切",1,20,10,24,12,1,0};
	MenuInfor  MenuInforCopy = {"复制",1,20,40,24,12,0,0};
	MenuInfor  MenuInforPaste = {"粘贴",1,20,70,24,12,0,0};
	MenuInfor  MenuInforFind =  {"查找",1,20,100,24,12,0,0};

    MenuInfor  MenuInforRoot = {"欢迎",1,20,40,24,12,0,2};

		// 父菜单---文件 
	struct   Menu   MenuFile  = {&MenuInforFile,&MenuRoot,&MenuNew,&MenuEdit,&MenuEdit};
        
	struct   Menu   MenuNew = {&MenuInforNew,&MenuFile,&MenuEmpy,&MenuSave,&MenuOpen}; // 新建
	struct   Menu   MenuEmpy = {&MenuInforEmpy,&MenuNew,0,&MenuTemplate,&MenuTemplate};    // 空白文件
	struct   Menu   MenuTemplate = {&MenuInforTemplate,&MenuNew,0,&MenuEmpy,&MenuEmpy}; // 模板

	struct   Menu   MenuOpen = {&MenuInforOpen,&MenuFile,0,&MenuNew,&MenuClose};  // 打开
	struct   Menu   MenuClose= {&MenuInforClose,&MenuFile,0,&MenuOpen,&MenuSave}; // 关闭
	struct   Menu   MenuSave = {&MenuInforSave,&MenuFile,0,&MenuClose,&MenuNew}; // 保存


	// 父菜单
	struct   Menu   MenuEdit ={&MenuInforEdit,&MenuRoot,&MenuCut,&MenuFile,&MenuFile}; // 编辑 
 
	struct   Menu   MenuCut ={&MenuInforCut,&MenuEdit,0,&MenuFind,&MenuCopy};  // 剪切
	struct   Menu   MenuCopy ={&MenuInforCopy,&MenuEdit,0,&MenuCut,&MenuPaste};  // 复制
	struct   Menu   MenuPaste ={&MenuInforPaste,&MenuEdit,0,&MenuCopy,&MenuFind}; // 粘贴
	struct   Menu   MenuFind ={&MenuInforFind,&MenuEdit,0,&MenuPaste,&MenuCut};  // 查找

    struct   Menu   MenuRoot = {&MenuInforRoot,0,&MenuFile,0,0};   // 开始时候的菜单 


void onBeforeKey(struct Menu* pCurMenu)
{
      uchar uLeft,uTop,uRight,uBottom;
      uLeft = pCurMenu->PMenuInfor->offX;
	  uTop  = pCurMenu->PMenuInfor->offY;
	  uRight = uLeft + pCurMenu->PMenuInfor->Height;
	  uBottom = uTop + pCurMenu->PMenuInfor->Width;

	  pCurMenu->PMenuInfor->bIsFocus = 0;            // 当前子菜单失去焦点	                                                       
      RectBlock(uLeft - 5,uTop - 5,uRight + 5 ,uBottom + 5,0 ); // 当前子菜单失去黑色边框

      pCurMenu->pLeftMenu->PMenuInfor->bIsFocus = 1; // 左边兄弟菜单项获得焦点
      *pCurMenu = *(pCurMenu->pLeftMenu);            // 当前菜单项转为左边兄弟菜单项
}

void onAfterKey(struct Menu* pCurMenu)
{
	  uchar uLeft,uTop,uRight,uBottom;
      uLeft = pCurMenu->PMenuInfor->offX;
	  uTop  = pCurMenu->PMenuInfor->offY;
	  uRight = uLeft + pCurMenu->PMenuInfor->Height;
	  uBottom = uTop + pCurMenu->PMenuInfor->Width;

	  pCurMenu->PMenuInfor->bIsFocus = 0;            // 当前子菜单失去焦点	                                                       
      RectBlock(uLeft - 5,uTop - 5,uRight + 5 ,uBottom + 5,0 ); // 当前子菜单失去黑色边框

      pCurMenu->pRightMenu->PMenuInfor->bIsFocus = 1; // 右边兄弟菜单项获得焦点
      *pCurMenu = *(pCurMenu->pRightMenu);            // 当前菜单项转为左边兄弟菜单项
}

void onOkKey(struct Menu* pCurMenu)
{
   	if(pCurMenu->pChildMenu != 0)
	{
	  pCurMenu->PMenuInfor->bIsFocus = 0; // 当前父菜单项失去焦点 
	  pCurMenu->pChildMenu->PMenuInfor->bIsFocus = 1; // 默认第一子菜单项获得焦点
	  *pCurMenu = *(pCurMenu->pChildMenu); // 菜单转化为子菜单
	}
	else
	{
	  return;
	}
}

void onCancelKey(struct Menu* pCurMenu)
{
    if(pCurMenu->pParentMenu != 0)
	{
	  pCurMenu->PMenuInfor->bIsFocus = 0; // 当前菜单项失去焦点 
	  pCurMenu->pParentMenu->PMenuInfor->bIsFocus = 1; // 父菜单项获得焦点
	  *pCurMenu = *(pCurMenu->pParentMenu);
	}
	else
	{
	  return;
	}
}

void PutPixel(uchar x, uchar y, uchar mode)
{
    fnSetPos(x,y);
	if(mode)	// mode != 0
		fnCW0P(LC_BIT_OP | 0x08 | (7-(y % 8)));
	else
		fnCW0P(LC_BIT_OP | 0x00 | (7-(y % 8)));
}

uchar ReverPrin(uchar *ptr)   
{
    uchar c1,c2;
    uchar *tmpBuf;                           // LCD显示数据缓冲区
	uchar i=0,j=0,j1=0,k,uLen=0,uRow,uCol,uVal=0;
	const typFNT_GB12 data1 ;

	uchar uIndex1,uIndex2;  // 存储汉字的索引
	uchar uMask1,uMask2;    // 1个字横向字模信息的2个字节
	uchar k1,k2;
   while (ptr[uLen]!=0)
   {
     uLen++; ////探测字串长度
   }; 

    tmpBuf = ptr;
	i = 0;
	while(i<uLen)
	{
		c1 = tmpBuf[i];
		c2 = tmpBuf[i+1];
		uRow = fnGetRow();
		uCol = fnGetCol();
		
		if(c1 >= 0x20 && c1 <= 0x7f)		// 0x20---0x7f
		{	// ASCII 的 12行 * 6列 字符显示
			for( j = 0; j < 12; j++)            // 逐行显示
			{
				for ( k = 0; k < 6; k++)        // 逐列显示
				{
					cursor(uRow + j,uCol + k);  // 置当前显示地址
					k1 =   (uCol + k) & 0x07 ;  // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
  												// 每字节8个像素点,从左到右为01234567点,  
												// 对应数据的76543210位
					k2 = 7 - k1;                // 当前屏幕点属于的字节单元的位
					k1 = BIT(7-k);              // 当前屏幕点属于的字节单元的数据的第7-k个数据位置1,其余置0
					uVal = pgm_read_byte(ASCII_TBL+(c1-0x20)*12 + j);
					k1 =  ( uVal  & k1 ) == k1 ? 1 : 0;  // 测试对应字库中字的第j行1字节数据中的7-k个数据位是否为1
					if(k1 == 0)
						fnCW0P(LC_BIT_OP | 0x08 | k2 );    // 反转显示
					else
						fnCW0P(LC_BIT_OP |  k2 );          // 反转显示
				}
				
			}   
			
			cursor(uRow ,uCol + 6);             // 下一个字符
			i++;
		}
		else    // 0x80 -- 0xff
			
		{	    // 中文12行*12列汉字显示 
			 
           for(j1 = 0; j1 < sizeof(GB_12)/sizeof(GB_12[0]);j1 ++) // 找字
			{
			    memcpy_P(&data1, &GB_12[j1], sizeof(typFNT_GB12)); // 从程序区拷贝一个结构体数据

			    uIndex1 = data1.Index[0];
                uIndex2 = data1.Index[1];

 				if(c1 == uIndex1 && c2 == uIndex2)
 					break;
 			}
			
 			if(j1 >= sizeof(GB_12)/sizeof(GB_12[0]) )       // 找不到,屏幕就是空白
 				return 0;
 			for( j=0;j<12;j++)								// 逐行显示
			{
				for ( k = 0; k < 8; k++)                    // 逐列显示
				{
					cursor(uRow + j,uCol + k);              // 置当前显示地址
					k1 = (uCol + k) & 0x07 ;                // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
					                                        // 每字节8个像素点,从左到右为01234567点,  
												            // 对应数据的76543210位
					k2 = 7 - k1;							// 当前屏幕点属于的字节单元的位
					k1 = BIT(7 - (k & 0x07));               // 当前屏幕点属于的字节单元的数据的第7 - k & 0x07个数据位置1,其余置0
			     
				 	memcpy_P(&data1, &GB_12[j1], sizeof(typFNT_GB12));

					uMask1 = data1.Msk[2*j];
					 
					k1  =  (uMask1 & k1 ) == k1 ? 1 : 0;  // 汉字左边部分
 
					if(k1 == 0)                             // 反转显示
						fnCW0P(LC_BIT_OP | 0x08 | k2 );
					else
						fnCW0P(LC_BIT_OP |  k2 );           // 反转显示 		
				} 

                for ( k = 0; k < 4; k++)                    // 逐列显示
				{
					cursor(uRow + j,uCol + k +8);           // 置当前显示地址
					k1 = (uCol + k + 8) & 0x07 ;            // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
					                                        // 每字节8个像素点,从左到右为01234567点,  
												            // 对应数据的76543210位
					k2 = 7 - k1;							// 当前屏幕点属于的字节单元的位
					k1 = BIT(7 - (k & 0x07));               // 当前屏幕点属于的字节单元的数据的第7 - k & 0x07个数据位置1,其余置0
				
					uMask2 = data1.Msk[2*j+1];
					k1  =  (uMask2 & k1 ) == k1 ? 1 : 0;    // 汉字右边部分
 
					if(k1 == 0)                             // 反转显示
						fnCW0P(LC_BIT_OP | 0x08 | k2 );
					else
						fnCW0P(LC_BIT_OP |  k2 );           // 反转显示  		
				} 

			} 
				cursor(uRow ,uCol + 13);                    // 下一个汉字
				i +=2;                                      // 在字符串中一个汉字占2个字节
		}  	
		
		
	} 
	return uLen;    
	
}


// chRight 画矩形
void RectBlock(uchar chLeft,uchar chTop,uchar chRight,uchar chBottom,uchar mode)
{
  	uchar i,j;
	if( chLeft > chRight)                     // 使 chLeft 不大于 chRight
	{
		i = chLeft;
		chLeft = chRight;
		chRight = i;
	}
	
	if( chTop > chBottom)                     // 使  chTop 不大于 chBottom
	{
		i = chTop;
		chTop = chBottom;
		chBottom = i;
	 }
	
    if(chRight > 64 ) 
	{
        chRight = 64;
	}

 //  if(chBottom > 127 ) 
//	{
 //       chBottom = 110;
//	}

	for( i = chLeft; i <= chRight; i++)       // 逐个点画
		for( j = chTop; j <= chBottom;j++)
		{
			PutPixel(i,j,mode);  
		}
}   


void MenuDis(MenuInfor * pMenuInfor)
{
    uchar chX,chY;
	
	if(pMenuInfor == 0)
		return;
	
    chX = pMenuInfor->offX;
    chY = pMenuInfor->offY;
	cursor(chX,chY);

    if( pMenuInfor->bIsFocus == 1)                           // 反转显示
	{
	     RectBlock(chX - 5,chY -5,chX + pMenuInfor->Height + 5,chY + pMenuInfor->Width + 5,1);                                  // 现将背景填黑
		 ReverPrin(pMenuInfor->strChinese); 
	}
	else                                                    // 不反转显示
	{   
		 dprintf(pMenuInfor->strChinese);	         
	}
}

void DisPaly(struct Menu * pCurMenu)
{
  uchar i=0;

  if(pCurMenu->pParentMenu == 0)    // 如果是根菜单,直接显示
  {
     MenuDis(pCurMenu->PMenuInfor); // 根菜单显示
	 return;
  }

  uchar ucNum = pCurMenu->pParentMenu->PMenuInfor->subMenuNum; // 兄弟菜单项的个数
  
  for(i = 0; i < ucNum; i++ ) 
  {
	  MenuDis(pCurMenu->PMenuInfor);      // 菜单显示
      pCurMenu = pCurMenu->pRightMenu;
  } 
        
}

⌨️ 快捷键说明

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