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

📄 kb.c

📁 双龙AVR-MEGA128开发板的配套源码
💻 C
字号:
#include <iom128v.h>
#include "pindefs.h"
#include "scancodes.h"
#define BUFF_SIZE 64
extern void delay_ms(unsigned int time);
const ascii[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,
                 0x39,0x41,0x42,0x43,0x44,0x45,0x46};
unsigned char bitcount;  
unsigned char kb_buffer[BUFF_SIZE];
unsigned char input=0;
unsigned char output=0;
extern void cls(unsigned x,unsigned y,unsigned char high,unsigned char width);
extern void asc_tran(unsigned char x,unsigned char y,unsigned char *asc_p);
extern void ocmj_write(unsigned char data);
extern void hz_tran(unsigned char x,unsigned char y,unsigned char *hz_p);
extern void delay_ms(unsigned int n);
void put_kbbuff(unsigned char c)
 {
  kb_buffer[input]=c;
  if (input<(BUFF_SIZE-1))
     input++; 
  else
     input=0;	 
 }
unsigned char getchar(void)
  {
   unsigned char temp;
   if(output==input)
       return 0;
   else
      {
	   temp=kb_buffer[output];
	   if(output<(BUFF_SIZE-1))
	     {
		  output++;
		 }
	   else
	     output=0;
	   return temp;	  
	  }	     
  }
void init_kb(void)
    {
	EICRB=0x02; 
    bitcount = 11;
    }
void decode(unsigned char sc)
    {
      static unsigned char shift,up,shiftup;
	  unsigned char i;
	  if (sc==0xf0)
	      {
		   up=1;
		   return;
		  }
	  if (up==1)
	  	  {
		   up=0;
		   if ((sc==0x12)|(sc==0x59)) shift=0;
		   return;
		  }
	  if(sc==0x71)
	     {
		  ocmj_write(0xf4);
		  hz_tran(1,1,"将要重新启动");
		  asm("wdr");
          WDTCR=(1<<WDCE)|(1<<WDE);
		  WDTCR|=(1<<WDP0)|(1<<WDP1)|(1<<WDP2);//大约2秒
		  while(1)
		  ;
		  //delay_ms(3000);
		 }	 	   
	  switch (sc)
	    {
		 case 0x12:{
					shift=1;		
					shiftup=1;
		           }		           
		 case 0x59:{
				    shift=1;	
					shiftup=1;
		           }		           
		 default:{
		          if (shift==0)
					 {
					 for(i = 0;unshifted[i][0]!=sc && unshifted[i][0]; i++);
                     if (unshifted[i][0] == sc)
						  put_kbbuff(unshifted[i][1]);	 
					 }
				  else
				     {
					 for(i = 0;shifted[i][0]!=sc && shifted[i][0]; i++);
                     if (shifted[i][0] == sc)
                         {
						  put_kbbuff(shifted[i][1]);						  
						 }	 	 						 
					 } 
		         }		         
		} 
		/*debug
	 kb_buffer[1]=ascii[sc%16];
	 sc=sc/16;
	 kb_buffer[0]=ascii[sc%16];
	    debug*/	
    }
#pragma interrupt_handler int4_isr:6
void int4_isr(void)
   {
    static unsigned char data;   
	/*if((bitcount < 11)&(bitcount > 2))
       {
	    data = (data >> 1);
        if((PINE&0x20)!=0)
           data|=0x80;
	   }   
    if (--bitcount==0)
	     {
		  bitcount=11;
		  decode(data);
		 }*/
    switch (bitcount)
	  {
	   case 11:{
	            if ((PINE&0x20)!=0)
				     return;
			    else		 
	   			    bitcount--;
	    		break;}
	   case 2:{
	   			bitcount--;	   		   
			    break;}
	   case 1:{
	   			bitcount--;	 
				if ((PINE&0x20)==0)
				    {
					 bitcount=11;
					 return;
					}
				else
				   {
				    bitcount=11;
		            decode(data);
				   }	  
	   	        break;}
	   default:{
	   	        data = (data >> 1);
                if((PINE&0x20)!=0)
                    data|=0x80;
				bitcount--;
	            }		
	  }		 		 	  	
    } 




⌨️ 快捷键说明

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