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

📄 复件 lcd_elbe.c

📁 大家好
💻 C
字号:
/***************************************************************\
|*          12864LCD显示程序 proteus6.9 仿真AMPIRE128*64       *|
|*          制作人:熊涛                                       *|
|*          时间:2007年4月12日                                *|
|*          接口定义:P1接数据  DB7~DB0                         *|
|*                    P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 接控制线   *|  
|*                    具体见定义                               *|
\***************************************************************/

#include <reg52.h>
#include <string.h>
#include <Asc8_16.h> 
#include <start.h>
#include <scancodes.h>


typedef unsigned char uchar;
typedef unsigned int  uint;


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;       // 复位

sbit KEY_DATA = P2^0;
sbit KEY_CLK  = P2^1;


/**********************************************\
|*   写命令子程序                             *|
|*   入口参数: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            *|
|*             ASC     字符的ACSII码           *|
|*   出口参数:null                            *|
|*   调用函数: write_cmd()  set_dis()          *|
|*             strcmp()     write_dat()        *|
\***********************************************/ 
void write_num_all(uchar st_line,uchar x_add,uchar y_add,uchar ASC)
{ uchar 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);
  for(j=0;j<8;j++)   write_dat(nAsciiDot[(ASC-32)*16+j],oppo);   //逐字节写入
  set_dis(st_line, x_add+1,y_add);                 //下一页 写字的下半部分
  for(j=8;j<16;j++)  write_dat(nAsciiDot[(ASC-32)*16+j],oppo);  //此处用break是为了能跳出for循环  
                                                            }
 
/***********************************************\
|*   写数字标点字母子程序2  只能在指定位置写入 *|
|*   入口参数:n 指定地址 0~63 全屏32字(16*16) *|
|*              ASC     字符的ACSII码          *|
|*   出口参数:null                            *|
|*   调用函数: write_num_all()                 *|
|*                                             *|
\***********************************************/ 
void write_num(uchar n,uchar ASC) //写入汉字
{ uchar st_line=0,x_add=n%64/16*2,y_add=n%64%16*8;
  write_num_all(st_line,x_add,y_add,ASC); 
  }                                          


/***********************************************\
|*   画图子程序     全屏画图                   *|
|*   入口参数:图片数据代码数组 1024的数组     *|
|*                                             *|
|*   出口参数:null                            *|
|*   调用函数: set_dis()                       *|
|*             write_dat( )                    *|
\***********************************************/ 
void draw_picture(uchar picture[1024])
{ int i;
  uchar j=0;
  for(j=0;j<8;j++)
   { set_dis(0,j,0);
     for(i=j*128;i<j*128+64;i++)     write_dat(picture[i],1);
     set_dis(0,j+1,64);    
     for(i=j*128+64;i<j*128+128;i++) write_dat(picture[i],1); }
                                                                }
 				 			  

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

wait_key(void)
{ unsigned int n;
  unsigned char Key_code=0;
  unsigned char KEY_CODE;
  KEY_CLK=1;
  KEY_DATA=1;
  for(n=60000;n>0;n--);    //在设备开始传输数据之前,时钟线 必须持续为 高电平的 时间 必须 至少50ms
  if(KEY_CLK==0||KEY_DATA==0)          //如果数据线为低说明有数据传
   { for(n=0;n<11;n++)
     {  if(n>0&&n<9)
        { Key_code=Key_code>>1;
          if(KEY_DATA) Key_code=Key_code|0x80; }
         while(!KEY_CLK); 
         while(KEY_CLK);                          }
        KEY_CODE=Key_code;                           }
   else KEY_CODE=0;
        KEY_CLK=0;
        KEY_DATA=0;
		return(KEY_CODE);
                                       }


/****************************************************\
|*   主程序入口                                     *|
|*   12864LCD显示程序 proteus6.9 仿真AMPIRE128*64   *|
|*   制作人:熊涛                                   *|
|*   时间:2007年4月12日                            *|
|*                                                  *|
\****************************************************/ 
void main(void)                               //主程序
{ unsigned char key;
  unsigned char n;
  unsigned char position=48;
  initial(); 
  P0=0xaa;
  write_cmd(0x3e);        //关显示
  draw_picture(nBitmapDot);
  CS1=CS2=1;
  write_cmd(0x3f); ;       //开显示 
  while(1)
   { if(position==64) position=48;
     if(wait_key())
	  {key=wait_key(); P0=key;
       for(n=0;n<127;n++)
	     { if(key==UnShifted[n][0]) {  write_num(position++,UnShifted[n][1]);write_num(63,'y');}
           else write_num(63,'N');         }
                                    			}    }                
	  
					                          }

⌨️ 快捷键说明

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