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

📄 key.c

📁 2乘8按键扫描程序 4个IO口 74LS164串行数据端 时钟端 两个普通IO口
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#define DB0_DB7 P2
sbit dat3 =P1^0; //键盘扫描移位数据端;
sbit clk3 =P1^1; //键盘扫描移位时钟端;
sbit lie1 =P1^2; //键盘第一列;
sbit lie2 =P1^3; //键盘第二列;
sbit RS=P3^5;
sbit RW=P3^6;
sbit E =P3^7;
bit flag=0;
unsigned char code shuzi[10]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char key();
void delay(unsigned char a);
void write_cmd (unsigned int tempdata);
void write_ddr (unsigned int tempdata);
void init();


void delay(unsigned char a)
{
 unsigned char i;
 unsigned char j;
 for(j=0;j<a;j++)
 for(i=0;i<125;i++);
}

void write_cmd (unsigned int tempdata)	   //液晶写命令子程序//
{
 DB0_DB7=tempdata;
 RS=0;
 RW=0;
 E=1;
 _nop_();
 E=0;
 _nop_();
 delay(10);
}


void write_ddr (unsigned char tempdata)	   //液晶写数据子程序//
{
 DB0_DB7=tempdata;
 RS=1;
 RW=0;
 E=1;
 _nop_();
 E=0;
 _nop_();
 delay(10);
}


void init()  //液晶初始化子程序//
{
 write_cmd(0x30);
 delay(10);
 write_cmd(0x01);
 delay(10);
 write_cmd(0x38);
 write_cmd(0x0c);
}

unsigned char key()
{
  unsigned char k=0,i=0,j=0,lie=0;
  while(1)
  {
   flag=0;
   for (i=0;i<=7;i++)
   {
    clk3=0;
    _nop_();
    dat3=0;
    _nop_();
    clk3=1;
    _nop_();
    clk3=0;
    _nop_();
   }                //先输入八个零
  if(lie1^lie2)
    {
     flag=1;
     delay(5);
     if(lie1^lie2)
      {
        if(!lie1)
	lie=0;
        if(!lie2)
	lie=1;
      }
      clk3=0;
      dat3=1;
      for(k=0;k<16;k++)
	   {
        if(clk3)
	    clk3=0;
	    else
	    clk3=1;
	    }    //给8个1//
      clk3=0;
      _nop_();
      dat3=0;
      _nop_();
      clk3=1;
      _nop_();
      clk3=0;
      _nop_();
      for(j=0;j<8;j++)
	  {
	   if(lie1^lie2)
	      break;
	   else
	     {
          dat3=1;
	      _nop_();
	      clk3=0;
	      _nop_();
	      clk3=1;
	      _nop_();
	      clk3=0;
	      _nop_(); //送1//
	     }
	   }
	while (!(lie1&lie2));
    
   }
   break;
  }
  return (lie*8+j);
}
void main()
{
  unsigned char keyzhi,m=0,n=0,p=0;
  init();
  write_cmd(0x80);
  while(1)
   {
     keyzhi=key();
     if(flag)
     {
       switch(keyzhi)
       {
        case 10 : break;
        case 11 : break;
        case 12 : break;
        case 13 : break;
        case 14 : break;
        case 15 : break;
        default : write_ddr(shuzi[keyzhi]);break;
       }
      p=p+1;
      if(p==16){write_cmd(0xc0);}
      if(p==32){write_cmd(0x80);p=0;}
     }
  }
}

⌨️ 快捷键说明

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