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

📄 keyboard.c

📁 含有大量的单片机代码
💻 C
字号:
#include"reg52.h"
#include "intrins.h"
#include "key.h" //按键通码与ascii对照表
#define uchar unsigned char
#define uint  unsigned int
#define cmd_word 0xff   //复位命令

//sbit Clk_Line = P3^3; //时钟线
//sbit Data_Line=P3^5;  //键盘数据线

sbit Clk_Line = P3^3; //时钟线
sbit Data_Line=P3^4;  //键盘数据线

uchar key=0; //按键最终值
uint Key_Value=0;
uchar save=0;
uchar Int_Time=0;
void init(void);
void delay(uint us);  //us=12大约100us 
void command(uchar cmd);
void commanden(uchar cmd);
void interrupt1_receive(void);
void getkey(void) ;////内部中断0 用来处理缓冲区里的数据
void main(void)
{
    uchar thir=2; 
    init();                //初始化
    while(thir--)
    { 
       command(cmd_word);  
	   //commanden(0xf4);
       delay(1000);
    }
    delay(150);        
    delay(300);
    while(1)
    {
      EX1=1;
      while(EX1) ;
      P0=Key_Value;
      getkey();

    }
}
void init(void)
{
   EA = 1;
   IT1 = 1;     //外部中断1是下降沿触发方式
   TMOD = 0x20; //定时器1工作于方式2
   TL1 = 0xfd;  //串口波特率设置为9600
   TH1 = 0xfd;
   SCON = 0xd8; //11011000 串口工作方式3,11位异步收发,波特率由定时器1控制 
   PCON = 0x00;
   TR1 = 1;     //启动定时器1
}

void getkey(void)
{
     uchar i=0;
     save = Key_Value;
     //P0 = save;
     for(i=0;i<80;i++)
     {
         if(noshift[i][0]==save) //普按键的通码在缓冲区的第一位
         {   
             key=noshift[i][1]; //搜索到字母后进行相应的处理           
             P0 = key;
             break;   
         }
     } 
} 

void delay(uint us)  //us=12大约100us 
{ 
   while(us--) ;
}

void interrupt1_receive(void) interrupt 2
{ 
  _nop_();
  if(Data_Line)
     Key_Value|=0x8000;
  Int_Time++;
  if(Int_Time==11)
  { 
    Key_Value>>=6;
    Int_Time=0;
    EX1=0;
  }
  Key_Value>>=1; 
}
void command(uchar cmd)
{  
   uchar parity,time;
   parity=0;
   Clk_Line=1;
   Data_Line=1;
   delay(100);
   Clk_Line=0;
   delay(20);  
   Data_Line=0;
   _nop_();
   _nop_();
    _nop_();
   _nop_();
   _nop_();
   Clk_Line=1;
   while(Clk_Line)  ; 
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;        //数据开始了
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ; 
   while(Clk_Line)  ; 
   parity=8;
   if((parity&0x01))
      Data_Line=0;
   Data_Line=1;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   Data_Line=1;
   while(!Clk_Line);
   while(Data_Line) ; 
   while(Clk_Line) ;
   while(!Clk_Line) ;
   while(!Data_Line);
} 

void commanden(uchar cmd)
{ 
   uchar parity,time;
   parity=0;
   Clk_Line=1;
   Data_Line=1;
   delay(100);
   Clk_Line=0;
   delay(20);  
   Data_Line=0;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Clk_Line=1;
   while(Clk_Line)  ; 
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=0;        
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=0;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=0;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
  _nop_();
  _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   Data_Line=1;
   while(!Clk_Line) ;   
   while(Clk_Line)  ; 
   parity=5; 
   if((parity&0x01))
      Data_Line=0;
   Data_Line=1;
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   _nop_();
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   Data_Line=1;
   while(!Clk_Line);
   while(Data_Line) ;
   while(Clk_Line) ;
   while(!Clk_Line) ;
   while(!Data_Line);
}

⌨️ 快捷键说明

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