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

📄 ps2.i

📁 PS2键盘驱动程序
💻 I
📖 第 1 页 / 共 2 页
字号:
	  }
    Send_lcd(0,0x00,0x00,0xb2);			   //自动写入结束
}
void Reset_Cgram()
{
   unsigned int i;
   Send_lcd(2,0x03,0x00,0x22);				//置CGRAM偏置地址为0x03(0011 100000 000)
   Send_lcd(2,0x00,0x1c,0x24);				//置CGRAM字模首地址为0x1c (001 1100 00000000)
   Send_lcd(0,0x00,0x00,0xb0);				//设置自动写方式,(地址自动增一)
   for(i=0;i<1024;i++)						//将汉字点阵写入对应CGRAM区域
    {
	  Read_Sta(3);  						//读状态三,写标志判断 
	  //delay_us(100);
	  Post_Msg(k[i]);	
	}
   Send_lcd(0,0x00,0x00,0xb2);				//自动写入结束
}
//************************************
//显示屏初始化函数
//************************************
void resetlcd()
{ 
  DDRB=0x2f;
  DDRC=0xff;
  PORTC =0xff;
  Clear();
  Reset_Cgram();
  Send_lcd(2,0x00,0x00,0x40);               //文本区首地址(0x00,0x00)
  Send_lcd(2,30,0x00,0x41);			//文本区宽度(30字符)
  Send_lcd(2,0x00,0x08,0x42);               //图形区首地址(0x00,0x08)
  Send_lcd(2,30,0x00,0x43);           //图形区宽度(30字符位置)  
  Send_lcd(0,0x00,0x00,0xa0);               //光标形状态(一行高度)    
  Send_lcd(0,0x00,0x00,0x80);               //点阵逻辑"或"合成
  Send_lcd(0,0x00,0x00,0x9f);               //开文本显示区,开图形显示区,显示光标,置光标闪烁
}
//************************************
//显示单个英文字符函数
//说明:输入参数x_h:字符行坐标,(0-15),y_l:字符列坐标(0-29),word为字符代码(支持ASCII码)
//************************************
void word(unsigned char x_h,unsigned char y_l,unsigned char word)
{
   	unsigned int sum;
	sum=(unsigned int)(30)*(unsigned int)(x_h)+(unsigned int)(y_l);				   //计算当前字符位置以前的总点阵数量
	Send_lcd(2,sum%256,sum/256,0x24);	   //转换为实际行和列地址,并写入LCD
	Send_lcd(1,word,0x00,0xc0);		   //写入LCD当前字符数据
	Send_lcd(2,0,0,0x24);			    //光标回位
}
//************************************
//显示英文字符串函数
//说明:输入参数x_h:字符串行坐标(0-15),y_l:字符串起始列坐标(0-29),word_list:字符串指针,(提示:当本行写满时,会自动换行)
//************************************
void listword(unsigned char x_h,unsigned char y_l,unsigned char *word_list)
{
  unsigned char length=0;
  while(word_list[length]!=0x00)    	   //判断是否字符串结束,将字符串拆分成为单个字符轮流显示
	{
	  word(x_h+length/30,y_l+length%256,word_list[length++]-32);	   //得到实际行坐标和列坐标,调用显示当前单字符
	}
  Send_lcd(2,0,0,0x24);					   //光标回位
} 
void chinese(unsigned char x_h,char y_l,unsigned char dat)
{
   unsigned int sum;
   dat=0x80+dat*4;                                 //得到实际地址
   sum=(unsigned int)(x_h)*(unsigned int)(30)+(unsigned int)y_l;					   //得到当前字符位置
   y_l=sum%256;                                    //得到显示列数
   x_h=sum/256;							   //得到显示行数
   Send_lcd(2,y_l,x_h,0x24);					   //置显示地址
   Send_lcd(1,dat,0x00,0xc0);					   //送显示值--汉字左上部分 
   Send_lcd(1,dat+2,0x00,0xc0);					   //送显示值--汉字右上部分
   sum=sum+30;						   //修正下半部分字符位置
   y_l=sum%256;							   //得到显示列数
   x_h=sum/256;							   //得到显示行数
   Send_lcd(2,y_l,x_h,0x24);					   //置显示地址
   Send_lcd(1,dat+1,0x00,0xc0);					   //送显示值--汉字左下部分 
   Send_lcd(1,dat+3,0x00,0xc0);					   //送显示值--汉字右下部分
   Send_lcd(2,0,0,0x24);
}

//************************************
//画实点函数
//说明:该函数可以产行屏幕上的任意位置上的点,输入参数,X:行坐标(0-127)Y:列坐标(0-239)
//************************************ 

void point(unsigned char X,unsigned char Y)
{
   unsigned int Sum;						       
   Sum=(unsigned int)(X)*(unsigned int)(30)*8+(unsigned int)Y;//得到当单位置前的点阵和
   Send_lcd(2,Sum/8,Sum/2048+0x08,0x24);		   //换算出实际行列坐标,并将操作地址写入lcd
   Send_lcd(0,0x00,0x00,(0x07-Y%8)|0xf8); 		   //换算出当前位,将该位置1显示
}/* */  
void cursor(unsigned char y,unsigned char x)
{Send_lcd(2,x,y,0x21);
 }


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)
{
DDRD.1=0;//主机向键盘发送命令时需要将该端口置为输出
DDRD.2=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(PIND.1)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 + -