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

📄 key_lcd-1.c

📁 16*2LCD键盘扫描显示程序
💻 C
字号:
   #include<reg52.h>
    sfr  WDT=0xC0;
   
   sbit P0_0=0x80; 
   sbit P0_1=0x81;
   sbit P0_2=0x82;
   sbit P0_3=0x83;
   sbit P0_4=0x84;
   sbit P0_5=0x85;
   sbit P0_6=0x86;
   sbit P0_7=0x87;

   sbit P2_4=0xA4;
   sbit P2_5=0xA5;
   sbit P2_6=0xA6;

   sbit P1_7=0x97;

#define LCM_RW P2_5
#define LCM_RS P2_6
#define LCM_E  P2_4
#define LCM_Data  P1
#define Busy  P1_7  	

   void ReadStatusLCM(void);                                                      //函数声明
   void Delay5Ms(void);
   void display_lcd(unsigned char P,unsigned char A);
   
   unsigned char AD;
   unsigned int M=0;
   unsigned char v,sum,co[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};                       //重键值存放数组
   void keyscan(){                                                                     //键盘扫描程序  
       unsigned  char  i;  
       sum=0;                                           
  P0=0xFF;
    P0_0=0;
    if(P0_4==0){
    v='0'; co[0]=1;}
    if(P0_5==0){
    v='1'; co[1]=1;}
    if(P0_6==0){
    v='2'; co[2]=1;}
    if(P0_7==0){
    v='3'; co[3]=1;}	
  P0=0xFF;
    P0_1=0;
    if(P0_4==0){
    v='4'; co[4]=1;}
    if(P0_5==0){
    v='5'; co[5]=1;}
    if(P0_6==0){
    v='6'; co[6]=1;}
    if(P0_7==0){
    v='7'; co[7]=1;}	
  P0=0xFF;
    P0_2=0;
    if(P0_4==0){
    v='8'; co[8]=1;}
    if(P0_5==0){
    v='9'; co[9]=1;}
    if(P0_6==0){
    v='A'; co[10]=1;}
    if(P0_7==0){
    v='B'; co[11]=1;}	
  P0=0xFF;
    P0_3=0;
    if(P0_4==0){
    v='C'; co[12]=1;}
    if(P0_5==0){
    v='D'; co[13]=1;}
    if(P0_6==0){
    v='E'; co[14]=1;}
    if(P0_7==0){
    v='F'; co[15]=1;}	
 for(i=0;i<16;i++){
      sum+=co[i]; 
       co[i]=0;   }
}
void WriteDataLCM(unsigned char WDLCM)		                            //写数据 无忙信号时约6us
{
 ReadStatusLCM(); //检测忙
 LCM_Data = WDLCM;
 Delay5Ms();
 LCM_RS = 1;
 LCM_RW = 0;
 LCM_E = 0; //小的延时
 LCM_E = 1;
 
}
void WriteCommandLCM(unsigned char WCLCM,BuysC)                            //写指令BuysC为0时忽略忙检测
{
 if (BuysC) ReadStatusLCM(); //根据需要检测忙
 LCM_Data = WCLCM;
 Delay5Ms();
 LCM_RS = 0;
 LCM_RW = 0;
 LCM_E = 0;
 LCM_E = 1;
 
}
  void  ReadStatusLCM(void)	                                         //读忙状态
{
 LCM_Data = 0x00;
 Delay5Ms();
 LCM_RS = 0;
 LCM_RW = 1;
 LCM_E = 0;
 LCM_E = 1;
 
 while(Busy); //检测忙信号
}

void KEYS(unsigned int M)                                          //按键次数程序显示
{
   unsigned int  i,c=10,a,b,d=1,z;
   unsigned char cl[16];
  for(i=0,a=0xCF;i<16;i++,a--){
                                b=M%c;
                                z=b/d+48;
                                c=c*10;
                                d=d*10;
                                cl[i]=z;
                                display_lcd(z,a); b=0;
                            }
}

void  pkeys(void)                                                   //重键判断显示
{  
    unsigned  char m[10]={0x50,0x72,0x65,0x73,0x73,0x00,0x4b,0x65,0x79,0x73},a=0x80,i;
            WriteCommandLCM(0x01,1);
            for(i=0;i<10;i++,a++){
                                 display_lcd(m[i],a);
                                  }
            while(sum>1) keyscan();
            WriteCommandLCM(0x01,1);
            AD=0x80;
}
       
void  xym(void)                                                   //显示制作人
{  
    unsigned  char X[13]={0x4D,0x61,0x6B,0x65,0x72,0x3A,0x58,0x75,0x59,0x75,0x4D,0x69,0x6E},a=0x80,i;
            WriteCommandLCM(0x01,1);
            for(i=0;i<13;i++,a++){
                                 display_lcd(X[i],a);
                                  }
             for(i=0;i<100;i++){
                     Delay5Ms();
                     }
            WriteCommandLCM(0x01,1);
}

void Delay5Ms(void)                                                  //5ms延时
{  
   unsigned char i;
   for(i=0;i<27;i++){
                     TMOD=0X02;
                     TH0=0X38;   
                     TL0=0X38;         
                     EA=0X00; 
                     ET0=0X00;
                     TF0=0X00;
                     TR0=0X01;
                     while(TF0!=1);
                      }
}

void LCMInit(void)        //LCM初始化  约10ms
{
 WriteCommandLCM(0x01,0); //清除屏幕
 WriteCommandLCM(0x38,0); //三次功能设置8位 dan行 5*7不检测忙信号
 Delay5Ms();
 WriteCommandLCM(0x38,0);
 Delay5Ms();
 WriteCommandLCM(0x01,1); //显示清屏
 WriteCommandLCM(0x0C,1); // 控制光标,显示 开,闪烁
 WriteCommandLCM(0x06,1); // 控制光标和文字的移动
 }

void display_lcd(unsigned char P,unsigned char A)                           //显示程序 
{
 WriteCommandLCM(A,1);
 WriteDataLCM(P);                 
}

void main()			
{
 unsigned char pan;
 unsigned int i,j;
 WDT=0x00;
 AD=0x80; 
 Delay5Ms();                    //启动等待,等LCM讲入工作状态 
 LCMInit();                     //LCM初始化
 xym(); 
 do{
    for(i=0;i<6;i++){   while(v==0) keyscan();    
                          while(sum>1)  pkeys();
                          pan=v;
                          v=0;
                          for(j=0;j<20;j++){
                                              Delay5Ms();
                                            }
                           keyscan();
                           if(v==0){ v=pan; break;};
                           Delay5Ms();
                        }
    display_lcd(v,AD); M++; 
    AD++;
    KEYS(M); 
    v=0;
    if(AD==0x90){ WriteCommandLCM(0x01,1); AD=0X80; }     
   }while(1) ;
}

⌨️ 快捷键说明

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