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

📄 ym12864.c

📁 YM12864液晶模块的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
**************************************************************/
void write_data( int data)
{
  while(IsBusy)
   {
    readstate();
	delay(1);
   }

  RS_1;
  RW_0; 
  DDRD=0xff;
  PORTD=data;  
  E_1;
  E_0;
}


/**********************************************************************
清除屏幕内容:
变量:i ,j
调用模块:sendcommnd(),write_data()
模块功能:选择开始清除的位置,向该位置寄存器写入0
***********************************************************************/
void clr_scr()
{
  int i,j;
  sendcommnd(0xc0);
  sendcommnd(0x40);
  for(i=0;i<8;i++)
  {
  sendcommnd(0xb8|i);
    for(j=0;j<64;j++)
        {
		write_data(0x00); 		
		}
  }
}

/****************************************************************
显示屏初始化函数
****************************************************************/
void init_lcd()
{
  IsBusy=0;
  DDRB=0xff;
  PORTB=0xff; 
  DDRC=0x00;
  sendcommnd(0x3e);
  CS1_1;
  CS2_1;
  sendcommnd(chooselei(0));
  sendcommnd(chooseline(0));
  sendcommnd(choosepage(0)); 
  sendcommnd(0x3f);
}


/******************************************************************
显示菜单函数
参数:
  *dat          page          lei         color             wordnum
 数据地址      显示的页      显示的列    显示文本颜色      显示数据个数
使用规则:
调用该函数显示一页内容,选择列超过128自动对齐,列数可以超过64且能
自动翻屏,显示文字数据不能超过8个
********************************************************************/ 
void dispwd(const char *dat,char page,char lei,char color,char wordnum )			
{ 
 
  int i,j,t,k=-1; 
 
  char setcolor; 
  if(lei>(128-16*wordnum))
  lei=(128-16*wordnum);
  if(wordnum>8)
   wordnum=8;
  CS1_1;CS2_0;  
    for(i=0;i<(16*wordnum);i++)
	{  if((i%16)==0)
	     {
		 k++;
	     if(color&(1<<k))
		   setcolor=0;
		   else setcolor=1;
         }  
	  for(j=0;j<2;j++)
	    {
		 if((i+lei)>=64)
		    {CS1_0;CS2_1;}	
		 sendcommnd(chooselei((i+lei)%64));
		 sendcommnd(choosepage(page+j));
		 if(setcolor==0)
		 write_data(~(*dat));
		 else  write_data(*dat);
		 dat++; 
		}
	 }	
   
}


/********************************************************************
读取HC542返回的按键值
变量:data[7]     接收返回按键值
具体命令数据接收规则和时序关系参考HC542数据手册
********************************************************************/
unsigned char GetKey()
{ 
  int i;
  char data[7];    
  DIN_1;
  DCLK_0;
  DCLK_1;
  DCLK_0;
  DCLK_1;
  DCLK_0;
  DCLK_1; 
  
  DIN_0;
  DCLK_0;
  DCLK_1;
  DLOAD_0;
  DLOAD_1;
  
  for(i=6;i>=0;i--)
    {
	  if(PINC&0x02)
	   data[i]=1;
	  else  data[i]=0;
	  DCLK_0;
	  DCLK_1;
	}
   return (data[5]*32+data[4]*16+data[3]*8+data[2]*4+data[1]*2+data[0]);
   
}

/***********************************************************************
开启HC542键盘扫描功能
具体命令数据接收规则和时序关系参考HC542数据手册
***********************************************************************/
void init_keyb()
{
  int i;
  DDRC=0x01;
  for(i=0;i<12;i++)
  {
  if(0x402&(1<<i))
    DIN_1;
    else DIN_0;
	
	DCLK_0;
	DCLK_1;
		
  }
  DIN_1;
  DLOAD_0;
  DLOAD_1;
}

/*******************************************************************
画图函数
在显示屏上画一幅128*64的图像,具体图像内容覆盖PICTURE数组即可
*******************************************************************/
void draw_picture(const char *data)
{
  int i,j,t;

   for(j=0;j<8;j++)
   { CS1_1;CS2_0; 
     sendcommnd(choosepage(j));
	 sendcommnd(chooselei(0));  
      for(i=0;i<64;i++)
       {	  
	    write_data(*data);
	    data++; 
       }
	 CS1_0;CS2_1; 
     sendcommnd(choosepage(j));
	 sendcommnd(chooselei(0)); 
	 for(i=0;i<64;i++)
       {	  
	    write_data(*data);
	    data++; 
       } 
    }
  CS1_1;CS2_1;
}


/************************************************************************
程序入口函数
变量:MenuSelect            所选择菜单
************************************************************************/			
void main()
{  int i;
  MenuSelect=0x03;
  init_lcd();
  init_keyb();
  //clr_scr(); 
  //dispwd(menu,0,0,MenuSelect,8);
  clr_scr();
  draw_picture(picture);		
	while(1)
	{
	 if((PINC&0x02)==0) 
	    key=GetKey();
	 if(key!=-1)
	   {
	     switch(key)
		 {
		 case 2:
		       clr_scr();
		       MenuSelect<<=2;
		       if(MenuSelect>0xc0)
		           MenuSelect=0x03;
			   if(MenuSelect==0x03)	 
			  {
			  dispwd(num1[4],2,0,0,1); 
				dispwd(fuhao[2],2,11,0,1);
				dispwd(num1[5],2,20,0,1); 
				dispwd(fuhao[1],2,30,0,1);
			  } 
		       dispwd(menu,0,0,MenuSelect,8);  
		          key=-1;
		          break;
		 case 0:
		       clr_scr();
		       MenuSelect>>=2;
		      if(MenuSelect<0x03)
		         MenuSelect=0xc0;
				 if(MenuSelect==0x03)	 		    
		        {
			    dispwd(num1[4],2,0,0,1); 
				dispwd(fuhao[2],2,11,0,1);
				dispwd(num1[5],2,20,0,1); 
				dispwd(fuhao[1],2,30,0,1);
				}
				dispwd(menu,0,0,MenuSelect,8);
		         key=-1;
		         break;
		 case 1:
		      	clr_scr();
				draw_picture(picture);				
				 key=-1;
		         break; 
		case 3:
		  		dispwd(num1[0],2,0,0,1); 
		        key=-1;
		        break; 
		case 0b101011:
		       	
		        key=-1;
		        break; 	
		 }
	   
	   }	
	}
	
}

⌨️ 快捷键说明

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