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

📄 lcd_elbe.c

📁 这是我写的51单片机控制LCD的程序 用c写的 在proteus 6.9中仿真成功 并且实际硬件调试也成功的
💻 C
字号:
/***************************************************************\
|*          12864LCD显示程序 proteus6.9 仿真AMPIRE128*64       *|
|*          制作人:熊涛                                       *|
|*          时间:2007年4月12日                                *|
|*          接口定义:P1接数据  DB7~DB0                         *|
|*                    P2.0 P2.1 P2.2 P2.3 P2.4 接控制线        *|  
|*                    具体见定义                               *|
\***************************************************************/




/***************************************************************\
|*  注:本程序只能写16*16的汉字 并且有一个小问题 就是        *|
|*     当字库中汉字的代码的第一个数据不是0x00时 该汉字就不     *|
|*     能显示出来 调试时发现是因为不能检索到那个汉字 具体原    *|
|*     因还在调试中 直接写汉字句子时注意两个字节一个字,不要    *|
|*     弄半角的字符或标点符号否则后面的汉字将找不到            *|
|*       2007年4月14日1时 修改     熊涛                        *|
\***************************************************************/

#include <reg52.h>
#include <all_code.h>       //包含字库 该字库采用晓奇工作室液晶字模提取软件默认保存的文件 采用结构体数组定义的方法
#include <string.h>


typedef unsigned char uchar;
typedef unsigned int  uint;

struct word_BUFFER  
   { uchar  word[2]; } ;
  struct word_BUFFER word_buf[33];  //定义结构体数组用来存储待显示的汉字 共32个 

uchar bank=0;           //设置第几行反显 0表示不反显 1~4表示各行的反显
uchar key=0;            //第几个键被按下

sbit DI  =P3^7;       // 数据\指令 选择
sbit RW  =P3^6;       // 读\写 选择
sbit E   =P3^5;       // 读\写使能
sbit CS2 =P3^4;       // 片选1
sbit CS1 =P3^3;       // 片选2
sbit RST =P3^2;       // 复位



keych(void) //检测是否有键按下子程序//
 { uint n;
   if(P2==0xf0) return(0);
   else while(P2&0xf0!=0xf0) for(n=0;n<60000;n++);
   return(1);}

keyscan() // 检测是哪个键按下子程序//
 { uchar m,n;
   uchar code k[4]={0xfe,0xfd,0xfb,0xf7};
   for(m=0;m<4;m++)
  { P2=k[m];
    n=P2+(m*m+5)*m/6;//此处要注意m为整型
	switch(n)
	{ case 0x7e:key=0+m*4;break;
	  case 0xbe:key=1+m*4;break;
	  case 0xde:key=2+m*4;break;
	  case 0xee:key=3+m*4;break;}
      }   }

/**********************************************\
|*   写命令子程序                             *|
|*   入口参数:cmd 控制命令数据               *|
|*   出口参数:null                           *|
|*   调用函数: null                           *|
\**********************************************/ 
void write_cmd(uchar cmd)             //写命令子程序 
{ RW=0;
  DI=0;    //DI=0 写命令 
  E=1;
  P1=cmd;
  E=0;       //RW="L",E="H->L" DB7~DB0的数据被写到IR或DR 
                   }

/**********************************************\
|*   写数据子程序                             *|
|*   入口参数:dat 显示字符的数据             *|
|*             oppo 标志位 1:显示阳文         *|
|*			               0:显示阴文         *|
|*   出口参数:null                           *|
|*   调用函数: null                           *|
\**********************************************/ 
void write_dat(uchar dat,bit oppo)             //写数据子程序
{ RW=0;
  DI=1;   //DI=1  写数据
  E=1;
  if(oppo==0) P1=~dat;                         //按位取反得阴文
  if(oppo==1) P1=dat;
  oppo=1;
  E=0;      //RW="L",E="H->L" DB7~DB0的数据被写到IR或DR 
                      }

/**********************************************\
|*   设置显示起始行 X地址和Y地址              *|
|*   入口参数:st_line 显示起始行 0~63        *| 
|*             x_add   页地址  8行为一页 0~7  *|
|*   		   y_add   Y地址  0~128           *|
|*   出口参数:null                           *|
|*   调用函数: write_cmd()                    *|
\**********************************************/ 

void set_dis(uchar st_line,uchar x_add,uchar y_add)  //设置显示起始行 X地址和Y地址
{
  write_cmd(st_line+0xc0);      //+0xc0是参照设置起始行的格式
  write_cmd(x_add+0xb8);        //+0xb8是参照设置页地址的格式
  if(y_add<64) { CS1=0;CS2=1;write_cmd(y_add+0x40);} //Y_add地址实际上只有0~63 采用CS1和CS2选左右半屏
      else     { CS1=1;CS2=0;write_cmd(y_add);}
 }



/***********************************************\
|*   写汉字子程序1 可以在任意位置写入          *|
|*   入口参数:st_line 显示起始行 0~63         *| 
|*             x_add   页地址  8行为一页 0~7   *|
|*   		   y_add   Y地址  0~128            *|
|*             Index[2] 字符串数组 用来存储汉字*|
|*   出口参数:null                            *|
|*   调用函数: write_cmd()  set_dis()          *|
|*             strcmp()     write_dat()        *|
\***********************************************/ 
void write_word_all(uchar st_line,uchar x_add,uchar y_add,uchar Index[2]) //写入汉字
{ uchar i,j;
  bit oppo=1;
  
   
  if(y_add<64) { CS1=0;CS2=1;write_cmd(y_add+0x40);}
      else     { CS1=1;CS2=0;write_cmd(y_add);}
  set_dis(st_line, x_add,y_add);
  if(bank%5==0) oppo=1;
  if(bank%5==1&&(x_add==0||x_add==1)) oppo=0; 
  if(bank%5==2&&(x_add==2||x_add==3)) oppo=0;
  if(bank%5==3&&(x_add==4||x_add==5)) oppo=0;
  if(bank%5==4&&(x_add==6||x_add==7)) oppo=0;

  for(i=0;i<255;i++)
  { if (GB_16[i].Index[0]==Index[0] && GB_16[i].Index[1]==Index[1])   //汉字作为双字节字符串处理 采用顺序检索方式查找结构体名
     {  for(j=0;j<16;j++)  write_dat(GB_16[i].Msk[j],oppo);   //逐字节写入
        set_dis(st_line, x_add+1,y_add);                 //下一页 写字的下半部分
        for(j=16;j<32;j++)  write_dat(GB_16[i].Msk[j],oppo);break;}  //此处用break是为了能跳出for循环
         
		                           }
                                          }



/***********************************************\
|*   写汉字子程序2  只能在指定位置写入         *|
|*   入口参数:n 指定地址 0~31 全屏32字(16*16) *|
|*             Index[2] 字符串数组 用来存储汉字*|
|*   出口参数:null                            *|
|*   调用函数: write_word_all()                *|
|*                                             *|
\***********************************************/ 
void write_word(uchar n,uchar Index[2]) //写入汉字
{ uchar st_line=0,x_add=n%32/8*2,y_add=n%32%8*16;
  write_word_all(st_line,x_add,y_add,Index); 
  }                                          



/***********************************************\
|*   写句子子程序                              *|
|*   入口参数:sentence[] 待写入汉字 组成字符串*|
|*             按照0~31的顺序写入              *|
|*   出口参数:null                            *|
|*   调用函数: strlen()     write_word()       *|
|*                                             *|
\***********************************************/ 
void write_sentence(uchar sentence[255])
{ 
  uchar i,j=0; 
    if(keych()==1) 
  {keyscan();
   if(key==0) bank++;
   if(key==1) bank--;
	               }  
  for(i=0;i<strlen(sentence)/2;i++)
  { word_buf[i].word[0]=sentence[i*2];word_buf[i].word[1]=sentence[i*2+1];
   //从sentence中两个两个的取字符串即汉字 注意不要弄半角的字符或标点符号,否则后面的汉字将找不到          
    write_word(j++,word_buf[i].word); 
                               }      }
							 			  
/*void Scrolling(uchar sentence[255])  //滚动显示子程序
{ uchar i,j=0;
  int k=2000;  
  for(i=0;i<strlen(sentence)/2;i++)
   { for(j=0;j<=i;j++)
     { word_buf[i].word[0]=sentence[i*2];word_buf[i].word[1]=sentence[i*2+1];
       write_word(i,word_buf[i].word); ;                       }   }  }  */

/**********************************************\
|*   初始化子程序                             *|
|*   入口参数:null                           *|
|*   出口参数:null                           *|
|*   调用函数: null                           *|
\**********************************************/ 
/*void initial(void)                        //初始化子程序
{ write_cmd(0x3e);   //关显示
  } */


   

/****************************************************\
|*   主程序入口                                     *|
|*   12864LCD显示程序 proteus6.9 仿真AMPIRE128*64   *|
|*   制作人:熊涛                                   *|
|*   时间:2007年4月12日                            *|
|*                                                  *|
\****************************************************/ 
void main(void)                               //主程序
{P0=0xaa;
 // uint n=65535;
  //write_cmd(0x3e);      //关显示

 // 故人西辞黄鹤楼,烟花三月下扬州。孤帆远影碧空尽唯见长江天际流
 // write_sentence("单片机液晶显示  武汉理工大学余区熊涛制作    悠悠苍天奈何独立苍茫");
 // write_sentence("故人西辞黄鹤楼,烟花叁月下扬州。");
 // write_sentence("孤帆远影碧空尽,唯见长江天际流。");
 // write_word(31,"。");
 // write_word_all(0,6,112,"黄");
  //Scrolling("单片机控制液晶武汉理工大学熊涛制作");
  
  
  while(1)
  {  P2=0xf0;
     P0=~P0;
     write_sentence("单片机液晶显示  武汉理工大学余区熊涛  制作      悠悠苍天独立苍茫");
   //  while(n--);
//	 n=65535;
//	 while(n--);
//	 n=65535;
//	 P0=0x55;
  //   write_sentence("                                                                ");
   //  write_sentence("悠悠苍天        奈何独立苍茫    熊涛制作        单片机液晶显示  ");
//     while(n--); 
//	 n=65535;
//	 while(n--);
 //    write_sentence("                                                                ");
//	 n=65535;
	 CS1=CS2=1;
     write_cmd(0x3f);     }             //开显示 
 /* while(1)
   { write_sentence("故人西辞黄鹤楼,烟花叁月下扬州。");
     while(k--);
     write_sentence("孤帆远影碧空尽,唯见长江天际流。"); 
	 while(k--);
                             
                                   }*/       }       

⌨️ 快捷键说明

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