PS/2处理C51头文件

发布者:meilidaowl最新更新时间:2016-09-06 来源: eefocus关键字:PS2处理  C51  头文件 手机看文章 扫描二维码
随时随地手机看文章
/**********************中文版本*******************************/

/*****功能描述 :  PS/2键盘应用头文件(中断处理)           *****/
/*****调试平台 :  51单片机  11.0592M晶振                 *****/
/*****作  者   :  郑文(ClimberWin)                       *****/
/*****编写日期 :  2009年10月5日                          *****/
/*****版本信息 :  V1.0                                   *****/
/*****修改日期 :                                         *****/
/*************************************************************/
#ifndef __C51_PS_2_H__
#define __C51_PS_2_H__

#include
#define uchar unsigned char
#define uint  unsigned int
///////////////数据定义////////////////////////////////////
sbit PS2_key_Data= P2^0; //定义PS2 Data引脚
sbit PS2_key_CLK  =P3^3; //定义PS2 Clk 引脚
bit PS2_flag=0;           //是否有PS/2按键数据接收标志位
bit PS2_key_UP=0, Shift=0;//PS2_key_UP是否松开标识位,是否Shift键按下标识位
uchar clk_num = 0;        //中断次数计数,用于判断接收数据的位数
uchar PS2_data;       //键值存储地址
uchar LCD1602_cursor = 0; //显示光标位置
///////////////使用函数定义///////////////////////////////////
void PS2_decode(unsigned char PS2_Code);
///////////////数据接收子程序(中断处理)////////////////////////
//键盘协议一帧包含11位的串行协议
//bit1  :START=0
//bit2-9:数据位DATA0-DATA7
//bit10 :奇偶校验位
//bit11 :STOP=1
void PS2_data_receive(void) interrupt 2
{
    clk_num++; //中断次数加1
    if ((clk_num>1) && (clk_num<10))
  {    
      if(PS2_key_Data==0) //位0接收保存 
   {PS2_data=PS2_data>>1 | 0x00;}
   else                //位1接收保存 
   {PS2_data=PS2_data>>1 | 0x80;}
     
  } 
 while (!PS2_key_CLK); //等待PS/2CLK拉高
 if (clk_num > 10) //当中断11次后表示一帧数据收完
  {
   clk_num = 0;  //清计数值
   PS2_flag = 1; //打开键值标志位
   EA = 0; //关中断
  }
}
//////////////////////键值处理子程序///////////////////////////////
void PS2_decode(unsigned char PS2_Code) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
{
 uchar tab_num; 

 if (PS2_key_UP==0)     //初始状态下
  {
   switch (PS2_Code)
    {
     case 0xF0 : // 当收到0xF0,PS2_key_UP置1表示断码开始
      PS2_key_UP = 1;
     break;

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

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

     default:      
      
      if(!Shift) //如果SHIFT没按下
       {
        for (tab_num = 0;(UnShifted[tab_num][0]!=PS2_Code)&&(tab_num<59); tab_num++); //查表显示
        if (UnShifted[tab_num][0] == PS2_Code) //按键处理程序
       } 
      else  //按下SHIFT
       {
        for(tab_num = 0; (Shifted[tab_num][0]!=PS2_Code)&&(tab_num<59); tab_num++); //查表显示
        if (Shifted[tab_num][0] == PS2_Code) //按键处理程序

       }

     break;
    }
  }
 else   //当PS2_key_UP==1,也就是按键弹起来后。
  { 
   PS2_key_UP = 0;  //清标志位
   if(PS2_Code==0x12 || PS2_Code==0x59) Shift = 0;//当有SHIFT键按下过时,需要清零
  }
 PS2_flag = 0; //标识字符处理完了
}

#endif

关键字:PS2处理  C51  头文件 引用地址:PS/2处理C51头文件

上一篇:TFT液晶屏C51控制
下一篇:2.4G无线发射模块nRF2402应用

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

C51 单片机的中断号以及中断向量
1、外部中断 0、 1;分别由引脚/INT0、/INT1的电平信号引起。 2、定时/计数器 0、1;分别由T0、 T1的溢出引起。 3、串行口发送、接收;发送完一个字节或接收到一个字节引起。 上述共5个中断源。 一、中断号 外部中断0 0 定时器T0 1 外部中断1 2 定时器T1 3 串口中断 4 二、 interrupt 和 using 在C51中断中的使用 8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/
[单片机]
C51中如何将数字转换成字符串的问题
将整数转换成字符串,在C51中你如何做? 这个问题似乎很简单,keilC中也用sprintf()函数嘛,用就行了。但对于 寸土寸金 的单片机来说,问 题可没那么简单。 看看我代码中这句弃之不用的代码吧: //sprintf(sFileLen, %d ,fileLen*128);print(sFileLen); //使用这个库函数,体积一下增加2563. 我 的程序空间马上溢出不够用了。 OMG! C51库函数,伤不起啊 能自己写就自己写,尽量不用库函数吧。谱太大,用不起啊。下面这个函数就是类似sprintf()的作用。 为了节省几个字节,结果就直接发出来了,不必存储到uchar 中了。 // 向串口发送一个整数,支持
[单片机]
KeilC51怎样将子程序段定位在固定的地址位
1、函数定位: 假如要把C源文件 tools.c 中的函数 int BIN2HEX(int xx) { ... } 放在CODE MEMORY的0x1000处,先编译该工程,然后打开该工程的M51文件,在 * * * C O D E M E M O R Y * * * 行下找出要定位的函数的名称,应该形如: CODE xxxxH xxxxH UNIT ?PR?_BCD2HEX?TOOLS 然后在: Project- Options for Target ...- BL51 Locate:Code 中填写如下内容: ?PR?_BCD2HEX?TOOLS(0x1000) 再次Build,在M51中会发现该函数已
[单片机]
C51写的单片机音乐彩灯程序
#include AT89X51.H #define TLEDS 20//每个花样状态持续时间,以50mS为单位 #define NUM_OF_LED_S 4//每种模式LED花样数? typedef unsigned char uchar; typedef unsigned int uint; data uchar led_array_num;//当前模式下,LED花样状态序号 data uchar music_array_num;//音符的序号 data uchar i;//模式号 data uchar t_count_led;//用于LED状态持续时间计时 data uint t_count_music;// data
[单片机]
基于C51单片机的报警产生器电路原理图
用 P1.0 输出 1KHz 和 500Hz 的音频信号驱动扬声器,作报警信号,要求 1KH z信号响 100ms , 500Hz 信号响 200ms, 交替进行, P1.7 接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。   ( 1 . 把 “ 单片机系统 ” 区域中的 P1.0 端口用导线连接到 “ 音频放大模块 ”区域中的 SPK IN 端口上;   ( 2 . 在 “ 音频放大模块 ” 区域中的 SPK OUT 端口上接上一个 8欧的或者是16 欧的喇叭;   ( 3 . 把 “ 单片机系统 ” 区域中的 P1.7/RD 端口用导线连接到 “四路拨动开关 ” 区域中的 K1 端口上.
[模拟电子]
基于<font color='red'>C51</font>单片机的报警产生器电路原理图
基于C51单片机的多路开关状态显示电路原理图
如下图所示, AT89S51 单片机的 P1.0 - P1.3 接四个发光二极管 L1 - L4 ,P1.4 - P1.7 接了四个开关 K1 - K4 ,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。 1 . 把 “ 单片机系统 ” 区域中的 P1.0 - P1.3 用导线连接到 “ 八路发光二极管指示模块 ” 区域中的 L1 - L4 端口上; 2 . 把 “ 单片机系统 ” 区域中的 P1.4 - P1.7 用导线连接到 “ 四路拨动开关 ” 区域中的 K1 - K4 端口上。
[模拟电子]
基于<font color='red'>C51</font>单片机的多路开关状态显示电路原理图
51单片机+PWM控制渐变七彩灯C51程序
一、硬件介绍: (采用5050LED 2W) RGB三色LED控制引脚分别为单片机P1.2、P1.1、 P1.0。LED正极接主电源(24V)正极,负极接驱动3颗三极管的集电极,单片机控制脚分别接3颗NPN三极管,三极管发射极接地,而单片机的供电是来自三端稳压器7805,祥细原理如下: 二、实物图片: 三、软件部分: 1、原理: 先亮红灯(保持一会儿)----红绿过度(绿加1、红减1循环240次)------ 绿灯亮起(保持一会儿)----绿兰过度(兰加1、绿减1循环240次) -----兰灯亮起(保持)-----兰白过度(绿加1、红加1循环240次、兰不变) ---白红过度 2、具体程序如下:
[单片机]
51单片机+PWM控制渐变七彩灯<font color='red'>C51</font>程序
利用全局及外部变量实现C51无能数化调用A51函数
摘要: 利用C51全局及外部变量,可实现无参数化调用A51函数,不但避免开了传统C51调用C51时繁琐的接口约定,而且把在A51中所用到的变量全部放至C51程序中而不必考虑变量在内存中的位置,使编程更加简洁。用实例验证了该方法的优越性和有效性。 关键词: C51 A51 汇编语言 无参数化调用 电子技术应用 2001年第7期发表苟帅的文章“ASM51无参数化调用C51函数的实现”,阐述了ASM51无参数化调用C51函数的实现原理并给出实例来验证该方法的优越性和可行性。作者在文章中
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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