PS2 TO 0802

发布者:eaff86最新更新时间:2016-11-24 来源: eefocus关键字:PS2 手机看文章 扫描二维码
随时随地手机看文章

/******************************************************************
硬件调试通过

 

*******************************************************************/


#include"reg52.h"
#include "intrins.h"
#include "string.h"
#include "key.h" //按键通码与ascii对照表


#define uchar unsigned char
#define uint  unsigned int
#define BOOL bit


#define cmd_word 0xff   //复位命令
sbit Clk_Line = P3^3; //时钟线
sbit Data_Line=P3^4;  //键盘数据线
uchar key=0; //按键最终值
uint  Key_Value=0;
uchar Int_Time=0;
uchar save=0;
uchar display[40];
uchar scancode[40];
uint num = 0;
uchar blank;
uchar flag;
uchar comf = 0x01;
//**************************************************************************
void init(void);
void delay(uint us);    //us=12大约100us 
void command(uchar cmd);
void interrupt1_receive(void);
void getkey(void) ;////内部中断0 用来处理缓冲区里的数据
void keyprocess(void);
void lcdclr(void);
//**************************************************************************
//Port Definitions**********************************************************
sbit rs = P2^0;  //
sbit rw = P2^1;
sbit ep = P2^2;
#define LCDPORT P0
sbit LcdLight   = LCDPORT^4;
void Delay1ms(unsigned int count)
{
 unsigned int i,j;
 for(i=0;i for(j=0;j<120;j++);
}
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND   0x00      // Command
#define LCD_DATA   0x01         // Data
#define LCD_CLEAR_SCREEN 0x01   // 清屏
#define LCD_HOMING    0x02      // 光标返回原点
//设置显示模式************************************************************
#define LCD_SHOW   0x04    //显示开
#define LCD_HIDE   0x00    //显示关   
#define LCD_CURSOR   0x02  //显示光标
#define LCD_NO_CURSOR  0x00    //无光标       
#define LCD_FLASH   0x01    //光标闪动
#define LCD_NO_FLASH  0x00    //光标不闪动
//设置输入模式************************************************************
#define LCD_AC_UP   0x02
#define LCD_AC_DOWN   0x00      // default
#define LCD_MOVE   0x01      // 画面可平移
#define LCD_NO_MOVE   0x00      //default
//移动光标或屏幕************************************************************
#define LCD_CURSOR  0x02      
#define LCD_SCREEN  0x08
#define LCD_LEFT  0x00
#define LCD_RIGHT  0x04

//************************************************************************

delayms(uchar ms)
{       // 延时子程序
 uchar i;
 while(ms--)
 {
  for(i = 0; i< 250; i++)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
 }
}


void command(uchar cmd)
{  
   uchar parity;
   uchar i;
   comf = 0x01;
   parity=0;

   Clk_Line=1;
   Data_Line=1;
   delay(100);
   Clk_Line=0;
   delay(20);  
   Data_Line=0;
   Clk_Line = 1;
   for(i=0;i<8;i++)
   {  
      Clk_Line = 1;
      while(Clk_Line);
      Data_Line = 0; 
      if(cmd & (comf<<1)) 
      {
         Data_Line = 1;  
         parity++; 
      }
   }
   while(!Clk_Line) ; 
   while(Clk_Line)  ; 
   
   if((parity&0x01))
      Data_Line=0;
   else Data_Line=1;
   while(!Clk_Line) ;
   while(Clk_Line)  ;
   Data_Line=1;
   while(!Clk_Line);
   while(Data_Line) ; 
   while(Clk_Line) ;
   while(!Clk_Line) ;
   while(!Data_Line);

BOOL lcd_bz()
{       // 测试LCD忙碌状态
 BOOL result;
 rs = 0;
 rw = 1;
 ep = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 result = (BOOL)(LCDPORT & 0x80);
 ep = 0;
 return result; 
}

lcd_wcmd(uchar cmd)
{       // 写入指令数据到LCD
 while(lcd_bz());
 rs = 0;
 rw = 0;
 ep = 0;
 _nop_();
 _nop_(); 
 LCDPORT = cmd;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 0;  
}

lcd_pos(uchar pos)
{       //设定显示位置
 lcd_wcmd(pos | 0x80);
}

lcd_wdat(uchar dat) 
{       //写入字符显示数据到LCD
 while(lcd_bz());
 rs = 1;
 rw = 0;
 ep = 0;
 LCDPORT = dat;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 0; 
}

lcd_init()
{       //LCD初始化设定
 lcd_wcmd(0x38);   //
 delayms(1);
 lcd_wcmd(0x0c);   //
 delayms(1);
 lcd_wcmd(0x06);   //
 delayms(1);
 lcd_wcmd(0x01);   //清除LCD的显示内容
 delayms(1);
}

void init(void)
{
   EA = 1;
   IT1 = 1;     //外部中断1是下降沿触发方式
}

void getkey(void)
{
     uchar i=0;
     //static uint num = 0;
     save = Key_Value;
     for(i=0;i<49;i++)
     {
         if(noshift[i][0] == save) //普按键的通码在缓冲区的第一位
         {   
             key = noshift[i][1]; //搜索到字母后进行相应的处理             
             if(num == 32)
             {
                //num = 0;
                while(num)
                {
                   display[--num] = 0;
                }
                blank = 0;
                lcdclr();
             }
             display[num++] = key;
             flag = 0;
             break;   
         }
     } 
}


void delay(uint us)  //us=12大约100us 

   while(us--) ;
}
void interrupt1_receive(void) interrupt 2

  _nop_();
  if(Data_Line)
     Key_Value|=0x8000;
  Int_Time++;
  if(Int_Time==11)
  { 
    Key_Value>>=6;
    Int_Time=0;
    EX1=0;
  }
  Key_Value>>=1; 
}

 

 


void main(void)
{
uchar i=0;
uchar thir=2; 
    init();                //初始化
 lcd_init();    // 初始化LCD   
 delay(10);
    command(cmd_word);  
    delay(150);
    while(1)
    {
      EX1=1;
      while(EX1) ;
      getkey();
      lcd_pos(0XC0);
  lcd_wdat(key);
  _nop_();
    }
}


关键字:PS2 引用地址:PS2 TO 0802

上一篇:c51 串口连接接收与发送
下一篇:51P0,P1左右移

推荐阅读最新更新时间:2024-03-16 15:22

MSP430学习笔记9-PS2键盘解码
PS2键盘解码的基本原理是通过外部中断读取键盘输出的串行信号,在根据扫描码进行查表解码。键盘发送往主机的信号总是在时钟的下降沿因此此中断是在下降沿触发,且时钟信号是由键盘给出,因此使用P1口中断(已经在初始化端口时设置)。发送的数据位11位,第一位是起始位,总为0,紧接是8个数据位,然后是奇校验位,最后是停止位总为1. 本程序只能对基本按键(即键被按下时产生三个字节的扫描码的按键)做出解码,包括所有的可显示字符键和Table,Back Space和Ente三个特殊功能键。基本按键的扫描码由三个字节组成,第1个字节为接通码,第2、3字节为断开码;其中第1字节和第3字节相同,中间字节为断开标志0xf0。例如:通码和断码是以什么样的序列
[单片机]
基于STM32的PS2遥控小车
摘要:PS2手柄是索尼的PlayStation2游戏机的遥控手柄。索尼的psx系列游戏主机在全球很是畅销。不知什么时候便有人打起ps2手柄的主意,破解了通讯协议,使得手柄可以接在其他器件上遥控使用,比如遥控我们熟悉的智能小车。突出的特点是这款手柄性价比极高,按键丰富,方便扩展到其它应用中。 1.PS2手柄控制 PS2手柄由手柄与接收器两部分组成,手柄主要负责发送按键信息;接收器与单片机(也可叫作主机,可直接用在PS2游戏机上)相连,用于接收手柄发来的信息,并传递给单片机,单片机也可通过接收器,向手柄发送命令,配置手柄的发送模式。 2.PS2手柄时序 1、CS线在通讯期间拉低,通信过程中CS信号线在一串数据(9个字节,每
[单片机]
基于STM32的<font color='red'>PS2</font>遥控小车
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved