📄 mcu.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 + -