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

📄 keyboad.c

📁 一个简单实用的单片机键盘扫描程序。键盘为4*4扫描的键盘
💻 C
字号:
#include<reg51.h>
#include<stdio.h>
#include<absacc.h>
#include <intrins.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//#define MyAddress 0x01
//#define MyTeam 0x01
sbit LedEnter=P2^0;
sbit LedInsert=P2^1;
sbit LedSet=P2^2;
sbit Beep=P2^3;
sbit HT1621_CS=P3^5;
sbit HT1621_WR=P3^4;
sbit HT1621_DT=P3^3;
sbit Int0=P3^2;
sbit r0=P1^7;
sbit r1=P1^6;
sbit r2=P1^5;
sbit r3=P1^4;
sbit l0=P1^3;
sbit l1=P1^2;
sbit l2=P1^1;
sbit l3=P1^0;
sbit IO=P3^7;
uchar OldCode[2]={0x00,0x00};
uchar Code[4]={0x00,0x00,0x00,0x00};
uchar ESC,Number,INSERT,SET,DELETE,LAST,RECALL,ENTER,PUSH,INSERTOK;
uchar NumKey,OthKey;
uchar ReHostH,ReHostL,ReWaitH,ReWaitL,ReAllow,ReCodeH,ReCodeL,BusState=0XFC;
uchar Times;
uchar code CharTab[] = {//     dcbaegf人             
                          0xfb,//0x7d,//0xeb,                    //0   
    					  0x61,//0x60,                    //1   
    					  0xbd,//0x3e,                    //2       
    					  0xf5,//0x7a,                    //3     
    					  0x67,//0x63,                    //4       
    					  0xd7,//0x5b,                    //5     
    					  0xdf,//0x5f,                    //6      
    					  0x71,//0x70,                    //7     
    					  0xff,//0x7f,                    //8    
    					  0xf7,//0x7b,                    //9      
  						  0x01//0x00,                    //空
                       };  
uchar code CCharTab[]={
                        //dcbaegf人
						0x7f,//a
						0xcf,//b
						0x9b,//c
						0xed,//d
						0x9f,//e
						0x1f,//f
						0x77,//g
						0x6f,//h
						0xf1//i
                      };
void delay(uchar n);
void Bee();
void ScanKey();
void Wait();
//**************************************************
void write_clk();
void send_bit(uchar op_code,uchar len);  
void send_bit_l(uchar data *op_code,uchar len);  
void send_command(command);
void send_data_nibble(uchar addr,uchar dat);   
void clr_display();     
void init();  
void display_char(uchar pos,uchar num); 
void display_cchar(uchar pos,uchar num);
//**************************************************
void send0(uchar w);
void send1(uchar w);
void SendBegBus();//总线控制请求
void SendReleaseBus();//总线释放请求
void SendNext();//发送请求下一位
void SendReCall(uchar mm,uchar nn);//发送请求重呼
void SendInsert(uchar mm,uchar nn);//插队
void SendLast(uchar mm,uchar nn);//上一位
//**************************************************
void send0(uchar w)
     {	
		IO=1;
		TI=0;
		TB8=0;
		SBUF=w;	
        while(!TI);	
	   	TI=0;	
		IO=0;
	 }
void send1(uchar w)
     {	
		IO=1;
		TI=0;
		TB8=1;
		SBUF=w;	
        while(!TI);	
	   	TI=0;
		IO=0;
	 }
void SendBegBus()//总线控制请求
     {
	   uchar MyTeam,MyAddress;
	   {
	   P2=0xff;
	   P2=0x7f;//第一个
	   MyTeam=P0;
	   MyTeam=~MyTeam;
	   P2=0xff;
	   P2=0xbf;
	   MyAddress=P0;
	   MyAddress=~MyAddress;
	  }
	   send1(0xfe);
	   send0(0xff);
	   send0(MyAddress);
	   send0(MyTeam);
	   IO=0;
	 }
void SendReleaseBus()//总线释放请求
     {
	   uchar MyTeam,MyAddress;
	   {
	   P2=0xff;
	   P2=0x7f;//第一个
	   MyTeam=P0;
	   MyTeam=~MyTeam;
	   P2=0xff;
	   P2=0xbf;
	   MyAddress=P0;
	   MyAddress=~MyAddress;
	  }
	   send1(0xfc);
	   send0(0xff);
	   send0(MyAddress);
	   send0(MyTeam);
	   IO=0;
	 }
void SendNext()//发送请求下一位
     {
	   uchar MyTeam,MyAddress;
	   {
	   P2=0xff;
	   P2=0x7f;//第一个
	   MyTeam=P0;
	   MyTeam=~MyTeam;
	   P2=0xff;
	   P2=0xbf;
	   MyAddress=P0;
	   MyAddress=~MyAddress;
	  }
	   send1(0xfd);
	   send0(0xff);
	   send0(MyAddress);
	   send0(MyTeam);
	   send0(0x03);
	   IO=0;
	 }
void SendReCall(uchar mm,uchar nn)//发送请求重呼
     {
	   uchar MyTeam,MyAddress;
	   {
	   P2=0xff;
	   P2=0x7f;//第一个
	   MyTeam=P0;
	   MyTeam=~MyTeam;
	   P2=0xff;
	   P2=0xbf;
	   MyAddress=P0;
	   MyAddress=~MyAddress;
	  }
	   send1(0xfd);
	   send0(0xff);
	   send0(MyAddress);
	   send0(MyTeam);
	   send0(0x04);
	   send0(mm);
	   send0(nn);
	   IO=0;
	 }
void SendInsert(uchar mm,uchar nn)//插队
     {
	   uchar MyTeam,MyAddress;
	   {
	   P2=0xff;
	   P2=0x7f;//第一个
	   MyTeam=P0;
	   MyTeam=~MyTeam;
	   P2=0xff;
	   P2=0xbf;
	   MyAddress=P0;
	   MyAddress=~MyAddress;
	  }
	   send1(0xfd);
	   send0(0xff);
	   send0(MyAddress);
	   send0(MyTeam);
	   send0(0x04);
	   send0(mm);
	   send0(nn);
	   IO=0;
	 }
void SendLast(uchar mm,uchar nn)//上一位
     {
	   uchar MyTeam,MyAddress;
	   {
	   P2=0xff;
	   P2=0x7f;//第一个
	   MyTeam=P0;
	   MyTeam=~MyTeam;
	   P2=0xff;
	   P2=0xbf;
	   MyAddress=P0;
	   MyAddress=~MyAddress;
	  }
	   send1(0xfd);
	   send0(0xff);
	   send0(MyAddress);
	   send0(MyTeam);
	   send0(0x04);
	   send0(mm);
	   send0(nn);
	   IO=0;
	 }
//**************************************************
void Wait()
     {
	   delay(20);
	 }
void delay(uchar n)
     {
	   uchar i,j;
	   for (i=0;i<n;i++)
	       {
		     for (j=0;j<n;j++)
			     {
				   ;
				 }
		   }
	 }
void Bee()
     {
	   Beep=0;
	   LedEnter=0;
	   delay(100);
	   Beep=1;
	   LedEnter=1;	   
	 }
//********************************************************************************
//扫描键盘
//********************************************************************************
void write_clk()
     {
       delay(3);
       HT1621_WR = 1;
       delay(3);
       HT1621_WR = 0;
	 }
void send_bit(uchar op_code,uchar len)
     {
       while(len--)
	        {
              HT1621_DT = (bit)(op_code&0x80);
              write_clk();
              op_code = op_code<<1;        
            }
     }
void send_bit_l(uchar data *op_code,uchar len)
     {
       while(len--)
	        {
              HT1621_DT = (bit)((*op_code)&0x01);
              write_clk();
              *op_code = (*op_code)>>1;        
            }
     }
void send_command(command)
     {
       HT1621_CS = 0;
       send_bit(0x80,3);
       send_bit(command,8);
       write_clk();
       HT1621_CS = 1;
     }
void send_data_nibble(uchar addr,uchar dat)
     {
       HT1621_CS = 0;
       send_bit(0xa0,3);
       addr <<= 2;
       send_bit(addr,6);
       send_bit_l(&dat,4);
       HT1621_CS = 1;
     }
void clr_display()
     {
       uchar i;
	   for(i=11;i<18;i++)
	      {
            send_data_nibble(i,0);
          }
     }
void init()
     {
       
	   IE=0x90;
 	   TMOD=0x21;  //33M/0xEE;
	   TH1=0xfa;//24000xe8;//0xd0;//1200//9600/22.11//0xe8;////// fa9600	//0xf44800
	   TR1=1;
	   SCON=0xf0;
	
	   EA=1;
	   ES=1; 
	   IO=0;
	   EX0=1;
	   IT0=0;
	   P1=0x0f;
       IP=0X10;
	   SM2=1;
       HT1621_CS = 1;
       HT1621_WR = 0;
       HT1621_DT = 1;
       send_command(1);    //SYS EN
       send_command(3);    //LCD ON
       send_command(0x0d);    //CLR TIMER
       send_command(0x0f);    //CLR WDT
       send_command(0x18);    //RC 256K
       send_command(0x28);    //1/2 bias,1/4 duty 
       clr_display();
	   PUSH=0x00;
       BusState=0xfc;
	   Times=4;
	   ESC=Number=INSERT=SET=DELETE=LAST=RECALL=ENTER=INSERTOK=0x00;
	   NumKey=OthKey=0x00;
	   display_char(0,0);
	   display_char(1,0);
	   display_char(2,0);
	   display_char(3,0);
	   display_char(4,0);
	   IO=0;
    }
void display_char(uchar pos,uchar num)
     {
       uchar dat;    
       dat = CharTab[num];
       pos = pos*2;
       HT1621_CS = 0;
       send_bit(0xa0,3);
       pos <<= 2;
       send_bit(pos,6);
       send_bit_l(&dat,8);
       HT1621_CS = 1;
     }
void display_cchar(uchar pos,uchar num)
     {
       uchar dat;    
       dat = CCharTab[num];
       pos = pos*2;
       HT1621_CS = 0;
       send_bit(0xa0,3);
       pos <<= 2;
       send_bit(pos,6);
       send_bit_l(&dat,8);
       HT1621_CS = 1;
     }
void getbyte(void) interrupt 0 using 0
     {
	   Wait();
	   if (Int0)return;
	  // EX0=0;
	   ScanKey();
	   while(!Int0);	   
	   EX0=1;
	 }
void receive(void) interrupt 4 using 3
  {	 	
    uchar TempData,MyTeam,MyAddress;
	//uint Addr;
	uchar BadData1,BadData2,BadData3;
	if (TI==1)
	   {
	     return;
	   }
	{
	   P2=0xff;
	   P2=0x7f;//第一个
	   MyTeam=P0;
	   MyTeam=~MyTeam;
	   P2=0xff;
	   P2=0xbf;
	   MyAddress=P0;
	   MyAddress=~MyAddress;
	}
	if (RI)
	{
	TempData=SBUF;
	RI=0;
	if (TempData==MyAddress )//窗口
	   {
	     RI=0;
         SM2=0;		 
		 TempData=_getkey();
		 if (TempData==MyTeam)//队列
		    {
			  
			  ReHostH=_getkey();//0xfd	
			  RI=0;
			  ReHostL=_getkey();//0xff
			  RI=0;
			  ReAllow=_getkey();
			  RI=0;
			  if (ReAllow!=0x00)return;			  
			  OldCode[0]=ReCodeH;
			  ReCodeH=_getkey();
			  RI=0;
			  OldCode[1]=ReCodeL;
			  ReCodeL=_getkey();
			  RI=0;
			  ReWaitH=_getkey();	
			  RI=0;
			  ReWaitL=_getkey();			 
			}
            else 
			{
			  goto ee;
			}
	   }
	   else if (TempData==0xf8)
	   {
	     RI=0;
		 SM2=0;
		 TempData=_getkey();
		 if (TempData==0xff)
		    {
			  ReHostH=_getkey();
			  ReHostL=_getkey();
			  TempData=_getkey();	
			  if (TempData==0x07)
	 		     {
				   TempData=_getkey();//窗口号
				   TempData=_getkey();
				   if (TempData==MyTeam)
				      {
					    ReWaitH=_getkey();
						ReWaitL=_getkey();
					  }
				 }
				 else
				 {
				   goto ee;
				 }
			}
			else
			{
			  goto ee;
			}
	   }
	   else if ((TempData==0xfe)||(TempData==0xfc))
	   {
	     BusState=TempData;//0xdf  0xef	 
		 SM2=0;	     
		 BadData1=_getkey();
         BadData2=_getkey();	
         BadData3=_getkey();
		 RI=0;  
	   }
	   else 
	   {
	     goto ee;
	   }	
	 }
ee:	SM2=1;
  }
void main()
     {	
       uchar DNumH,DNumL;
	   uchar TCode[10];
 	   //uchar DCodeH,DCodeL;
       init();
       ES=1;
	   while(1)
	        {			  
			 // ScanKey();	 		  
			  if (PUSH==0xff && INSERT==0xff)//插入键
			     {
				   INSERT=0X00;
				   PUSH=0X00;				   
				   clr_display();
				   display_char(5,10);
				   display_char(6,10);
				   display_char(7,10);
				   display_char(8,10);
				   display_char(9,10);
				   Times=4;
				   INSERTOK=0XFF;
				 }			  
			  if (PUSH==0xff && Times<9 && NumKey==0xff && OthKey==0x00 && INSERTOK==0XFF)
			     {
				   Times=Times+1;
				   PUSH=0x00;
				   if (Times==5)
				      {
					    display_cchar(Times,Number);
					  }
					  else
					  {
			            display_char(Times,Number);
					  }
				   NumKey=0x00;
				   Code[Times]=Number;
				 }
				 else if (PUSH==0xff && Times>=9 && NumKey==0xff&& OthKey==0x00 && INSERTOK==0XFF)
				 {
				   Times=9;
				   PUSH=0x00;
			       display_char(9,Number);
				   NumKey=0x00;
				   Code[Times]=Number;
				 }
			  if (PUSH==0xff && ESC==0xff && OthKey==0xff)//ESC键
			     {
				   ESC=0X00;
                   PUSH=Number=INSERTOK=SET=DELETE=LAST=RECALL=ENTER=0x00;
				   Times=5;
				   //是否考虑加入显示原处理号码(因为此时已经清除)
				 }			  
			  if (PUSH==0xff && Times>4 && DELETE==0xff&& OthKey==0xff && NumKey==0x00 && INSERTOK==0XFF)//删除键
			     {
				   PUSH=DELETE=0x00;				   
				   display_char(Times,10);
				   Times=Times-1;				   	   
				 }			  
			  if (PUSH==0XFF && ENTER==0XFF && OthKey==0xff && INSERTOK!=0xff)//回车键
			     {
				   PUSH=ENTER=0X00;
				   //GETOK=0x00;//首先将标志字节置零				   
				   while(BusState!=0xfc);
				   SendBegBus();
				   SendNext();
				   SendReleaseBus();	   
				 }
				 else if (PUSH==0XFF && ENTER==0XFF && OthKey==0xff && INSERTOK==0xff)//插入回车
				 {
				   PUSH=ENTER=INSERTOK=0X00;
				   DNumH=Code[5]*0x10+(Code[6]*1000+Code[7]*100+Code[8]*10+Code[9])/256;
				   DNumL=(Code[5]*1000+Code[6]*100+Code[7]*10+Code[8])%256;//Code[2]*0x10+Code[3]*0x01;
                   //ReCodeH=DNumH;//(Code[0]*10000+Code[1]*1000+Code[2]*100+Code[3]*10+Code[4])/256;
				   //ReCodeL=DNumL;//(Code[0]*10000+Code[1]*1000+Code[2]*100+Code[3]*10+Code[4])%256;
				   while(BusState!=0xfc);
				   SendBegBus();
				   SendInsert(DNumH,DNumL);
				   SendReleaseBus();				   
				 }
			  if (PUSH==0xff && RECALL==0xff && OthKey==0xff)//重呼键
			     {
				   PUSH=RECALL=0x00;
				   while(BusState!=0xfc);
				   SendBegBus();
				   SendReCall(ReCodeH,ReCodeL);
				   SendReleaseBus();
				   //&&&&&&&&
				 }
			  if (PUSH==0xff && LAST==0xff && OthKey==0xff)//上一位
			     {
				   PUSH=LAST=0X00;
				   while(BusState!=0xfc);
				   SendBegBus();
				   SendLast(OldCode[0],OldCode[1]);
				   SendReleaseBus();
				 }			  
			  //delay(100);			  
			  if (INSERTOK!=0xff)//非插入状态下
			     {				   
				   TCode[0]=(ReWaitH*256+ReWaitL)/10000;
				   TCode[1]=((ReWaitH*256+ReWaitL)%10000)/1000;
				   TCode[2]=((ReWaitH*256+ReWaitL)%1000)/100;
				   TCode[3]=((ReWaitH*256+ReWaitL)%100)/10;
				   TCode[4]=(ReWaitH*256+ReWaitL)%10;
                   display_char(0,TCode[0]);
				   display_char(1,TCode[1]);
				   display_char(2,TCode[2]);
				   display_char(3,TCode[3]);
				   display_char(4,TCode[4]);
				   TCode[5]=ReCodeH/0x10;
				   TCode[6]=(((ReCodeH%0x10)*0x100+ReCodeL))/1000;
				   TCode[7]=(((ReCodeH%0x10)*0x100+ReCodeL)%1000)/100;
				   TCode[8]=(((ReCodeH%0x10)*0x100+ReCodeL)%100)/10;
				   TCode[9]=((ReCodeH%0x10)*0x100+ReCodeL)%10;
                   display_cchar(5,TCode[5]);
				   display_char(6,TCode[6]);
				   display_char(7,TCode[7]);
				   display_char(8,TCode[8]);
				   display_char(9,TCode[9]);
				 }
			}
	 }

⌨️ 快捷键说明

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