⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcu.cpp

📁 AVR的PS2键盘控制程序,通过AVR单片机读取PS2键盘的数据
💻 CPP
字号:
/*==========================================
mcu.cpp
==========================================*/
#include"ioavr.h"
#include"mcu.h"

/*=================================================
=================================================*/
unsigned char __flash __ValueToChar[]={'0','1','2','3','4','5','6','7',
                                     '8','9','a','b','c','d','e','f',};
/*================================
================================*/
unsigned char ValueToChar(unsigned char x)
{
  return __ValueToChar[x&0xf];
}
/*================================
================================*/
unsigned char CharToValue(unsigned char x)
{
  unsigned char j;
  for(j=0;j<16;j++)
  {
    if(x==__ValueToChar[j])
      return j;
  }
  return 0x10;
}
/*================================
================================*/
unsigned char relative(unsigned char a,unsigned char b)
{
  if(a>=b)
    return a-b;
  else
    return b-a;
}
/*==========================================
==========================================*/
unsigned int GetAdc(unsigned char channel)
{
  unsigned int tmp;
  ADMUX = 0x40|channel;
  ACSR  = 0x80;
  ADCSRA = 0xc2;
  tmp   = ADC;
  return tmp;
}
/*================================
================================*/
void UartTxdStr(char const *p)
{
  while(*p!='\0')
  {
    UartTxd(*p++);
  }
}
/*================================
================================*/
void UartTxdStr(char __flash *p)
{
  while(*p!='\0')
  {
    UartTxd(*p++);
  }
}
/*================================
================================*/
void UartTxdStr(unsigned char *p,unsigned char length)
{
  while(length--)
  {
    UartTxd(*p++);
  }
}
/*==========================================
==========================================*/
void DelayMs(unsigned int time)
{
  unsigned int i;
  while(time--)
  {
    for(i=0; i<1600; i++);
    WDR();
  }
}
/*====================================
====================================*/
unsigned char SpiWrite(unsigned char data)
{
  unsigned char tmp;
  SPDR=data;
  while(!(SPSR & 0x80));
  tmp = SPDR;
  return tmp;
}
/*==================================
===================================*/
void EEPROMwrite(unsigned int sub,unsigned char data)
{
  CLI();
  while(EECR&0x02)WDR();
  EEAR = sub;
  EEDR = data;
  EECR = 0x04;
  EECR = 0x06;
  SEI();
}
/*==================================
===================================*/
unsigned char EEPROMread(unsigned int sub)
{
  unsigned char data;
  CLI();
  while(EECR&0x02)WDR();
  EEAR = sub;
  EECR = 0x01;
  data = EEDR;
  SEI();
  return data;
}

#ifdef SDA
/*=======================
I2C driver
=======================*/

#define SDA_0() DDR |= SDA
#define SDA_1() DDR &=~SDA
#define SCL_0() DDR |= SCL
#define SCL_1() DDR &=~SCL
#define GetSDA() (PIN&SDA)
#define GetSCL() (PIN&SCL)

#define iic_off() {SDA_1();SCL_1();}
#define iic_on()  PORT&=~(SDA|SCL)
#define iic_delay(x)  {unsigned char j;for(j=x;j;j--);}

#define IICDT 50  //延时

/*================
================*/
unsigned char iic_start(void)
{
  iic_on();
  SDA_1();SDA_1();
  SCL_1();SCL_1();
  if(GetSDA()==0 || GetSCL()==0)
  {
    SCL_0();
    iic_delay(IICDT);
    SCL_1();
    iic_delay(IICDT);
    return 0;
  }
  else
  {
    SDA_0();
	iic_delay(IICDT);
    return 1;
  }
}
/*================
================*/
void iic_stop(void)
{
  SDA_0();
  iic_delay(IICDT);
  SCL_1();
  iic_delay(IICDT);
  SDA_1();
}

/*================
================*/
void iic_ack(void)
{
  SDA_0();
  iic_delay(IICDT);
  SCL_1();
  iic_delay(IICDT<<1);
  SCL_0();
  iic_delay(IICDT);
  SDA_1();
}
/*================
================*/
unsigned char iic_send(unsigned char x)
{
  unsigned char i;
  SCL_0();
  iic_delay(IICDT);
  for(i=0;i<8;i++)
  {
	if( x & 0x80 )
	  SDA_1();
    else
	  SDA_0();
	x=x<<1;
	iic_delay(IICDT);
    SCL_1();
    iic_delay(IICDT<<1);
    SCL_0();
    iic_delay(IICDT);
  }
  SDA_1();
  iic_delay(IICDT);
  SCL_1();
  i=0;
  while(GetSDA()!=0)
  {
    i++;
	if(i>(IICDT<<1))
	  return 0;
  }
  SCL_0();
  iic_delay(IICDT);
  return 1;
}

//**************接收一个字节********
unsigned char iic_receive(void)
{
  unsigned char i,data=0;
  SDA_1();
  for(i=0;i<8;i++)
  {
    data<<=1;
    iic_delay(IICDT);
    SCL_1();
    iic_delay(IICDT);
	if(GetSDA())
	  data++;
    iic_delay(IICDT);
    SCL_0();
    iic_delay(IICDT);
  }
  return data;
}
/*=============================
=============================*/
unsigned char I2Cwrite(unsigned char chSlave,unsigned char chSub,unsigned char chData)
{
  while(!iic_start());
  if(!iic_send(chSlave))
    return 0;
  if(!iic_send(chSub))
    return 0;
  if(!iic_send(chData))
    return 0;
  iic_stop();
  return 1;
}

/*=============================
=============================*/
unsigned char I2Cread(unsigned char chSlave,unsigned char chSub,unsigned char* chData)
{
  while(!iic_start());
  if(!iic_send(chSlave))
    return 0;
  if(!iic_send(chSub))
    return 0;
  iic_start();
  if(!iic_send(chSlave|0x01))
    return 0;
  *chData=iic_receive();
  iic_stop();
  return 1;
}
#endif //SDA
/*==========================================
END
==========================================*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -