📄 ps2main.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 + -