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

📄 hulandengm16.c

📁 这是带四乘四按键的程序,带LCD显示,可以控制灯饰单色,七彩变化,调光的程序,用AVRM16写的程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	while(LCM12864_indatabus & LCM12864_STATUS_BUSY);
	DDRA=0xff;

 }


//*********************************************************************************************
//写指令到LCM12864		LCM12864_WriteCMD()
//
//**********************************************************************************************/
void LCM12864_WriteCMD(unsigned char LCM12864_command)		//LCM12864_command	欲写入指令	
 {	
 	LCM12864_TestBusy();
	CBI_RW; 
	CBI_RS; 
    LCM12864_databus = LCM12864_command;   
	LCM12864_E();  

 }

//*********************************************************************************************
//写数据到LCM12864		LCM12864_WriteData()
//
//**********************************************************************************************/
void LCM12864_WriteData(unsigned char LCM12864_data)		//LCM12864_command	欲写入数据	
 {
    LCM12864_databus = LCM12864_data;
	CBI_RW; 
	SBI_RS; 
	LCM12864_E();
	
 }

//********************************************************************************************
//从LCM12864读数据		LCM12864_ReadData()
//
//*********************************************************************************************/
unsigned char LCM12864_ReadData(void)
 {
	unsigned char LCM12864_data;
	DDRA=0x00;
	PORTA=0xff;
	SBI_RW; 
	SBI_RS; 
	LCM12864_E();
	LCM12864_data = LCM12864_indatabus;		//读出8位数据
	LCM12864_TestBusy();					//读LCM忙
	DDRA=0xff;
	return LCM12864_data;
 }



//********************************************************************************************
//向LCM12864填充数据(全屏)		LCM12864_Fill_Screen()
//
//*********************************************************************************************/
void LCM12864_Fill_Screen(	unsigned char t,						//设置写入速度
							      unsigned char LCM12864_FillData)		//欲写入的数据
  {
  	unsigned char x,y;
  	CBI_CS1;CBI_CS2;                   // 选中左半屏及右半屏
  	LCM12864_WriteCMD(LCM12864_START_ROW+0);             // 设置显示起始行为0
  	for(x=0;x<8;x++)
	 {
	  Delay(t);										            // 写入延时
     LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+x);   // 设置页地址
     LCM12864_WriteCMD(LCM12864_COL_START_ADDR);//    // 设置列地址
     for(y=0;y<64;y++) 
	   {
	    LCM12864_WriteData(LCM12864_FillData);
		}
  	 }
  	SBI_CS1;                                    // 不选中右半屏
  	SBI_CS2;                                    // 不选中右半屏
 }

//********************************************************************************************
//LCM12864清屏		LCM12864_Clear_Screen()
//
//********************************************************************************************/
void LCM12864_Clear_Screen(void)
 {
	LCM12864_Fill_Screen(10,0x00);			//写入0到每个显示区
 }
 
 
 
 //********************************************************************************************
//在LCM12864的指定点显示16*16点阵汉字		LCM12864_Disp_Chinese_16_16()
//  
//*********************************************************************************************/
void LCM12864_Disp_Char_x_16(unsigned char t,					      //设置写入速度(为1直接显示)
							  unsigned char b,					      //输入8:8*16字符,16:16*16字符
						      unsigned char LCM12864_page,		      //LCM12864的页地址(0~7)
						      unsigned char LCM12864_col,			//LCM12864的列地址(0~128)注意:右半屏起始是64 
						      unsigned char x)		//16*16点阵汉字字模(纵向取模,字节倒序)
  {
	unsigned char j=0,i=0,data;
	if(LCM12864_col < 64 )
	 {
		CBI_CS1; 
		SBI_CS2;		//判断屏幕使能
	 }
	else
	 {
		SBI_CS1; 
		CBI_CS2;
		LCM12864_col = LCM12864_col - 64;
	 }
		if(b==16)
		 {
		  for(j=0;j<2;j++)
	       {	
		    LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+LCM12864_page+j);
		    LCM12864_WriteCMD(LCM12864_COL_START_ADDR+LCM12864_col);
		   for(i=0;i<b;i++)
		    {
		     data=pgm_read_byte(hanzi+x*32+b*j+i);
			 LCM12864_WriteData(data);
			 _delay_us(t); 
		    }
		   }
		 }
		else
		 {
		  for(j=0;j<2;j++)
	       {	
		    LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+LCM12864_page+j);
		    LCM12864_WriteCMD(LCM12864_COL_START_ADDR+LCM12864_col);
		   for(i=0;i<b;i++)
		    {
		     data=pgm_read_byte(shuzi+x*16+b*j+i);
			 LCM12864_WriteData(data);
			 _delay_us(t); 
		    }
		   }
		 }
	 
  }


/******************************************************************** 
函 数 名:void LCM12864_dot()
功    能:画点
说    明:在12864屏的指定位置画一个点
          mode=0    画一个点 
          mode=1 	清除一个点
	       mode=2    反白显示一个点
入口参数:x,y,mode  
返 回 值:无
***********************************************************************/

void LCM12864_dot(unsigned char x,unsigned char y,unsigned char mode)
 {
  unsigned char temp_y,read_data;
  temp_y = y%8;
  if(x<64)
   {
    CBI_CS1; SBI_CS2;		//判断屏幕位置
   }
  else 
   {
    SBI_CS1; CBI_CS2;
    x-=64;
   }

   LCM12864_WriteCMD(LCM12864_COL_START_ADDR+x);
   LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+(y/8));
   read_data=LCM12864_ReadData();
   switch(mode)
    {
     case 0:
	       read_data|=(0x01<<temp_y);
           break;
	 case 1:
	       read_data&=~(0x01<<temp_y);
           break;
	 case 2:
	       read_data^=(0x01<<temp_y);
           break;
    }
  
  LCM12864_WriteCMD(LCM12864_COL_START_ADDR+x);
  LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+(y/8));
  LCM12864_WriteData(read_data);

 }

/******************************************************************** 
函 数 名:line()
功    能:画线
说    明:在12864屏上画直线或清除
入口参数:x,y,tx,ty,xe,ye,incx,incy,dist,xerr,yerr,t
返 回 值:无
**********************************************************************/
void line(unsigned char tx,unsigned char ty,unsigned char xe,unsigned char ye,unsigned mode)
 {
  unsigned char xerr,yerr,t,dist;
  char incx,incy;
  

  if(xe>tx)
   incx=1;
  if(xe<tx)
   incx=-1;
  if(xe==tx)
   incx=0;

  if(ye>ty)
   incy=1;
  if(ye<ty)
   incy=-1;
  if(ye==ty)
   incy=0;

 if(xe>=tx&&ye<ty)            //第一象限
  {
   xe=xe-tx;
   ye=ty-ye;
  }

 if(xe>tx&&ye>=ty)            //第二象限
  {
   xe=xe-tx;
	ye=ye-ty;
  }


  if(xe>ye)
    dist=xe;
  else
    dist=ye;

 xerr=yerr=0;
 for(t=0;t<=dist;t++)
  {
   xerr=xerr+xe;
   yerr=yerr+ye;
   if(xerr>dist)
    {
	  xerr=xerr-dist;
	  if(incx>0)
	   tx++;
	  if(incx<0)
	   tx--;
    }
   if(yerr>dist)
    {
	  yerr=yerr-dist;
	  if(incy>0)
	   ty++;
	  if(incy<0)
	   ty--;
	 }
	LCM12864_dot(tx,ty,mode);
  }
}


/**************************************************************************** 
函 数 名:box()
功    能:画框
说    明:边框:mode=0:画     1:清       2:反显 
          填充:tc=0 填充黑色.1:清除填充.2:框内反显.3:不填充
入口参数:sx,sy,ex,ey,mode
          sx,sy:左上角坐标.ex,ey:右下角坐标
返 回 值:无
*****************************************************************************/
void box(unsigned char sx,unsigned char sy,unsigned char ex,unsigned char ey,unsigned char mode,unsigned char tc)
{
 unsigned char n;
 line(sx,sy,ex,sy,mode);
 line(sx,ey,sx,sy,mode);
 line(sx,ey,ex,ey,mode);
 line(ex,ey,ex,sy,mode);
 if(tc!=3)
  {
   for(n=sy;n<ey;n++)
	 line(sx+1,n,ex-1,n,tc);
  }
}



//********************************************************************************************
//LCM12864初始化		LCM12864_Init()
//
//*********************************************************************************************/
void LCM12864_Init(void)
{
  CBI_RST;								            //复位
  _delay_us(2000);
  SBI_RST;
  _delay_us(2000);
  LCM12864_Clear_Screen();							//清除屏幕
  CBI_CS1; CBI_CS2;				                    //选中双屏
  LCM12864_WriteCMD(LCM12864_DISP_OFF);				//关显示
  LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+0);	//第0页位置
  LCM12864_WriteCMD(LCM12864_START_ROW+0);			//第0行			
  LCM12864_WriteCMD(LCM12864_COL_START_ADDR+0);		//第0列
  LCM12864_WriteCMD(LCM12864_DISP_ON);				//开显示
}


//数码管渐变时关掉显示中断
void zhongduan_set(void)
 {
   if((type==2)&&(mode==1||mode==3))
    {
	 TIMSK&=~(1<<TOIE0);
	 TIMSK&=~(1<<TOIE1);
	 disp_number*=5;
	 send_frame();
	 disp_number/=5;
	}
   else
    {
	 TIMSK|=(1<<TOIE0);
	 TIMSK|=(1<<TOIE1);
	 CBI_OE;
	}
 }


//二级菜单向上键处理
void two_menu_up(void)
 {
  switch(show) 
   {
    case 51:if(speed<9) {speed++;} else {speed=1;}
	         break;
			
	case 52:if(brightness<9) {brightness++;} else {brightness=0;}
	         break;
			
	case 53:if(disp_number<9) {disp_number++;} else {disp_number=1;}
	         break;
			
	case 54:if(color_amount<7) {color_amount++;} else {color_amount=1;}
	         break;
			 
	case 55:if(gray_scale_set<951) {gray_scale_set+=50;} else{gray_scale_set=50;}
	         break;
   }
 }

//二级菜单向下键处理
void two_menu_down(void)
 {
  switch(show)
   {
    case 51:if(speed>1) {speed--;} else {speed=9;}
	         break;
		
    case 52:if(brightness>0) {brightness--;} else {brightness=9;}
	         break;
			 
	case 53:if(disp_number>1) {disp_number--;} else {disp_number=9;}
	         break;
			 
	case 54:if(color_amount>1) {color_amount--;} else {color_amount=7;}
	         break;
			 
    case 55:if(gray_scale_set>50) {gray_scale_set-=50;} else{gray_scale_set=1000;}
   }
 }


//向上键处理  主级菜单或默认状态下
void key_up(void)
 {
  if(disp_set==0)
   {
	if(type>2)
	  {
	   type=0;
	  }
	else
	  {
	   type++;
	  }
	if(type==3)
	 {
	  shield_data=0xff;
     }
    else
     {
      shield_data=0x00; 
     } 
	}
		  
  if(disp_set==1)
    {
	 if(show>1)
	  {
	   show--;
	  }
	 else
	  {
	   show=6;
	  }
   }
  if(disp_set==2)
   {
    two_menu_up();
   }
 }
 
 
//向下键处理  主级菜单或默认状态下
void key_down(void)
 {
 switch(disp_set)
  {
   case 0:
           if(color>=color_amount)
	        {
	         color=1;
	        }
	       else
	        {
	         color++;
	        }
           
            break;
		  
  case 1:
	      if(show<6)
	       {
	        show++;
	       }
	      else
	       {
	        show=1;
	       }
           break;
		   
  case 2:two_menu_down();
          break;
  }
 }


//左键处理  
void key_left(void)
 {
  switch(disp_set)
   {
    case 0:
	        disp_set=1;
			show=1;
	        LCM12864_Clear_Screen();
            break;
    case 1:if(show<50)
             {
              show+=50;
              disp_set=2;
              LCM12864_Clear_Screen();
             }
			break;
  }
 } 
 
//右键处理  
void key_right(void)
 {
  switch(disp_set)
   {
    case 1:
	        disp_set=0;
	        LCM12864_Clear_Screen();  //清屏
	        disp_default();
 	        break;
			
	case 2:		
            if(show>50)
             {
	          show-=50;
			  LCM12864_Clear_Screen();  //清屏
	          disp_set=1;
	         }
			break;
  }
 }

void key_transact(unsigned char temp)
 {
  switch(temp)
   {
    case 1: key_left();
			 break;
    case 2: key_up();
			 break;
			  
	case 3: if(mode==3)
		      {
		       mode=0;
		      }
		     else
		      {
		       mode++;
		      }
			 break;
			 
    case 4: key_down();
			 break; 
			  
	case 5:key_right();
             break;		  
	 }
	 
 }


//********************************************************************************************
//按键处理		key()
//
//*********************************************************************************************/
void key(void)
 {
  unsigned char ankey;

⌨️ 快捷键说明

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