AVR单片机读PS2鼠标

发布者:岭南布衣最新更新时间:2015-12-30 来源: eefocus关键字:AVR  单片机  PS2鼠标 手机看文章 扫描二维码
随时随地手机看文章
如果该程序已验证过的,用的是AVR系列单片机的IO口模拟PS2协议。

#include

#include
#include "myh.h"
//MOUSE
//时钟接CLK:5--INT0--PD2
#define PINMCLK     (PIND&BIT2)
#define PRTMCLK_H   {DDRD&=NBIT2;PORTD|=BIT2;}
#define PRTMCLK_L   {DDRD|=BIT2;PORTD&=NBIT2;}
//数据接DAT:1--PC4
#define PINMDAT     (PINC&BIT4)
#define PRTMDAT_H   {DDRC&=NBIT4;PORTC|=BIT4;}
#define PRTMDAT_L   {DDRC|=BIT4;PORTC&=NBIT4;}

//KEYBOARD

#define PINKCLK     (PIND&BIT3)
#define PRTKCLK_H   {DDRD&=NBIT3;PORTD|=BIT3;}
#define PRTKCLK_L   {DDRD|=BIT3;PORTD&=NBIT3;}
//数据接DAT:1--PC4
#define PINKDAT     (PINC&BIT5)
#define PRTKDAT_H   {DDRC&=NBIT5;PORTC|=BIT5;}
#define PRTKDAT_L   {DDRC|=BIT5;PORTC&=NBIT5;}

//sbit pclk=P3^2;
//sbit pdat=P3^1;

uchar wait;
uchar mcnt=0;
uchar kcnt=0;
schar axes_x=0,axes_y=0;
schar mbuf[4];
uchar kbuf[4];

void delay(uint t)   //延时 t*10us
{
  char i;
  for(;t>0;t--)
  for(i=10;i>0;i--);
}

uchar send2m(uchar dat)//高电平期间改变数据,下降沿发出去
{
 uchar i,ack,intc,check=1;
 uint buf;

 //EX0=0;
 //IE0=0;
 intc=GICR;
 GICR&=0x3f;   //不使能中断
 buf=dat;
 for(i=0;i<8;i++)
  {
 check^=dat&0x01;    //校验,出现奇数个一该位为0。
 dat>>=1;
 }

 buf|=check<<8;       //校验位
 buf|=3<<9;        //停止位,以及应答位

// pclk=0;
// pdat=0;
 PRTMCLK_L;
 PRTMDAT_L;         //下接时钟和数据
 delay(10);
// pclk=1;      //请求
 PRTMCLK_H;      //释放时钟线
 for(i=0;i<11;i++)    //发送8位数据
   {
 while(PINMCLK);    //等待下降沿
 if(buf&0x01)
  PRTMDAT_H
 else
  PRTMDAT_L
 //pdat=buf&0x01;
 buf>>=1;
 //if(i==10)ack=pdat;  //最后一位为输入的应答 
 if(i==10)ack=PINMDAT;
 //while(!pclk);
 while(!PINMCLK);    //等待上升沿
   }
 PRTMDAT_H;
 //EX0=1;
 GICR=intc;
 return ack;
}

void chuli(void)
{
 mcnt=0;
 axes_x+=(schar)mbuf[1];
 axes_y+=(schar)mbuf[2];
}

void display(uint number)//从0到F显示
{
 char i,n[4]={0},       //要显示的四个数字
 num[16]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X27,0X7F,0X6F,
 0X77,0X7C,0X39,0X5E,0X79,0X71};//十六个数字的段码
 n[0]=number>>12&0X0F;
 n[1]=number>>8 &0X0F;
 n[2]=number>>4 &0X0F;
 n[3]=number    &0X0F;
  for(i=0;i<4;i++)
   
   PORTD=~(0X80>>i);
   PORTB=num[n[i]];delay(500);
   PORTB=0x00;     //显示清空
   }
}

void port_init(void)
{
 DDRB  = 0xFF;//B用于显示
 PORTB = 0xFF;
 DDRC  = 0x0F;//PC4,PC5为输入
 PORTC = 0x7F; //m103 output only
 DDRD  = 0xF0; //INT0 INT1 为输入
 PORTD = 0xFF;

}

#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
 //external interupt on INT0
 char i;
 uint buf;
// EX0=0;
 PRTKCLK_L;     //抑制键盘时钟
 //PRTKDAT_L;
 //-while(1);
 buf=0;  
 if(PINMDAT)
  {
   PORTC|=BIT0;
   delay(10);
   PORTC&=NBIT0;
   return;   //启始位为0
  }
 while(!PINMCLK);    //等待启始位结束
 for(i=0;i<10;i++)  //8位数据+校验+停止,LSB在前
   
  while(PINMCLK);//下降沿接收数据
  if(PINMDAT)buf|=(1<   while(!PINMCLK);
 }
 mbuf[mcnt]=buf&0xff;
 wait=50;
 mcnt++;
 if(mcnt==3)
  chuli();
 PRTKCLK_H;     //允许键盘时钟
 GIFR=0XC0;     //向高两位写1,清中断标志
 //IE0=0;
}

#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
 char i;
 uint buf;
 PRTMCLK_L;     //抑制鼠标时钟
 buf=0;  
 if(PINKDAT)
  {
   PORTC|=BIT0;
   delay(10);
   PORTC&=NBIT0;
   return;   //启始位为0
  }
 while(!PINKCLK);    //等待启始位结束
 for(i=0;i<10;i++)  //8位数据+校验+停止,LSB在前
   
  while(PINKCLK);//下降沿接收数据
  if(PINKDAT)buf|=(1<   while(!PINKCLK);
 }
 kbuf[kcnt]=buf&0xff;
 kcnt=0;
 PRTMCLK_H;     //允许鼠标时钟
 GIFR=0XC0;     //向高两位写1,清中断标志
}

//call this routine to initialise all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();

 MCUCR = 0x0A; //1010,int0,int1 下降沿
 GICR  = 0xC0;  //int1,int0 enable
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialised
}


void main()
{
 uint dat;
 init_devices();
 
 send2m(0xff);
 delay(10);
 send2m(0xeb);
 
 while(1)
  {
  //dat=axes_x<<8|axes_y;
  dat=axes_x<<8|kbuf[0];
  display(dat);
  //display(kbuf[0]);
  if(wait)
  {
   wait--;
   if(wait==0)
   mcnt=0;
  }
 }
}

关键字:AVR  单片机  PS2鼠标 引用地址:AVR单片机读PS2鼠标

上一篇:AVR串口通讯的详解
下一篇:关于AVR单片机的ADC使用

推荐阅读最新更新时间:2024-03-16 14:42

单片机USB描述符
设备列举所要执行的工作之一,即是取得这些有关于设各的相关信息,即为USB描述符。那么什么是USB描述符呢?用户可以稍微想像一下,它就好像是USB外围设各的“履历表”或“身份证”一般,钜细靡遗地纪录着与外围设各相关的一切信息。因此,USB描述符掌 握了有关于设各的各种信息与相关的设置。   为了描述不同的数据,就须以不同类型的USB描述符来加以描述,如图1所示。虽然各个描述符都有不同的信息与数据,但所有的描述符都有一些共同的特性,也即是由如表1所列的格式所组成。其中,所有的Byte o是以字节为单位的描述符长度,而所有的Byte 1 则放置如表2和表3所列的描述符类型值,紧接着的其他字节,则随着不同的描述符而不同。如果该描述符的
[单片机]
<font color='red'>单片机</font>USB描述符
AVR开发笔记——熔丝位
1、首先是stm32f10x.h中的HSE_VALUE #if !defined HSE_VALUE #ifdef STM32F10X_CL #define HSE_VALUE ((uint32_t)12000000)//这里修改为12MHz // #define HSE_VALUE ((uint32_t)25000000) /*! Value of the External oscillator in Hz */注释掉 #else #define HSE_VALUE ((uint32_t)8000000) /*! Value of the External oscillator in Hz */
[单片机]
二、单片机读取ID卡(产生载波)
我们在本文中使用新唐的N76E003单片机作为主控,通过f=1/T可以算出,T约为8us。我们采取PWM输出125KHz载波。 (为何不使用定时器?因为我太懒了~~~) void main(void) { Set_All_GPIO_Quasi_Mode;//所有IO设置为双向模式 PWM5_P03_OUTPUT_ENABLE;//使能PWM5,通过P03引脚输出 clr_PWMTYP;//边沿对齐模式 clr_PWMMOD0;//设置为独立输出模式 clr_PWMMOD1; PWM_CLOCK_DIV_8;//8分频模式 PWMPH = 0x00; PWMPL =
[单片机]
二、<font color='red'>单片机</font>读取ID卡(产生载波)
51单片机------数码管【有74HC753】
一 实验目的: 实验3:使用PO和P2端口实现数码管从0-7的显示效果: (1) 掌握C语言编程单片机控制程序的方法。 (2) 掌握使用Keil4软件编写、编译、调试程序的方法。 (3) 掌握使用Proteus软件绘制电路原理图、硬件仿真和程序调试。 (4) 理解和掌握共阴极数码管的显示原理和编码(记忆)。 (5) 熟悉使用51单片机P0(开漏)和P1(推挽)端口实现对外部用电器和电路的控制。 二、实验硬件和软件: 计算机1台、并安装Proteus8.6软件和Keil4软件。 三、试验任务: 使用Proteus排线连接的方式,在单片机I/O口(P2和P0)上外接上拉电阻和数码管,最终实现数码管从0-7显示效果,为最终的实训
[单片机]
51<font color='red'>单片机</font>------数码管【有74HC753】
基于单片机mp3音乐播放器设计
一.硬件方案 本设计以单片机为核心控制器,设计一个音乐播放器,主要完成TF卡存储的音频文件数据提取及播放任务。该播放器类似于个人计算机的音乐播放软件,可识别、提取TF卡所存储的WMA、MP3格式的文件并可自行完成音频解码数据处理,最后送扬声器或耳机进行播放。通过自定义键盘设定,当有键按下时,能控制歌曲的播放或音量,并通过LCD来显示播放音乐的时间等。 主要由51单片机+MP3播放模块(自带3W功放)+3W音乐喇叭+U盘插口+SD卡+耳机接口+按键+液晶显示屏;如图: 二.设计功能 (1)读取U盘或SD卡里面的音乐,在屏幕上面显示播放状态,当前的音量。 (2)按键可进行上一曲、下一曲切换,音量大小可调。 (3)支持TF内存卡
[单片机]
基于<font color='red'>单片机</font>mp3音乐播放器设计
单片机多微机系统共享RAM电路
  目前,多微机系统在许多方面得到了应用,诸如工业机器人控制、数控机床控制等。于是,多机之间的通信便成为多机系统的技术关键。特别是对数据传送有特殊要求的场合,更要解决好多机间的通信问题。如在工业机器人的控制中,对数据的传送就有如下要求:①主、从机要共享许多数据;②主、从机需要快速交换信息。在这种特殊要求下,传统的串行、并行通信就难以满足要求,而采用多机共享RAM电路,既能满足要求,又具有简单、可靠、通用性好等优点。 一、电路原理   图1- 87所示为实际电路图。图中共用的RAM为6264.它有8根数据总线(Do~D7),13根地址总线( Ao~A12),4根控制总线(WR、OE、CS、CS),2根电源线。当两微机系统共用RA
[单片机]
<font color='red'>单片机</font>多微机系统共享RAM电路
相同的功率下MSP430™ MCU 性能提升达 100 倍
最新数学函数库在保持超低功耗的同时,为开发人员实现显著性能提升。 2014 年 4 月 4日,北京讯---日前,德州仪器 (TI) 宣布针对其超低功耗 MSP430™ 微控制器 (MCU) 推出免费易用型数学函数库的扩展产业环境,充分利用智能外设与优化软件减轻复杂数学指令的工作量。MSPMATHLIB 与 IQmathLib 软件库理想适用于定位跟踪等性能与功耗都非常重要的应用。现在我们可使用反正切函数通过 MSP430 MCU、加速器以及 IQmathLib 在极短的时间内测量间距与侧倾角。这些优化数学函数软件库的其它理想应用还包括无线传感器节点、智能仪表、心率监视器以及支持电容式触摸或图形功能的任何产品。 MS
[单片机]
基于51单片机的锅炉水位温度压力检测系统仿真设计
仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0056 1.主要功能: 基于51单片机AT89C51/52(与AT89S51/52、AT89C51/52、STC89C51/52等51内核单片机通用) 1.系统实时通过LCD1602显示水位检测值,锅炉炉膛温度值,锅炉内部压力值。 2、可对锅炉的水位上下限、炉膛温度上下限、压力上下限进行设置,第一行显示上限值,第二行显示下限值。 3、如果水位、温度、压力过限则蜂鸣器报警,通过LED指示报警类型。 4、默认水位下限值10cm,上限值40cm,压力下限值30kPa,压力上限值50kPa,温度下限值5℃,温度上限值105℃。 5、温
[单片机]
基于51<font color='red'>单片机</font>的锅炉水位温度压力检测系统仿真设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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