打印

PS2键盘输入,1602显示 程序

[复制链接]
2427|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#include<reg52.h>        //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "scancodes.h"
#include "LCD1602.h"
sbit Key_Data = P3^0 ;   //定义Keyboard引脚
sbit Key_CLK =P3^2;      //使用中断
bit BF;         
bit Shift;               //定义上档键标志
bit Key_UP;              //定义通码断码标志
unsigned char KeyV;
unsigned char IntNum;
unsigned char DisNum;
/******************************************************************/
/*                    函数声明                                    */
/******************************************************************/
void Decode(unsigned char ScanCode);  //解码子程序
/******************************************************************/
/*                    主函数                                      */
/******************************************************************/
void main()
{
IT1 = 0;                              //设外部中断1为低电平触发
EA = 1;                               //外部中断开
EX0 = 1;                              //开中断
InitLcd();                            //初始化1602液晶屏
do
{
if (BF)
   Decode(KeyV);
else
   EA = 1; //开中断
}
while(1);
}
/******************************************************************/
/*                    外部中断读入信息                            */
/******************************************************************/
void Keyboard_out(void) interrupt 0
{
if ((IntNum > 0) && (IntNum < 9))
   {
KeyV = KeyV >> 1;                //因键盘数据是低>>高,结合上一句所以右移一位
if (Key_Data)
     KeyV = KeyV | 0x80;          //当键盘数据线为1时到最高位
}
IntNum++;
while (!Key_CLK);                //等待PS/2CLK拉高
if (IntNum > 10)
    {
   IntNum = 0;                  //当中断11次后表示一帧数据收完,清变量准备下一次接收
   BF = 1;                      //标识有字符输入完了
  EA = 0;                      //关中断等显示完后再开中断
  }
}
/******************************************************************/
/*                    解码信息                                    */
/******************************************************************/
void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
{
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(!Shift)          //如果SHIFT没按下
     {
     for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
     if (UnShifted[TempCyc][0] == ScanCode)
      {
         ShowChar(DisNum,UnShifted[TempCyc][1]);
         DisNum++;
         if(DisNum==32)
            {
          WriteCommand(0x01);//清屏
          DisNum=0;//重头写数据
            }
           }
                     }
    else //按下SHIFT
                    {
     for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
     if (Shifted[TempCyc][0] == ScanCode)
                       {
        ShowChar(DisNum,Shifted[TempCyc][1]);
            DisNum++;
                        if(DisNum==32)
           {
              WriteCommand(0x01);//清屏
                        DisNum=0;//重头写数据
         }
        }
                      }
    if(ScanCode==0x66&&DisNum>=1)
    {
      DisNum=DisNum-1;
      ShowChar(DisNum, ' ');
      WriteCommand(0x10);
    }
     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; //标识字符处理完了
}


#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h> //标准输入输出
#include<intrins.h>

sbit RS = P2^4; //Pin4
sbit RW = P2^5; //Pin5
sbit E  = P2^6; //Pin6
#define Data  P0//数据端口
char data TimeNum[]="                ";
char data Test1[]="                  ";
/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;        /*12MHz频率*/
while(--uscnt);
}
/******************************************************************/
/*                    毫秒函数声明                                */
/******************************************************************/
void DelayMs(unsigned char ms)
{
while(--ms)
   {
     DelayUs(250);
     DelayUs(250);
  DelayUs(250);
  DelayUs(250);
   }
}
/******************************************************************/
/*                   写入命令函数                                 */
/******************************************************************/
void WriteCommand(unsigned char c)
{
DelayMs(5);//操作前短暂延时,保证信号稳定
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/******************************************************************/
/*                   写入数据函数                                 */
/******************************************************************/
void WriteData(unsigned char c)
{
DelayMs(5);  //操作前短暂延时,保证信号稳定
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/******************************************************************/
/*                   写入字节函数                                 */
/******************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
    p=pos+0xb0; //是第二行则命令代码高4位为0xc
else
    p=pos+0x80; //是第二行则命令代码高4位为0x8
WriteCommand (p);//写命令
WriteData (c);   //写数据
}
/******************************************************************/
/*                   写入字符串函数                               */
/******************************************************************/
void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;i<16;i++)
  ShowChar (l++,*(ptr+i));//循环显示16个字符
}
/******************************************************************/
/*                   初始化函数                                   */
/******************************************************************/
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //显示光标移动位置
WriteCommand(0x0f); //显示开及光标设置
WriteCommand(0x01); //显示清屏
}


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, ')',
0x16, '!',
0x1E, [email=]'@'[/email],
0x26, '#',
0x25, '$',
0x2E, '%',
0x36, '^',
0x3D, '&',
0x3E, '*',
0x46, '(',
0x0E, '~',
0x4E, '_',
0x55, '+',
0x5D, '|',
0x29, ' ',
0x54, '{',
0x5B, '}',
0x4C, ':',
0x52, '"',
0x41, '<',
0x49, '>',
0x4A, '?',
0x71, '.',
0x70, '0',
0x69, '!',
0x72, '2',
0x7A, '3',
0x6B, '4',
0x73, '5',
0x74, '6',
0x6C, '7',
0x75, '8',
0x7D, '9',
};

相关帖子

沙发
wuwenfei1988| | 2010-9-13 17:11 | 只看该作者
厉害

使用特权

评论回复
板凳
江南七叶|  楼主 | 2010-9-13 17:18 | 只看该作者
相关

2010-9-13 17-17-15.jpg (23.73 KB )

PS2

PS2

2010-9-13 17-15-16.jpg (15.03 KB )

电路

电路

使用特权

评论回复
地板
江南七叶|  楼主 | 2010-9-13 17:21 | 只看该作者
呵呵……只是最近看到《无线电》上有人把PS2鼠标改成无线的所以想玩一下PS2 2# wuwenfei1988

使用特权

评论回复
5
fameic| | 2010-9-13 17:22 | 只看该作者
支持。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:悉“芯”学习,以“程”待人!

0

主题

35

帖子

1

粉丝