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

📄 ps2.c

📁 PS2键盘驱动程序
💻 C
字号:
//PS2键盘驱动程序,使用第二套扫描码
//CLK接INT0(PD2)使用外部中断0来检测时钟脉冲,DATE接PD1

#include <mega16.h>
#include <delay.h>
#include "avryejing.c"

#define PSCLK_PORT PORTD.2
#define PSDATA_PORT PORTD.1
#define PSCLK_PIN PIND.2
#define PSDATA_PIN PIND.1
#define PSCLK_DDR DDRD.2
#define PSDATA_DDR DDRD.1

unsigned char int0_cnt=0;       //中断次数
unsigned char tmp=0;
unsigned char code=0;            //键盘发往主机的编码
unsigned char lastcode=0;
unsigned char hang=0;
unsigned char lie=0; 

unsigned char kk=0;

bit xiao=0;
bit num_lock=0;
bit caps_lock=0;
bit shift=0;
bit flag=0;//显示标志位

void init_io(void)
{
PSDATA_DDR=0;//主机向键盘发送命令时需要将该端口置为输出
PSCLK_DDR=0;//主机向键盘发送命令时需要将该端口置为输出
//后面会对PORTD进行操作

//液晶初始化
DDRC=0xff;
DDRB=0x0f;
}

void decode(unsigned char code)
{
switch(code)	//后退的是小键盘
      {      
             //a-z
	   case 0x1c: cursor(hang,lie+1);word(hang,lie,33);break;//a
	   case 0x32: cursor(hang,lie+1);word(hang,lie,34);break;//b
	   case 0x21: cursor(hang,lie+1);word(hang,lie,35);break;//c
	   case 0x23: cursor(hang,lie+1);word(hang,lie,36);break;//d
	   case 0x24: cursor(hang,lie+1);word(hang,lie,37);break;//e
	   case 0x2b: cursor(hang,lie+1);word(hang,lie,38);break;//f
	   case 0x34: cursor(hang,lie+1);word(hang,lie,39);break;//g
	   case 0x33: cursor(hang,lie+1);word(hang,lie,40);break;//h
	   case 0x43: cursor(hang,lie+1);word(hang,lie,41);break;//i
	   case 0x3b: cursor(hang,lie+1);word(hang,lie,42);break;//j
	   case 0x42: cursor(hang,lie+1);word(hang,lie,43);break;//k
	   case 0x4b: cursor(hang,lie+1);word(hang,lie,44);break;//l
	   case 0x3a: cursor(hang,lie+1);word(hang,lie,45);break;//m
	   case 0x31: cursor(hang,lie+1);word(hang,lie,46);break;//n
	   case 0x44: cursor(hang,lie+1);word(hang,lie,47);break;//o
	   case 0x4d: cursor(hang,lie+1);word(hang,lie,48);break;//p
	   case 0x15: cursor(hang,lie+1);word(hang,lie,49);break;//q
	   case 0x2d: cursor(hang,lie+1);word(hang,lie,50);break;//r
	   case 0x1b: cursor(hang,lie+1);word(hang,lie,51);break;//s
	   case 0x2c: cursor(hang,lie+1);word(hang,lie,52);break;//t
	   case 0x3c: cursor(hang,lie+1);word(hang,lie,53);break;//u
	   case 0x2a: cursor(hang,lie+1);word(hang,lie,54);break;//v
	   case 0x1d: cursor(hang,lie+1);word(hang,lie,55);break;//w
	   case 0x22: cursor(hang,lie+1);word(hang,lie,56);break;//x
	   case 0x35: cursor(hang,lie+1);word(hang,lie,57);break;//y
	   case 0x1a: cursor(hang,lie+1);word(hang,lie,58);break;//z
	   
	   //大键盘0-9
	   case 0x45: cursor(hang,lie+1);word(hang,lie,16);break;
	   case 0x16: cursor(hang,lie+1);word(hang,lie,17);break;
	   case 0x1E: cursor(hang,lie+1);word(hang,lie,18);break;
	   case 0x26: cursor(hang,lie+1);word(hang,lie,19);break;
	   case 0x25: cursor(hang,lie+1);word(hang,lie,20);break;
	   case 0x2E: cursor(hang,lie+1);word(hang,lie,21);break;
	   case 0x36: cursor(hang,lie+1);word(hang,lie,22);break;
	   case 0x3D: cursor(hang,lie+1);word(hang,lie,23);break;
	   case 0x3E: cursor(hang,lie+1);word(hang,lie,24);break;
	   case 0x46: cursor(hang,lie+1);word(hang,lie,25);break;
	   
	   
	   //小键盘0-9
	   case 0x70: cursor(hang,lie+1);word(hang,lie,16);break;
	   case 0x69: cursor(hang,lie+1);word(hang,lie,17);break;
	   case 0x72: cursor(hang,lie+1);word(hang,lie,18);break;
	   case 0x7A: cursor(hang,lie+1);word(hang,lie,19);break;
	   case 0x6B: cursor(hang,lie+1);word(hang,lie,20);break;
	   case 0x73: cursor(hang,lie+1);word(hang,lie,21);break;
	   case 0x74: cursor(hang,lie+1);word(hang,lie,22);break;
	   case 0x6C: cursor(hang,lie+1);word(hang,lie,23);break;
	   case 0x75: cursor(hang,lie+1);word(hang,lie,24);break;
	   case 0x7D: cursor(hang,lie+1);word(hang,lie,25);break;	   
	   case 0x4A: cursor(hang,lie+1);word(hang,lie,15);break;// '/'
	   case 0x7C: cursor(hang,lie+1);word(hang,lie,10);break;// '*'
	   case 0x7B: cursor(hang,lie+1);word(hang,lie,13);break;// '-'
	   case 0x79: cursor(hang,lie+1);word(hang,lie,11);break;// '+'
	   case 0x71: cursor(hang,lie+1);word(hang,lie,14);break;// '.'
	   
	   case 0x29: cursor(hang,lie+1); break;//space
	   
	   //退格处理
	   case 0x66: 
	   if(!((hang==0)&&(lie==0)))
	   {
	   if(lie==0)
	   {
	   hang--;
	   lie=29;
	   }
	   cursor(hang,--lie);word(hang,lie,0);
	   --lie;
	   }
	   break; //Backspace
	   //回车处理
	   case 0x5a: ++hang;if(hang==16){word(0,0,hang+16);hang=0;}cursor(hang,lie=0);--lie;break; 	   
	   case 0x76: resetlcd();cursor(0,0);hang=15;lie=28;break;//esc键
             default:cursor(hang,lie);break;
        } 
        lie++;
if(lie==29)
{
lie=0;
hang++;
if(hang==16)hang=0;
}
 }

void main(void)
{
init_io();
resetlcd();
cursor(0,0);
delay_ms(10);

MCUCR=0x02;
GICR=0x40;
#asm("sei");

while(1)
          {
                    if(flag==1)
                    {
                    flag=0;                    
                    word(5,0,code/100+16);
                    word(5,1,(code%100)/10+16);
                    word(5,2,code%10+16);
                    word(6,0,kk+16);
                    kk++;
                    if(kk>9)kk=0;
                    decode(code);
                    }

                    
          }
}

interrupt [2] void int0(void)
{
int0_cnt++;
          if(int0_cnt>1&&int0_cnt<10)
          {
          tmp>>=1;
          if(PSDATA_PIN)tmp|=0x80;
          else tmp&=0x7F;                    
          }
          
          if(int0_cnt==11)
          {
          code=tmp;
          tmp=0;
          int0_cnt=0;
            if(code==0xE0)xiao=!xiao;// 标示小键盘有键按下
            //if(xiao==1 && lastcode==0xE0 && code==0xF0)xiao=0;   // 标示小键盘有键弹起
            if(code==0x12 || code==0x59)shift=!shift; //表示  shift 键被按下
            //if(lastcode==0xF0 && (code==0x12 || code==0x59))shift=0;	//表示shift 键弹起
            if(code==0x77)num_lock=!num_lock;
            //if(flag1==0xF0 && code ==0x77)num_lock=!num_lock;     //数字小键盘的  num lock 键按下
            if(code==0x58)caps_lock=!caps_lock;//caps_lock
            if(code!=0xe0 && code!=0xF0 && lastcode!=0xF0){flag=1;}
            if(lastcode==0xE0)
                    {
                    if(code==0x4A || code==0x5A)
                    flag=1;//小键盘的'/'
                    else flag=0;
                    }
            lastcode=code;
          }
}

⌨️ 快捷键说明

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