搜索
bottom↓
回复: 21

PS2键盘扫描程序

[复制链接]

出0入0汤圆

发表于 2009-3-7 11:21:06 | 显示全部楼层 |阅读模式
根据51单片机程序修改成PIC单片机PS2键盘扫描程序:

PS2键盘扫描程序连接图 (原文件名:PS2键盘扫描程序.jpg)

//**************************************************
//*************工程名称:PS2 program.c*************
//***********LCD 1602显示PS2键盘扫描程序***********
//**************************************************


//**************************************************
//实验目的:
//熟悉使用PS2键盘设备和PIC单片机进行通讯
//**************************************************


//**************************************************
//硬件设置:
//1、SW1开关1和2闭合,其他断开
//2、SW4开关全部断开
//3、把J11的9脚和J12的8脚跳线冒拔掉,用杜邦线把J12
//   的8脚连到J11的9脚(PS2的CLK用RB0/INT来实现)
//4、在J3插上1602 LCD
//**************************************************


//**************************************************
//*****************定义头文件**********************
//**************************************************
#include<pic.h>
#include"scancodes.h"

//**************************************************
//******************定义配置位*********************
//**************************************************
__CONFIG(0x3541);      
//FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护
//RB3为数字IO口,低电压复位使能,上电延时开,看门狗关,4M晶体XT振荡器


//**************************************************
//******************定义常量***********************
//**************************************************
#define uchar unsigned char
#define uint  unsigned int


//**************************************************
//*****************LCD 1602引脚定义****************
//**************************************************
#define LCM_RS    RA1
#define LCM_RW    RA2
#define LCM_E     RA3
#define LCM_Data  PORTD


//**************************************************
//******************PS2键盘引脚定义****************
//**************************************************
#define Key_Data  RE2
#define Key_CLK   RB0                              


//**************************************************
//******************定义变量***********************
//**************************************************
uchar IntNum = 0;     //中断次数计数
uchar KeyV;           //键值
uchar DisNum = 0;     //显示用指针
uchar Key_UP = 0;     //Key_UP是键松开标识
uchar Shift = 0;      //Shift是Shift键按下标识
uchar BF = 0;         //标识是否有字符被收到


//**************************************************
//******************定义常量***********************
//**************************************************
const uchar cdle_net[] = {"Fei fan electron"};
const uchar email[] = {"Tel:13751390297"};
const uchar Cls[] = {"                "};


//***********************************************
//函 数 名:Delay5Ms();
//入口参数:无
//出口参数:无
//函数作用:5毫秒延时函数
//说    明:
//***********************************************
void Delay5Ms(void)
{        
uint TempCyc = 5552;        
while(TempCyc--){;}
}


//***********************************************
//函 数 名:Delay400Ms();
//入口参数:无
//出口参数:无
//函数作用:400毫秒延时函数
//说    明:
//***********************************************
void Delay400Ms(void)
{        
uchar TempCycA = 5;        
uint TempCycB;        
while(TempCycA--)        
{               
  TempCycB=7269;               
  while(TempCycB--){;}   
}
}


//***********************************************
//函 数 名:check_busy();
//入口参数:无
//出口参数:无
//函数作用:LCD读忙函数
//说    明:
//***********************************************
void check_busy(void)
{        
LCM_Data = 0xFF;
TRISD=0XFF;            //设置RD口为输入口        
LCM_RS = 0;            //设置为指令
LCM_RW = 1;            //设置为读指令
while(1)                  
{
     LCM_E=1;           //使能LCD   
     if(RD7==0){break;} //RD7为零,说明所有操作已完成则是不忙状态   
     LCM_E=0;           //禁止LCD   
}
LCM_E=0;               //禁止LCD      
TRISD=0X00;            //设置RD口为输出口                           
}


//***********************************************
//函 数 名:WriteDataLCM(uchar data);
//入口参数:data
//出口参数:无
//函数作用:写LCD单个数据函数
//说    明:
//***********************************************
void WriteDataLCM(uchar data)
{        
check_busy();      //等待忙标志结束                 
LCM_RS = 1;        //设置为数据
LCM_RW = 0;        //设置为写指令
LCM_E = 1;         //使能LCD  
LCM_Data = data;   //写数据到RD端口      
LCM_E = 0;         //禁止LCD           
}


//***********************************************
//函 数 名:WriteCommandLCM(uchar command);
//入口参数:WDLCM,BuysC
//出口参数:无
//函数作用:写LCD指令函数
//说    明:
//***********************************************
void WriteCommandLCM(uchar command)
{        
check_busy();        //等待忙标志结束            
LCM_RS = 0;          //设置为指令
LCM_RW = 0;          //设置为写指令
LCM_E = 1;           //使能LCD
LCM_Data = command;  //写指令到RD端口  
LCM_E = 0;           //禁止LCD  
}


//***********************************************
//函 数 名:LCMInit();
//入口参数:无
//出口参数:无
//函数作用:LCD初始化函数
//说    明:
//***********************************************
void LCMInit(void)
{        
LCM_Data = 0;                       
WriteCommandLCM(0x38);    //显示模式设置,开始要求每次检测忙信号        
WriteCommandLCM(0x08);    //关闭显示        
WriteCommandLCM(0x01);    //显示清屏        
WriteCommandLCM(0x06);    //显示光标移动设置        
WriteCommandLCM(0x0F);    //显示开及光标设置
}


//***********************************************
//函 数 名:DisplayOneChar(uchar X, uchar Y, uchar DData);
//入口参数:X, Y, DData
//出口参数:无
//函数作用:按指定位置显示一个字符函数
//说    明:
//***********************************************
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{        
Y &= 0x1;        
X &= 0xF;                //限制X不能大于15,Y不能大于1        
if (Y) X |= 0xC0;        //当要显示第二行时地址码+0xC0;        
X |= 0x80;               //算出指令码        
WriteCommandLCM(X);      //发命令字        
WriteDataLCM(DData);     //发数据
}


//***********************************************
//函 数 名:DisplayListChar(uchar X, uchar Y, const uchar *DData);
//入口参数:X, Y, *DData
//出口参数:无
//函数作用:按指定位置显示一串字符函数
//说    明:
//***********************************************
void DisplayListChar(uchar X, uchar Y, const uchar *DData)
{        
uchar ListLength;               
ListLength = 0;        
Y &= 0x1;        
X &= 0xF;                                        //限制X不能大于15,Y不能大

于1        
while (DData[ListLength]>0x19)                   //若到达字串尾则退出        
{               
  if (X <= 0xF)                                //X坐标应小于0xF        

        
  {                        
   DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符      

                  
   ListLength++;                        
   X++;               
  }        
}
}


//***********************************************
//函 数 名:Decode(uchar ScanCode);
//入口参数:ScanCode
//出口参数:无
//函数作用:查找键盘代码函数
//说    明:如SHIFT+G为12H 34H F0H 34H F0H 12H,
//          也就是说shift的通码+G的通码+shift的
//          断码+G的断码
//***********************************************
void Decode(uchar ScanCode)
{        
uchar TempCyc;               
if (!Key_UP)             //当键盘松开时        
{               
  switch (ScanCode)               
  {                        
   case 0xF0 :      // 当收到0xF0,Key_UP置1表示断码开始        

               
   Key_UP = 1;                        
   break;
                                               
   case 0x12 :      // 左 SHIFT                        
   Shift = 1;                        
   break;                                                

   case 0x59 :      // 右 SHIFT                        
   Shift = 1;                        
   break;                                                
   default:                        

   if (DisNum > 15)                        
   {                                
    DisplayListChar(0, 1, Cls);   //清LCD第二行         

                     
    DisNum = 0;                        
   }                        
   if(!Shift)                        //如果SHIFT没按下         

              
   {                                
    for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)

&&(TempCyc<59); TempCyc++); //查表显示
                if (UnShifted[TempCyc][0] == ScanCode)
    {
     DisplayOneChar(DisNum, 1, UnShifted

[TempCyc][1]);                              
     DisNum++;
    }
   }                        
   else                              //按下SHIFT               

        
   {                                
    for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&

(TempCyc<59); TempCyc++);   //查表显示                        
    if (Shifted[TempCyc][0] == ScanCode)
    {
     DisplayOneChar(DisNum, 1, Shifted[TempCyc]

[1]);
                 DisNum++;
    }
   }                                                
   break;               
  }        
}        
else        
{               
  Key_UP = 0;               
  switch (ScanCode)   //当键松开时不处理判码,如G 34H F0H 34H 那么第二

个34H不会被处理               
  {                        
   case 0x12 :     // 左 SHIFT                        
   Shift = 0;                        
   break;                                                

   case 0x59 :     // 右 SHIFT                        
   Shift = 0;                        
   break;               
  }        
}        
BF = 0;                 //标识字符处理完了
}


//***********************************************
//函 数 名:port_init();
//入口参数:无
//出口参数:无
//函数作用:端口初始化
//说    明:
//***********************************************
void port_init(void)
{
TRISA1=0;    //设置LCM_RS为输出口
TRISA2=0;    //设置LCM_RW为输出口
TRISA3=0;    //设置LCM_E为输出口
TRISB0=1;    //设置PS2_CLK为输入口
TRISE2=1;    //设置PS2_DATA为输入口
TRISD=0X00;  //设置LCM_DATA为输出口
ADCON1=0X07; //设置RA口和RE口为数字I/O口
}


//***********************************************
//函 数 名:main();
//入口参数:无
//出口参数:无
//函数作用:MAIN函数
//说    明:
//***********************************************
void main(void)
{        
uchar TempCyc;   
port_init();                            //调用端口初始化函数            
Delay400Ms();                           //启动等待,等LCM讲入工作状态        
LCMInit();                              //LCM初始化        
Delay5Ms();                             //延时片刻(可不要)               
DisplayListChar(0, 0, cdle_net);        
DisplayListChar(0, 1, email);            
for (TempCyc=0; TempCyc<10; TempCyc++)        
Delay400Ms();                           //延时        
DisplayListChar(0, 1, Cls);               
INTEDG= 0;                              //设外部中断低电平触发
INTF=0;                                 //清中断标志      
INTE = 1;                               //开外部中断
GIE = 1;                                //开全局中断               
do        
{               
  if (BF){Decode(KeyV);}               
  else   {INTE = 1;}                  //开外部中断      
}while(1);
}


//***********************************************
//函 数 名:Keyboard_out();
//入口参数:无
//出口参数:无
//函数作用:中断函数
//说    明:
//***********************************************
void interrupt Keyboard_out(void)
{
if(INTE&&INTF)
{        
  if((IntNum>0)&&(IntNum<9))        
  {               
   KeyV=KeyV>>1;             //因键盘数据是低>>高,结合上一句所

以右移一位               
   if(Key_Data)
   {
    KeyV=KeyV|0x80;       //当键盘数据线为1时为1到最高位
   }
  }        
  IntNum++;        
  while (!Key_CLK){;}           //等待PS/2CLK拉高               
  if (IntNum > 10)        
  {               
   IntNum = 0;               //当中断10次后表示一帧数据收完,清

变量准备下一次接收               
   BF = 1;                   //标识有字符输入完了               


   INTE = 0;                 //关中断等显示完后再开中断      
  }
  INTF=0;
}
}

下面是scancodes.h文件:

const unsigned char UnShifted[59][2] = {        
0x1C, 'a',        
0x32, 'b',        
0x21, 'c',        
0x23, 'd',        
0x24, 'e',        
0x2B, 'f',        
0x34, 'g',        
0x33, 'h',        
0x43, 'i',        
0x3B, 'j',        
0x42, 'k',        
0x4B, 'l',        
0x3A, 'm',        
0x31, 'n',        
0x44, 'o',        
0x4D, 'p',        
0x15, 'q',        
0x2D, 'r',        
0x1B, 's',        
0x2C, 't',        
0x3C, 'u',        
0x2A, 'v',        
0x1D, 'w',        
0x22, 'x',        
0x35, 'y',        
0x1A, 'z',        
0x45, '0',        
0x16, '1',        
0x1E, '2',        
0x26, '3',        
0x25, '4',        
0x2E, '5',        
0x36, '6',        
0x3D, '7',        
0x3E, '8',        
0x46, '9',        
0x0E, '`',        
0x4E, '-',        
0x55, '=',        
0x5D, '\\',        
0x29, ' ',        
0x54, '[',        
0x5B, ']',        
0x4C, ';',        
0x52, '\'',        
0x41, ',',        
0x49, '.',        
0x4A, '/',        
0x71, '.',        
0x70, '0',        
0x69, '1',        
0x72, '2',        
0x7A, '3',        
0x6B, '4',        
0x73, '5',        
0x74, '6',        
0x6C, '7',        
0x75, '8',        
0x7D, '9',
};

const unsigned char Shifted[59][2] = {        
0x1C, 'A',        
0x32, 'B',        
0x21, 'C',        
0x23, 'D',        
0x24, 'E',        
0x2B, 'F',        
0x34, 'G',        
0x33, 'H',        
0x43, 'I',        
0x3B, 'J',        
0x42, 'K',        
0x4B, 'L',        
0x3A, 'M',        
0x31, 'N',        
0x44, 'O',        
0x4D, 'P',        
0x15, 'Q',        
0x2D, 'R',        
0x1B, 'S',        
0x2C, 'T',        
0x3C, 'U',        
0x2A, 'V',        
0x1D, 'W',        
0x22, 'X',        
0x35, 'Y',        
0x1A, 'Z',        
0x45, '0',        
0x16, '1',        
0x1E, '2',        
0x26, '3',        
0x25, '4',        
0x2E, '5',        
0x36, '6',        
0x3D, '7',        
0x3E, '8',        
0x46, '9',        
0x0E, '~',        
0x4E, '_',        
0x55, '+',        
0x5D, '|',        
0x29, ' ',        
0x54, '{',        
0x5B, '}',        
0x4C, ':',        
0x52, '"',        
0x41, '<',        
0x49, '>',        
0x4A, '?',        
0x71, '.',        
0x70, '0',        
0x69, '1',        
0x72, '2',        
0x7A, '3',        
0x6B, '4',        
0x73, '5',        
0x74, '6',        
0x6C, '7',        
0x75, '8',        
0x7D, '9',
};

联系方式:

QQ:244746259

旺旺:huang88549

E-mail:huang88549@163.com

出0入21汤圆

发表于 2009-3-7 12:14:49 | 显示全部楼层
一个酷贴都没有,就在这里做广告。

出0入0汤圆

发表于 2009-3-7 16:17:20 | 显示全部楼层
把改之前的51源程序发上来看看,好不?

出0入0汤圆

发表于 2009-3-7 19:29:30 | 显示全部楼层
强烈列建议把51源码发一下

出0入0汤圆

 楼主| 发表于 2009-3-9 08:11:22 | 显示全部楼层
根据上面朋友的要求,现在把51的PS2键盘程序贴出来:
#include "reg51.h"
#include "scancodes.h"

#define LCM_RW    P2_0      //定义LCD引脚
#define LCM_RS    P2_1
#define LCM_E     P2_2
#define LCM_Data  P1
#define Key_Data  P3_4      //定义Keyboard引脚
#define Key_CLK   P3_3
#define Busy      0x80      //用于检测LCM状态字中的Busy标识



unsigned char code cdle_net[] = {"www.cdle.net--"};
unsigned char code email[] = {"pnzwzw@cdle.net"};
unsigned char code Cls[] = {"                "};

static unsigned char IntNum = 0;     //中断次数计数
static unsigned char KeyV;           //键值
static unsigned char DisNum = 0;     //显示用指针
static unsigned char Key_UP = 0;     //Key_UP是键松开标识
static unsigned char Shift = 0;      //Shift是Shift键按下标识
static unsigned char BF = 0;         //标识是否有字符被收到

void main(void)
{        
        unsigned char TempCyc;               
        Delay400Ms();                           //启动等待,等LCM讲入工作状态        
        LCMInit();                              //LCM初始化        
        Delay5Ms();                             //延时片刻(可不要)               
        DisplayListChar(0, 0, cdle_net);        
        DisplayListChar(0, 1, email);        
        ReadDataLCM();                          //测试用句无意义        
        for (TempCyc=0; TempCyc<10; TempCyc++)        
        Delay400Ms();                           //延时        
        DisplayListChar(0, 1, Cls);               
        IT1 = 0;                                //设外部中断1为低电平触发        
        EA = 1;        
        EX1 = 1;                                //开中断               
        do        
        {               
                if (BF)               
                Decode(KeyV);               
                else               
                EA = 1;                         //开中断        
        }while(1);
}

//写数据
void WriteDataLCM(unsigned char WDLCM)
{        
        ReadStatusLCM();     //检测忙        
        LCM_Data = WDLCM;        
        LCM_RS = 1;        
        LCM_RW = 0;        
        LCM_E = 0;           //若晶振速度太高可以在这后加小的延时        
        LCM_E = 0;           //延时        
        LCM_E = 1;
}

//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC)  //BuysC为0时忽略忙检测
{        
        if (BuysC) ReadStatusLCM();              //根据需要检测忙        
        LCM_Data = WCLCM;        
        LCM_RS = 0;        
        LCM_RW = 0;        
        LCM_E = 0;        
        LCM_E = 0;        
        LCM_E = 1;
}

//读数据
unsigned char ReadDataLCM(void)
{        
        LCM_RS = 1;        
        LCM_RW = 1;        
        LCM_E = 0;        
        LCM_E = 0;        
        LCM_E = 1;        
        return(LCM_Data);
}

//读状态
unsigned char ReadStatusLCM(void)
{        
        LCM_Data = 0xFF;        
        LCM_RS = 0;        
        LCM_RW = 1;        
        LCM_E = 0;        
        LCM_E = 0;        
        LCM_E = 1;        
        while (LCM_Data & Busy);    //检测忙信号        
        return(LCM_Data);
}

//LCM初始化
void LCMInit(void)
{        
        LCM_Data = 0;        
        WriteCommandLCM(0x38,0);    //三次显示模式设置,不检测忙信号        
        Delay5Ms();        
        WriteCommandLCM(0x38,0);        
        Delay5Ms();        
        WriteCommandLCM(0x38,0);        
        Delay5Ms();               
        WriteCommandLCM(0x38,1);    //显示模式设置,开始要求每次检测忙信号        
        WriteCommandLCM(0x08,1);    //关闭显示        
        WriteCommandLCM(0x01,1);    //显示清屏        
        WriteCommandLCM(0x06,1);    // 显示光标移动设置        
        WriteCommandLCM(0x0F,1);    // 显示开及光标设置
}

//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{        
        Y &= 0x1;        
        X &= 0xF;                //限制X不能大于15,Y不能大于1        
        if (Y) X |= 0x40;        //当要显示第二行时地址码+0x40;        
        X |= 0x80;               //算出指令码        
        WriteCommandLCM(X, 1);   //发命令字        
        WriteDataLCM(DData);     //发数据
}

//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{        
        unsigned char ListLength;               
        ListLength = 0;        
        Y &= 0x1;        
        X &= 0xF;                                                  //限制X不能大于15,Y不能大于1        
        while (DData[ListLength]>0x19)                             //若到达字串尾则退出        
        {               
                if (X <= 0xF)                                      //X坐标应小于0xF               
                {                        
                        DisplayOneChar(X, Y, DData[ListLength]);   //显示单个字符                        
                        ListLength++;                        
                        X++;               
                }        
        }
}

//5ms延时
void Delay5Ms(void)
{        
        unsigned int TempCyc = 5552;        
        while(TempCyc--);
}

//400ms延时
void Delay400Ms(void)
{        
        unsigned char TempCycA = 5;        
        unsigned int TempCycB;        
        while(TempCycA--)        
        {               
                TempCycB=7269;               
                while(TempCycB--);        
        };
}

void Keyboard_out(void) interrupt 2
{        
        if ((IntNum > 0) && (IntNum < 9))        
        {               
                KeyV = KeyV >> 1;                  //因键盘数据是低>>高,结合上一句所以右移一位               
                if (Key_Data) KeyV = KeyV | 0x80;  //当键盘数据线为1时为1到最高位        
        }        
        IntNum++;        
        while (!Key_CLK);                          //等待PS/2CLK拉高               
        if (IntNum > 10)        
        {               
                IntNum = 0;                        //当中断10次后表示一帧数据收完,清变量准备下一次接收               
                BF = 1;                            //标识有字符输入完了               
                EA = 0;                            //关中断等显示完后再开中断      
        }
}

//注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
void Decode(unsigned char ScanCode)
{        
        unsigned char TempCyc;               
        if (!Key_UP)                     //当键盘松开时        
        {               
                switch (ScanCode)               
                {                        
                        case 0xF0 :      // 当收到0xF0,Key_UP置1表示断码开始                        
                        Key_UP = 1;                        
                        break;
                                               
                        case 0x12 :      // 左 SHIFT                        
                        Shift = 1;                        
                        break;                                                

                        case 0x59 :      // 右 SHIFT                        
                        Shift = 1;                        
                        break;                                                
                        default:                        

                        if (DisNum > 15)                        
                        {                                
                                DisplayListChar(0, 1, Cls);     //清LCD第二行                                
                                DisNum = 0;                        
                        }                        
                        if(!Shift)                              //如果SHIFT没按下                        
                        {                                
                                for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++);    //查表显示
                                 if (UnShifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]);      

                                DisNum++;                        
                        }                        
                        else                                    //按下SHIFT                        
                        {                                
                                for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++);      //查表显示   

                                    if (Shifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, Shifted[TempCyc][1]);         

                                      DisNum++;                       
                        }                                                
                        break;               
                }        
        }        
        else        
        {               
                Key_UP = 0;               
                switch (ScanCode)       //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理               
                {                        
                        case 0x12 :     // 左 SHIFT                        
                        Shift = 0;                        
                        break;                                                

                        case 0x59 :     // 右 SHIFT                        
                        Shift = 0;                        
                        break;               
                }        
        }        
        BF = 0;                         //标识字符处理完了
}

以下为 scancodes.h 文件
unsigned char code UnShifted[59][2] = {        
        0x1C, 'a',        
        0x32, 'b',        
        0x21, 'c',        
        0x23, 'd',        
        0x24, 'e',        
        0x2B, 'f',        
        0x34, 'g',        
        0x33, 'h',        
        0x43, 'i',        
        0x3B, 'j',        
        0x42, 'k',        
        0x4B, 'l',        
        0x3A, 'm',        
        0x31, 'n',        
        0x44, 'o',        
        0x4D, 'p',        
        0x15, 'q',        
        0x2D, 'r',        
        0x1B, 's',        
        0x2C, 't',        
        0x3C, 'u',        
        0x2A, 'v',        
        0x1D, 'w',        
        0x22, 'x',        
        0x35, 'y',        
        0x1A, 'z',        
        0x45, '0',        
        0x16, '1',        
        0x1E, '2',        
        0x26, '3',        
        0x25, '4',        
        0x2E, '5',        
        0x36, '6',        
        0x3D, '7',        
        0x3E, '8',        
        0x46, '9',        
        0x0E, '`',        
        0x4E, '-',        
        0x55, '=',        
        0x5D, '\\',        
        0x29, ' ',        
        0x54, '[',        
        0x5B, ']',        
        0x4C, ';',        
        0x52, '\'',        
        0x41, ',',        
        0x49, '.',        
        0x4A, '/',        
        0x71, '.',        
        0x70, '0',        
        0x69, '1',        
        0x72, '2',        
        0x7A, '3',        
        0x6B, '4',        
        0x73, '5',        
        0x74, '6',        
        0x6C, '7',        
        0x75, '8',        
        0x7D, '9',
};

unsigned char code Shifted[59][2] = {        
        0x1C, 'A',        
        0x32, 'B',        
        0x21, 'C',        
        0x23, 'D',        
        0x24, 'E',        
        0x2B, 'F',        
        0x34, 'G',        
        0x33, 'H',        
        0x43, 'I',        
        0x3B, 'J',        
        0x42, 'K',        
        0x4B, 'L',        
        0x3A, 'M',        
        0x31, 'N',        
        0x44, 'O',        
        0x4D, 'P',        
        0x15, 'Q',        
        0x2D, 'R',        
        0x1B, 'S',        
        0x2C, 'T',        
        0x3C, 'U',        
        0x2A, 'V',        
        0x1D, 'W',        
        0x22, 'X',        
        0x35, 'Y',        
        0x1A, 'Z',        
        0x45, '0',        
        0x16, '1',        
        0x1E, '2',        
        0x26, '3',        
        0x25, '4',        
        0x2E, '5',        
        0x36, '6',        
        0x3D, '7',        
        0x3E, '8',        
        0x46, '9',        
        0x0E, '~',        
        0x4E, '_',        
        0x55, '+',        
        0x5D, '|',        
        0x29, ' ',        
        0x54, '{',        
        0x5B, '}',        
        0x4C, ':',        
        0x52, '"',        
        0x41, '<',        
        0x49, '>',        
        0x4A, '?',        
        0x71, '.',        
        0x70, '0',        
        0x69, '1',        
        0x72, '2',        
        0x7A, '3',        
        0x6B, '4',        
        0x73, '5',        
        0x74, '6',        
        0x6C, '7',        
        0x75, '8',        
        0x7D, '9',
};

出0入0汤圆

发表于 2009-3-23 01:29:03 | 显示全部楼层
顶!

出0入0汤圆

发表于 2009-3-23 09:44:57 | 显示全部楼层
很不错嘛

出0入0汤圆

发表于 2009-4-7 00:06:47 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-9-4 10:58:45 | 显示全部楼层

出0入0汤圆

发表于 2009-9-11 10:28:58 | 显示全部楼层
中断里面  while (!Key_CLK){;}           //等待PS/2CLK拉高
比较危险

出0入0汤圆

发表于 2009-9-25 17:02:29 | 显示全部楼层
so good!!!

出0入0汤圆

发表于 2009-10-6 14:52:00 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-10-10 16:23:11 | 显示全部楼层
看看

出0入0汤圆

发表于 2009-10-16 13:43:24 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2009-10-28 19:47:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-31 07:09:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-11-3 11:42:57 | 显示全部楼层
不错的帖子,学习!

出0入0汤圆

发表于 2011-9-20 09:21:29 | 显示全部楼层
不错不错 学习

出0入0汤圆

发表于 2011-9-23 21:59:15 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-10-15 21:05:28 | 显示全部楼层
good!

出0入0汤圆

发表于 2014-8-17 13:47:20 | 显示全部楼层
mark       .
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 21:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表