ps2main._c

来自「AVR单片机(Atmega16)的PS2键盘驱动程序」· _C 代码 · 共 66 行

_C
66
字号
#include <iom16v.h>
#include <macros.h>
#include "1602.h"
#include "KeyCode.h"

#define uchar unsigned char
#define uint  unsigned int

uchar Int_Number=0;               //中断计数器;
uchar Key_Value=0;             //键盘编码值;
//extern Finish;
//extern Key_Up;

void Init()
{PORTD = 0x06;
 DDRD  = 0x00;
// DDRD&=~0x06;             //110b,
 //PORTD|=0x06;             //110b,PD1,PD2输入,上拉  
 MCUCR=MCUCR&0xfc;       //INT0低电平中断
 GICR|=(1<<INT0);       //INT0中断使能
 SEI();
 LCD_Init();
}

void main()
{uchar i,j;
 j=0;
 Init();
 LCD_Write_String(0,1,"Please input");
 LCD_SetXY(0,2);
 while(1){
   if(Finish)                //检测到键盘输入
	{Finish=0;            //清除检测标志
	 i=Decode(Key_Value);    //键盘译码
     if((i>=0)&&(i<=9)){//数字键处理	         
	    LCD_Write_String(0,1,"Success!     ");
		LCD_Write_Char(j,2,0x30+i);}     //显示
	 j++;
	 if(j==16) { 
	     j=0;LCD_Write_String(0,2,"                             ");}		 
	 }}
}

 


#pragma interrupt_handler Serve1:INT0  //2
void Serve1(void)
{if(!Key_Up)
  {if ((Int_Number > 0) && (Int_Number < 9))  //接受只有一字节通码字符
	{Key_Value = Key_Value >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
	 if (PIND&0x02) Key_Value = Key_Value|0x80;} //当键盘数据线为1时为1到最高位
  if(Int_Number==10) Finish=1;//收到第10个脉冲表示一字节传送完成
  if(Int_Number==33) Int_Number=0;//收到第33个脉冲表示按键断码传送完成
  while (!(PIND&0x04)); //等待PS/2CLK拉高
     Int_Number++;}
 else
  {if ((Int_Number > 0) && (Int_Number < 9)) //接受双字节通码字符
	{Key_Value = Key_Value >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
	 if (PIND&0x02) Key_Value = Key_Value|0x80;} //当键盘数据线为1时为1到最高位
   if(Int_Number==10) Finish=1;
   if(Int_Number==55) {Int_Number=0;Key_Up=0;}
   while (!(PIND&0x04)); //等待PS/2CLK拉高
     Int_Number++;}	
}

⌨️ 快捷键说明

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