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

📄 51keyboard_display.c

📁 因需要
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "F020_FlashPrimitives.h"
#include<stdio.h>
#include "C8051F020.h"

#define N 50

#define  WRITE          0x00           
#define  READ           0x01         
#define  EEPROM_ADDR    0xA0                    
#define  SMB_BUFF_SIZE  0x08           

#define  SMB_BUS_ERROR  0x00           
#define  SMB_START      0x08          
#define  SMB_RP_START   0x10           
#define  SMB_MTADDACK   0x18                                                 
#define  SMB_MTADDNACK  0x20                                             
#define  SMB_MTDBACK    0x28                                                
#define  SMB_MTDBNACK   0x30                                               
#define  SMB_MTARBLOST  0x38          
#define  SMB_MRADDACK   0x40                                               
#define  SMB_MRADDNACK  0x48                                                
#define  SMB_MRDBACK    0x50                                               
#define  SMB_MRDBNACK   0x58          
                                      
unsigned char  * pSMB_DATA_IN;           
unsigned char  SMB_SINGLEBYTE_OUT;      
unsigned char  * pSMB_DATA_OUT;                                               
unsigned char  SMB_DATA_LEN;                                                                                      
unsigned char  WORD_ADDR;                                                     
unsigned char  TARGET;                  
bit SMB_BUSY = 0;                     
bit SMB_RW;                            
bit SMB_SENDWORDADDR;                                                        
bit SMB_RANDOMREAD;                   
bit SMB_ACKPOLL;                      

sfr16    TMR3RL   = 0x92;              // Timer3 reload registers
sfr16    TMR3     = 0x94;              // Timer3 counter registers
sbit SDA = P0^2;                       
sbit SCL = P0^3;                    

//sbit  D0=P3^0;
//sbit  D1=P3^1;
//sbit  D2=P3^2;
//sbit  D3=P3^3;
sbit  DP=P3^4;
sbit  A0=P3^5;	 //地址扫描线  
sbit  A1=P3^6; 
sbit  A2=P3^7;

sbit   RL0=P2^0; //按键输入接口 
sbit   RL1=P2^1;
sbit   RL2=P2^2;
sbit   RL3=P2^3;
sbit   RL4=P2^4;
sbit   RL5=P2^5;  
sbit   con0=P1^0; //计数器数据读取口 
sbit   con1=P1^1;
sbit   con2=P1^2;
sbit   con3=P1^3;
sbit   AA0=P1^4;  //计数器数据 位选择  地址线  
sbit   BB0=P1^5;


bit keyflag=0,rkey=0;
bit one,two,three,four;	 // 自检状态下1234 标志	  
bit keyrelease0=1,keyrelease1=1,keyrelease2=1,keyrelease3=1,keyrelease4=1,keyrelease5=1,keyrelease6=1,keyrelease7=1,keyrelease8=1;
bit keyrelease9=1,keyrelease10=1,keyrelease11=1,keyrelease12=1,keyrelease13=1,keyrelease14=1,keyrelease15=1,keyrelease16=1;
bit keyrelease21=1,keyrelease22=1,keyrelease23=1,keyrelease30=1,keyrelease31=1,keyrelease32=1;
bit dot0,dot1,dot2;
bit fu=1,yang=1,zheng=1,fan=1,sudu=1;//方向键 释放标志  1时说明 释放 
bit STATE0 ; 
unsigned char xdata STATE1;
unsigned int xdata jdot0=0,jdot1=0,jdot2=0;
float targetH;	//目标高度	  

unsigned char xdata key,keycode; 
unsigned int xdata dataH,datahh,datalw;
long datajj; 
unsigned char code DIS_DAT[16]={0x0,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}; 
unsigned char code DIS_BIT[6]={0x00,0x20,0x40,0x60,0x80,0xa0};
unsigned  char  xdata KeyData[40]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};
unsigned char  xdata M=0,C=0,c01=0x0a,c02=0x0c;  

void DataDish(unsigned int dataTmp)	;	
void DataDisHH(unsigned int dataTmp) ;
void zijian();
void ceju();
void delay(int m) ;
void Port_IO_Init() ;
void Oscillator_Init()  ;
void Init_Device();	 
void Timer_Init();
void UART_Init();
void send(unsigned char jianzhi);
void DataDisZ( unsigned char c1,unsigned char c2,unsigned int dataTmp) ;	  
void DataDisL( unsigned int dataTmp);
void DataDisJ( long dataTmp) ;	
void lingweiread();
void lingweiwrite();
void jiaojuwrite();
void jiaojuread();


void SMBus_Init(void);
void Timer3_Init(void);
void SMBus_ISR(void);
void Timer3_ISR(void);

void EEPROM_ByteWrite(unsigned char addr, unsigned char dat);
void EEPROM_WriteArray(unsigned char dest_addr, unsigned char* src_addr,
                       unsigned char len);
unsigned char EEPROM_ByteRead(unsigned char addr);
void EEPROM_ReadArray(unsigned char* dest_addr, unsigned char src_addr,
                      unsigned char len);

main()
{ 

  WDTCN = 0xde;                       
  WDTCN = 0xad;	
  Init_Device();
  EIE1 |= 0x02;                                                  
  SI = 0;
  TR0=1	;
  TR1=1;
  EA=1; 
  ES0 = 0;

  send(0x20);

  while(1)
   {	 	
      while(keyflag) ;

      if(rkey==1)
	  {
	    keycode = key;
	    if(keycode==31)
	        ceju();	    
		else if(keycode==12)
		  	zijian();
        else if(keycode==21)   //急停 
	      {
		    send(0x15);
 		  }
      
      	 else if((keycode==13&&sudu==0)||(keycode==30&&yang==0))
		     send(0x11);
			 
	     else if(keycode==13&&sudu==1)	   //方向键值 连发	   
		   {
		     send(0x0D);
			 if(yang==1)	
		    {
			 send(0x21); 
			 send(0x21);
			 send(0x21); 
			 yang=0;
			}
		   }
		 else if((keycode==14&&sudu==0)||(keycode==30&&fu==0))
		     send(0x12);

	     else if(keycode==14&&sudu==1)	     
		  {
		    send(0x0E);
			 if(fu==1)	
		    {
		 	 send(0x21); 
			 send(0x21);
			 send(0x21); //若方向键弹起则发送三个弹起键值  
			 fu=0;
			}
		  }

		 else if((keycode==15&&sudu==0)||(keycode==30&&fan==0))		   
		     send(0x13);
			 	 
		 else if(keycode==15&&sudu==1)	    
		  {
		    send(0x0F);
			 if(fan==1)	
		    {
			 send(0x21); 
			 send(0x21);
			 send(0x21);  
			 fan=0;
			}
		  }
		  else if((keycode==16&&sudu==0)||(keycode==30&&zheng==0))
		     send(0x14);
			 		 
	      else if(keycode==16&&sudu==1)	   //方向键值 连发	   
		  {
		    send(0x10);
			 if(zheng==1)	
		    {
			 send(0x21); 
			 send(0x21);
			 send(0x21); //若方向键弹起则发送三个弹起键值  
			 zheng=0;
			}
		  }

		else if(keycode==22)
		  {
		     send(0x16);
		  } 
		else if(keycode==23)
		  send(0x17); /////////////// 稳定攻击  	   ////////////////////////
		//  send(0x18); ////////////// 稳定搜索  ////////////////////////

	//	else if(keycode==30)
	//	   send(0x1E);

	    else
	     {STATE0=0;STATE1=0; }
	    rkey=0;	 	
	}	
  }	  
}
  
 void DataDish(unsigned int  dataTmp)
  {
    switch(M)
	{
	 case 0:  
			  
	          P3=P3&0xf0|0x0A;DP=0;
	           break;
			   
	 case 2:  
	          {P3 = P3&0xf0|DIS_DAT[dataTmp/1000];DP=0;}
			   break;
			   
	 case 3:  
	          {P3 = P3&0xf0|DIS_DAT[(dataTmp%1000)/100];DP=0;}
			  break; 
	 case 4: 
	          P3 = P3&0xf0|DIS_DAT[(dataTmp%100)/10] ;DP=0;
			  break;
			   
	 case 5:  P3 =  P3&0xf0|DIS_DAT[dataTmp%10]; DP=0;
			   break;
	 case 1:  
			   P3 = P3&0xf0|0x0c;DP=0;
			   break;
	 default:  break; 
	}
 }
  
  void DataDisZ( unsigned char c1,unsigned char c2,unsigned int dataTmp) 		 //////////////////////////////
  {
	switch(M)
	{
	 case 0:  			  
	           		   		   
			  {P3 = P3&0xf0|DIS_DAT[c1];DP=0;}
	           break;
	 case 1:  
			   {P3 = P3&0xf0|DIS_DAT[c2];DP=0;}
			   break;	
			   		   	   
	 case 2:  
	          {P3 = P3&0xf0|DIS_DAT[dataTmp/1000];DP=0;}
			   break;
			   
	 case 3:  
	          {P3 = P3&0xf0|DIS_DAT[(dataTmp%1000)/100];DP=0;}
			  break; 
	 case 4: 
	          P3 = P3&0xf0|DIS_DAT[(dataTmp%100)/10] ;DP=0;
			  break;
			   
	 case 5:  P3 =  P3&0xf0|DIS_DAT[dataTmp%10]; DP=0;
			   break;	 
	 default:  break; 
	}
  }


  void DataDisL( unsigned int dataTmp) 		 //////////////////////////////
  {
	switch(M)
	{
	 case 0:  			  
	           		   		   
			  {P3 = P3&0xf0|DIS_DAT[14];DP=0;}
	           break;
	 case 1:  
			   {P3 = P3&0xf0|DIS_DAT[12];DP=0;}
			   break;	
			   		   	   
	 case 2:  
	          {P3 = P3&0xf0|DIS_DAT[dataTmp/1000];DP=0;}
			   break;
			   
	 case 3:  
	          {P3 = P3&0xf0|DIS_DAT[(dataTmp%1000)/100];DP=0;}
			  break; 
	 case 4: 
	          P3 = P3&0xf0|DIS_DAT[(dataTmp%100)/10] ;DP=0;
			  break;
			   
	 case 5:  P3 =  P3&0xf0|DIS_DAT[dataTmp%10]; DP=0;
			   break;	 
	 default:  break; 
	}
  }


 void DataDisJ( long dataTmp) 		 //////////////////////////////
  {
	switch(M)
	{
	 case 0:  			  
	           		   		   
			  {P3 = P3&0xf0|DIS_DAT[15];DP=0;}
	           break;
	 case 1:  
			   {P3 = P3&0xf0|DIS_DAT[dataTmp/10000];DP=0;}
			   break;	
			   		   	   
	 case 2:  
	          {P3 = P3&0xf0|DIS_DAT[dataTmp%10000/1000];DP=0;}
			   break;
			   
	 case 3:  
	          {P3 = P3&0xf0|DIS_DAT[(dataTmp%1000)/100];DP=jdot2;}
			  break; 
	 case 4: 
	          P3 = P3&0xf0|DIS_DAT[(dataTmp%100)/10] ;DP=jdot1;
			  break;
			   
	 case 5:  P3 =  P3&0xf0|DIS_DAT[dataTmp%10]; DP=jdot0;
			   break;	 
	 default:  break; 
	}
  }

  void DataDisHH(unsigned int dataTmp) 
  {


    switch(M)
	{
	 case 0:  
			  
	          P3 = P3&0xf0|0x0B;DP=0;
			  break;
	 case 3: // if(dataTmp/100==0) 
	          //  {flagb=1;P3=P3|0x0f;DP=0;}
			//  else 
	            {P3 = P3&0xf0|DIS_DAT[(dataTmp%1000)/100];DP=dot2;}//flagb=0;}
			  break; 
	 case 4: //if(flagb==1&&dataTmp/10==0) 
	           // {P3=P3|0x0f;DP=0;}
			 // else
	            P3 = P3&0xf0|DIS_DAT[(dataTmp%100)/10];DP=dot1 ;
			  break;
			   
	 case 5:  P3 =  P3&0xf0|DIS_DAT[dataTmp%10]; DP=dot0;
		      break;
     case 2:   
	 		   P3 = P3&0xf0|0x0c;DP=0;
			  break;
			   
	 case 1:  
			   P3 = P3&0xf0|0x0c;DP=0;
			   break;
	 default:  break; 
	}
 }
 

void Port_IO_Init()
{
    XBR0    = 0x05;
    XBR2    = 0x40;
	P0MDOUT = 0x00; 
	P1MDOUT = 0xff;
	P2MDOUT = 0xff;
	P3MDOUT = 0xff;
    P0 = 0xFF;
}

void Oscillator_Init()
{
    int i = 0;
    OSCXCN    = 0x67;
    for (i = 0; i < 3000; i++);  
    while ((OSCXCN & 0x80) == 0);
    OSCICN    = 0x08;
}

void UART_Init()	  /////////////////////////////////////////////////////
{
    SCON0=0x40;
    TCON|=0x40;
    TMOD|=0x20;
    TH1= 0xFA;
	TL1=TH1;
	TI0=1;
}

void send(unsigned char jianzhi)	 /////////////////////////////////////////////
{

  TI0=0;
  SBUF0=jianzhi ; 			
  while(TI0==0) ;
  TI0=0;							
}

void Init_Device(void)

{	 
    Port_IO_Init();
    Oscillator_Init();
	Timer_Init();
    UART_Init();   
	SMBus_Init ();                      
    Timer3_Init ();                    
}


void Timer_Init()
{
    TF0=0;
	TR0=0;
    TMOD|=0x01;
	TH0=245;
	TL0=250;
	ET0=1;
	EA=1;
}

void int0_ISR() interrupt  1
{
	unsigned int  geh,shih,baih,qianh;
    unsigned int  c0,c1,c2,c3;

	TH0=245;
	TL0=20;  
	if(M>=5)
	  M=0;
	else
	  M++;   	

   if(C>=3)
	  C=0;
	else
	  C++;

    if(C==0)
	  {
	   	AA0=0;
		BB0=0;
		delay(N);
		if(con0==1)
		 c0 = 1;
		else
		 c0 = 0;
		if(con1==1)
		 c1 = 2;
		else
		 c1 = 0;
		if(con2==1)
		 c2 = 4;
		else
		 c2 = 0;
		if(con3==1)
		 c3 = 8;
		else
		 c3 = 0;

		geh = c3 + c2 + c1 + c0;
	  } 
	 else if(C==1)
	  {
	   	AA0=1;
		BB0=0;
		delay(N);
		if(con0==1)
		 c0 = 1;
		else
		 c0 = 0;
		if(con1==1)
		 c1 = 2;
		else
		 c1 = 0;
		if(con2==1)
		 c2 = 4;
		else
		 c2 = 0;
		if(con3==1)
		 c3 = 8;
		else
		 c3 = 0;

		shih = c3 + c2 + c1 + c0;

	  } 
	 else if(C==2)
	  {
	   	AA0=0;
		BB0=1;
		delay(N);
		if(con0==1)
		 c0 = 1;
		else
		 c0 = 0;
			if(con1==1)
		 c1 = 2;
		else
		 c1 = 0;
		if(con2==1)
		 c2 = 4;
		else
		 c2 = 0;
		if(con3==1)
		 c3 = 8;
		else
		 c3 = 0;

		baih = c3 + c2 + c1 + c0;

	  } 
	   else if(C==3)
	  {
	   	AA0=1;
		BB0=1;
		delay(N);
		if(con0==1)
		 c0 = 1;
		else
		 c0 = 0;
		if(con1==1)
		 c1 = 2;
		else
		 c1 = 0;
		if(con2==1)
		 c2 = 4;
		else
		 c2 = 0;
		if(con3==1)
		 c3 = 8;
		else
		 c3 = 0;
		qianh = c3 + c2 + c1 + c0;
	  } 
	  

	  datahh = 1000*qianh + 100*baih + 10*shih + geh ;  

	switch(M)
 { 

⌨️ 快捷键说明

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