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

📄 ps2main.c

📁 AVR单片机(Atmega16)的PS2键盘驱动程序
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -