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

📄 lcd_cn.c

📁 基于AVR单片机(ATMega64)的辞别力拼图游戏
💻 C
字号:
/*电子拼图
  建立时间:     2007 3 9
  最后修改时间: 2007 3 11
  广东工业大学自动化学院自动化04级3班吴子洲 */
  
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define dat 1
#define com 0	
#include <avr/io.h>
#include <avr/delay.h>
#include <math.h>

#define rs_s PORTD|=0x80		//set rs
#define rs_c PORTD&=~0x80		//clr rs
#define e_s PORTC|=0x01			//set e
#define e_c PORTC&=~0x01		//clr e
#define rw_s PORTC|=0x02		//set rw
#define rw_c PORTC&=~0x02		//clr rw

#define  CPU_CRYSTAL    (7.3728) 	//CPU Ck

#define  dy(us)\
  _delay_loop_2((uint)((us)*CPU_CRYSTAL/4)) 
  
volatile uchar disbuf[1024];		//display buffer
volatile uchar ss[16];		//顺序
volatile uchar sor;		//光标位志
volatile uchar sorf;		//光标志记

void delay(uint t)
{
 while(t--)
   dy(1000);
}

void w_lcd(uchar dat_com,uchar cont)		//向LCD写命令或数据,由dat_com决定
{
 if(dat_com)
    rs_s;
 else 
    rs_c;
 PORTA=cont;
 e_s;
 e_c;
 if(dat_com==0&&cont==0x01)  
    dy(1600);
 else	
    dy(60);	//data
}

void set(uchar sway)		//seting display way
{
 if(sway==0x00)   
    w_lcd(com,0x32), w_lcd(com,0x08); 		//not display
 else if(sway==0x01) 
    w_lcd(com,0x32), w_lcd(com,0x0c), w_lcd(com,0x06); //cursor not flash, not move
 else if(sway==0x02)  
    w_lcd(com,0x32), w_lcd(com,0x0d), w_lcd(com,0x06);	//cursor flash, not move
 else if(sway==0x03)  
    w_lcd(com,0x32), w_lcd(com,0x0c), w_lcd(com,0x07); //cursor not flash, move left when writing 
 else if(sway==0x04)
    w_lcd(com,0x32), w_lcd(com,0x0d), w_lcd(com,0x07); //cursor flash, move ledt wehn writing
// else if(sway==0x40)  w_lcd(com,0x34), w_lcd(com,0x34);		//not display pitures
// else if(sway==0x41)  w_lcd(com,0x36), w_lcd(com,0x36);		//display pitures
}

/*-----------------------------------------------*/
//当type=3,在x0,y0处反白显示16*xl*16.
//当type=2,在x0,y0处前半反白显示8*xl*16.
//当type=1时,在x0,y0处后半反白显示8*xl*16.
//当type=时,不反白显示
//xl为反白显示的长度
void rv(uchar type,uchar xx0,uchar yy0,uchar xl)
{ uchar i,j;
  uchar data1,data2,x0,y0;
  if(type==0) 
     data1=0,data2=0;
  else if(type==1)
     data1=0,data2=0xff;
  else if(type==2)
     data1=0xff,data2=0;
  else if(type==3)
     data1=0xff,data2=0xff;
  if(yy0>1)
     y0=(yy0-2)*16+0x80,x0=xx0+0x88;
  else
     y0=yy0*16+0x80,x0=xx0+0x80;
  for(j=0;j<16;j++)
  { 
   for(i=0;i<xl;i++)
    { 
	  w_lcd (com,0x34);
      w_lcd (com,y0+j);
      w_lcd (com,x0+i);
      w_lcd (com,0x30);
      w_lcd (dat,data1);
      w_lcd (dat,data2);
    }
  }
  w_lcd (com,0x36);
}

void rvn(void)
{
 rv(0,0,0,8);
 rv(0,0,1,8);
 rv(0,0,2,8);
 rv(0,0,3,8);
}

void clr(uchar ty)		
{
 uint i,j;
 if(ty==1||ty==3)		//clean charter
    w_lcd(com,0x32), w_lcd(com,0x01);
 if(ty==2||ty==3)		//clean piture
   {
    w_lcd(com,0x34);
    for(j=0;j<32;j++)		//draw the down half piture
      {
	   w_lcd(com,0x80+j);		//Y address
       w_lcd(com,0x80);			//X address
       for(i=0;i<32;i++)
          w_lcd(dat,0);
      }
	}
 if(ty==8)		//clr dis buffer
   {
    for(i=0;i<1024;i++)
	  disbuf[i]=0;
   }
   
}

void lcd_ini(void)
{
 set(1);
 clr(3); 
 clr(8);
}

/*光标定位*/
void go(uchar xxx, uchar yyy)
{ w_lcd(com,0x32);
  if(yyy==0)  w_lcd(com,0x80+xxx);
  else if(yyy==1) w_lcd(com,0x90+xxx);
  else if(yyy==2) w_lcd(com,0x88+xxx);
  else if(yyy==3) w_lcd(com,0x98+xxx);
}
 
void wn(uchar num1,uchar num2)		//wtite nunbers or letters
{if(num1<10)
    w_lcd(dat,num1+0x30);
 else if(num1<16)
    w_lcd(dat,num1+0x37);
 else 
    w_lcd(dat,num1);
 if(num2<10)
   w_lcd(dat,num2+0x30);
 else if(num2<16)
   w_lcd(dat,num2+0x37);
 else
   w_lcd(dat,num2);
}		//*/


void wc(uchar *chan)		//writer charter
{
 uchar i;
 for(i=0;chan[i]!='\0';i++)
    w_lcd(dat,chan[i]);
}

void wh(uchar const *chan)	//write charter by look up table
{
 uchar i;
 uchar ttp;
 ttp=pgm_read_byte(chan);
 for(i=1;ttp!='\0';i++)
  {
   w_lcd(dat,ttp);
   ttp=pgm_read_byte(chan+i);
  }
}

void wu (uchar const *ch0, uchar const *ch1, uchar const *ch2, uchar const *ch3)
{ 
  clr(1);
  set(1);
  go(0,0);
  wh(ch0);		//write line 0
  go(0,1);
  wh(ch1);		//write line 1
  go(0,2);
  wh(ch2);
  go(0,3);
  wh(ch3);
}


void wp(void)		//write piturn to lcd
{
 uchar i,j;
 w_lcd (com,0x34);		//切换到扩展指令
  for(j=0;j<32;j++)
    {
	 w_lcd (com,0x80+j);		//写Y地址
     w_lcd (com,0x88);			//写X地址
     for(i=0;i<16;i++)
	   w_lcd(dat,disbuf[512+j*16+i]);// (dat,imge[j*16+i*2]);  //写数据
    }
  for(j=0;j<32;j++)
    {
	 w_lcd(com,0x80+j);		//Y address
	 w_lcd(com,0x80);		//X address
	 for(i=0;i<16;i++)
	   w_lcd(dat,disbuf[j*16+i]);		//
	}
  w_lcd(com,0x36);		//开显示
} 


void piture(uchar const *imge)		//write a piture 
{
 uint i;
 for(i=0;i<1024;i++)
   disbuf[i]=pgm_read_byte(imge+i);
 wp();
}

void w16(void)
{
 uchar i,j,k,t1;
 uint t2;
 for(i=0;i<4;i++)
   {
    for(j=0;j<4;j++)
	  {
	   for(k=0;k<16;k++)
	     {
		  t1=ss[4*i+j];
		  t2=16*k+2*j+256*i;
		  if(t1!=0xff)
	        {
			 disbuf[t2]  =pgm_read_byte(C1+32*t1+2*k);
		     disbuf[t2+1]=pgm_read_byte(C1+32*t1+2*k+1);
			}
		  else
		    {
			 disbuf[t2]=0x00;
			 disbuf[t2+1]=0x00;
			}
		 }
	  }
   }	//*/
}

void wsor(void)	//write the cursor
{
 uchar x,y,k;
 uint  t2; 
 x=sor%4;
 y=sor/4;
 if(sorf)		//已选定
   {
    w16();
	for(k=0;k<16;k++)
	  {
	   t2=16*k+2*x+256*y;
	   disbuf[t2]^=0xff;		//反白
	   disbuf[t2+1]^=0xff;
	  }
	set(1);
	wp(); 	
   }
 else		//未选定, 显示光标
   {
    w16();
    wp();
    go(x,y);
	set(2);
   }

}

⌨️ 快捷键说明

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