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

📄 lcd.c

📁 AVR ATmega128L的LCD程序
💻 C
字号:
#include<mega128.h>
#include<string.h>
#include<ZIKU.h>

#define uchar unsigned char
#define uint  unsigned int   

#define DISP_ON    0x3f
#define DISP_OFF   0x3e
#define COL        0x40    //列地址
#define PAGE 0xb8          //行地址
#define START_LINE 0xc0  
 
#define LCD_BUS      PORTA
#define LCD_BUS_DDR  DDRA
#define LCD_CON      PORTG
#define LCD_CON_DDR  DDRG 
#define KEY_BUS      PORTC
#define KEY_BUS_DDR  DDRC  

#define  E         0              //液晶使能
#define  RW        1              //液晶读写
#define  DI        2              //液晶数据指
#define  CS1       3              //  CS1
#define  CS2       4              //  CS2
#define  SET(N)  (LCD_CON|=1<<N)
#define  CLR(N)  (LCD_CON&=~(1<<N))
/********************函数声明*****************************/
void       LCDDisplayChinese(uchar page,uchar col,flash uchar *str,uchar n);
void       LCDDisplayEnglish(uchar page,uchar col,flash uchar *str,int n);
void       LCDDisplayNumber( uchar page,uchar col,flash uchar *str,uchar n);
void       LCDInit(void);
void       LCDClear(void);
void       delay(uint);         //延时程序
void       LCDWriteCmd(uchar);    //写命令操作字
void       LCDWriteData(uchar);   //写数据   
void       PortInit(void);

int dd[4];
uchar PY_num;
uchar state=0; 
 flash uchar *p[]={PY_mb_ao,PY_mb_a,PY_mb_zai}; 
unsigned char T9PY(unsigned char *str)
{
    unsigned int i,j=0;
    unsigned char length;
    length=strlen(str);
    PY_num=0;                              
    if(*str=='\0')return(0);                 //如果输入空字符返回0
    while(j <400)                            //待查询记录条数
    {											
        for(i=0;i<length;i++)
        {
               if(*(str+i)!=*(PY_number[j]+i))    //检查字符串匹配     
		break;                        //发现字母串不配,退出               
        }
        if(i==length&&PY_num<=3)    
        {
                              
               dd[PY_num]=j;
               PY_num++; 
        }
        j++;
    }
    if (PY_num>0)
    {
	return(1);                
    }
    else
    {
         return(0);
    }
}


/**********************************************************
*            KEY_BUS.7>---0----1----2----3      
*		      |	 |    |	 |
*	   KEY_BUS.6>---4----5----6----7
*	                |	 |    |    |
*	   KEY_BUS.5>---8----9----A----B
*		      |	 |    |    |
*	   KEY_BUS.4>---C----D----E----F
*	                |    |    |    |
*	   KEY_BUS.3  KEY_BUS.2  KEY_BUS.1  KEY_BUS.0
*4*4键盘输入函数
*函数声明:uchar KeyInput();
*函数参数:无
*
*
*
**********************************************************/
uchar KeyInput()
{
          uchar keycode=0xff,temp,i;
	DDRC=0xf0;
	KEY_BUS=0x0f;
	temp=PINC&0x0f; 
	if(temp!=0x0f)              //有键按下
	{
	      delay(5);
	      KEY_BUS=0x7f;
	      for(i=0;i<4;i++)
	      {
		 temp=PINC&0x0f;
                     if(temp==0x07)
	           {    
	                    keycode=i*4;
			break;
	           }
	           else if(temp==0x0b)
		 {
	                   keycode=i*4+1;
	                   break;
		 }
                     else if(temp==0x0d)
	           {
	                  keycode=i*4+2;
	                  break;
		 }
                     else if(temp==0x0e)
		 {
	                  keycode=i*4+3;
	                  break;
		 }
	           KEY_BUS=(KEY_BUS>>1)|0x80;
	    }
	    while((PINC&0x0f)!=0x0f)   //等待释放
	    {
			 KEY_BUS=0x0f;
	    }	 							             
	    
	 }
	 return keycode;
}

/**********************************************************
*
*延时函数
*函数声明:void delay(uint t);
*函数参数:t
*
*
**********************************************************/
void delay(uint t)             
{
      uint i,j;
      for(i=0;i<t;i++)
            for(j=0;j<10;j++);
}

/**********************************************************
*
*向LCD写命令函数
*函数声明:void LCDWriteCmd(uchar cmd);
*函数参数:cmd(具体命令查看数据手册)
*
*
**********************************************************/

void LCDWriteCmd(uchar cmd)  
{

      CLR(DI); 
      CLR(RW);
      LCD_BUS=cmd;
      SET(E);
      CLR(E);
} 

/**********************************************************
*
*向LCD写数据函数
*函数声明:void LCDWriteData(uchar dout);
*函数参数:dout为要向LCD写的数据
*
*
**********************************************************/
void LCDWriteData(uchar dout)  
{
      SET(DI); 
      CLR(RW);
      LCD_BUS=dout;
      SET(E);
      CLR(E);
}

/**********************************************************
*
*初始化LCD屏函数
*函数声明:void LCDInit(); 
*函数参数:无
*函数作用:对LCD做初始化操作
*
**********************************************************/
void LCDInit()  
{

	  delay(100);
            SET(CS2); CLR(CS1);
	  delay(100);
	  LCDWriteCmd(DISP_OFF);
	  LCDWriteCmd(PAGE);
	  LCDWriteCmd(START_LINE);
	  LCDWriteCmd(COL);
	  LCDWriteCmd(DISP_ON);
	  CLR(CS2); SET(CS1);
	  delay(100);
	  LCDWriteCmd(DISP_OFF);
	  LCDWriteCmd(PAGE);
	  LCDWriteCmd(START_LINE);
	  LCDWriteCmd(COL);
	  LCDWriteCmd(DISP_ON);
}


/**********************************************************
*
*清屏函数
*函数声明:void LCDClear();
*函数参数:无
*函数作用:
*
**********************************************************/
void LCDClear()  
{
      uchar j,k;
      SET(CS2);CLR(CS1);
      for(k=0;k<8;k++)
      {
            LCDWriteCmd(PAGE+k);
            LCDWriteCmd(COL);       //列地址0
	        for(j=0;j<64;j++)     //列地址自动加一
	              LCDWriteData(0x00);
      }
	  CLR(CS2);SET(CS1);
	  for(k=0;k<8;k++)
      {
	        LCDWriteCmd(PAGE+k);
	        LCDWriteCmd(COL);           //列地址0
	        for(j=0;j<64;j++)         //列地址自动加一
		        LCDWriteData(0x00);
      }
}

/**********************************************************
*
*显示12*16点阵的汉字函数
*函数声明:void LCDDisplayChinese(uchar page,uchar col,uchar code *str,uchar n);
*函数参数:page为页地址(0-7),col为列地址(0-127),str为数组名,n为要显示第n个汉字点阵
*函数作用:
*
**********************************************************/
void LCDDisplayChinese(uchar page,uchar col,flash uchar  *str,uchar n)
{
        uchar i,j;
	  uchar num;
	  if(col<=52)
	  {
	        SET(CS2);CLR(CS1);
              for(j=0;j<2;j++)
	        {
		          LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
		          for(i=0;i<12;i++)
		                LCDWriteData(str[n*24+12*j+i]);
	        }
	  }
	  else if(col>=64)
	  {
		  CLR(CS2);SET(CS1);
		  col=col-64;
              for(j=0;j<2;j++)
	        {
		          LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
		          for(i=0;i<12;i++)
		                LCDWriteData(str[n*24+12*j+i]);
	        }
	  }

	  
	  else if(col>52&&col<64)    //处理跨屏幕的汉字书写的函数
	  {
	        num=64-col;										  
		  SET(CS2);CLR(CS1);
		  for(j=0;j<2;j++)
		  {
		          LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
		          for(i=0;i<num;i++)
		                LCDWriteData(str[n*24+12*j+i]);  
		  }
		  CLR(CS2);SET(CS1);
		  col=0;
		  for(j=0;j<2;j++)
		  {
		          LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
		          for(i=num;i<12;i++)
		                LCDWriteData(str[n*24+12*j+i]);  
		  }
      }
}

/**************************************************************************************************
*
*显示6*16点阵的英文函数
*函数声明:void LCDDisplayEnglish(uchar page,uchar col,uchar code *str,uchar n);
*函数参数:page为页地址(0-7),col为列地址(0-127),str为数组名,n为要显示第n个英文点阵
*函数作用:
*
**************************************************************************************************/
void LCDDisplayEnglish(uchar page,uchar col,flash uchar *str,int n)
{
          int i,j,num;
	if(col<=58)
	{
	      SET(CS2);CLR(CS1); 
	      for(j=0;j<2;j++)
	      {
		        LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
		        for(i=0;i<6;i++)
			          LCDWriteData(str[(n*12+6*j+i)]);
	      }
	}
	else if(col>=64)
	{
	      CLR(CS2);SET(CS1);
	      col=col-64;
		for(j=0;j<2;j++)
	      {
		        LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
		        for(i=0;i<6;i++)
			          LCDWriteData(str[(n*12+6*j+i)]);
	      }

	}
	else if(col>58&&col<64)
	{
	      num=64-col;
	      SET(CS2);CLR(CS1);  
	      for(j=0;j<2;j++)
	      {
		        LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
		        for(i=0;i<num;i++)
			          LCDWriteData(str[(n*12+6*j+i)]);
	      }
		  CLR(CS2);SET(CS1);
		  col=0;
		  for(j=0;j<2;j++)
		  {
		          LCDWriteCmd(PAGE+page+j);LCDWriteCmd(COL+col);
		          for(i=num;i<6;i++)
		                LCDWriteData(str[(n*12+6*j+i)]);  
		  }
	}
}



/**********************************************************
*显示小数字函数
*函数声明:void LCDDisplayNumber(uchar page,uchar col,uchar code *str,uchar n);
*函数参数:page为页地址(0-7),col为列地址(0-127),str为数组名
*函数作用:显示数字0-9
*
*
**********************************************************/
void LCDDisplayNumber(uchar page,uchar col,flash uchar  *str,uchar n)
{
    uchar i;
	if(col<64)
	{
		  SET(CS2);CLR(CS1); 
	}
	else
	{
		  CLR(CS2);SET(CS1);
		  col=col-64;
	}
	LCDWriteCmd(PAGE+page);LCDWriteCmd(COL+col);
	for(i=0;i<5;i++)
		LCDWriteData(str[5*n+i]);
	

}

void PortInit(void)
{
      LCD_BUS_DDR=0xff;
      LCD_CON_DDR=0xff;
}


void Welcome(void)
{
    uchar i,ii;
    uchar str[]="1234";
    flash uchar *pp[]={PY_mb_nuo,PY_mb_za};
    LCDClear();
    for(i=0;i<6;i++)
          LCDDisplayChinese(3,24+12*i,pp[1],i);
    for(i=0;i<strlen(str);i++)
    {
          ii=str[i]-32;
          //LCDDisplayEnglish(5,12+6*i,ASCII,ii);
    }            
    while(1);     
}
/**********************************************************
*
*主函数
*函数声明:void main (void) ;
*函数参数:无
*函数作用:实现一个有限的状态机
*
**********************************************************/
void main () 
{     
        uchar i;
        int j;
       
        uchar ss[]="948264";
        PortInit();
        LCDInit();
        LCDClear();
        //T9PY(ss);
        for(i=0;i<6;i++)
          LCDDisplayChinese(3,12*i,PY_mb[dd[0]],i);  
       //for(j=0;j<20;j++)
          //LCDDisplayEnglish(5,6*j,ASCII,20+j);   
        while(1)
        {
            if(state==0) Welcome();
        }
      
	 
}

⌨️ 快捷键说明

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