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

📄 mcu(单片机上的程序).c

📁 本压缩包是设计IC卡读写器的一个例程
💻 C
字号:
/***********************************************************************/
/*                                                                     */
/*  FILE        :temp1.c                                               */
/*  DATE        :Mon, Aug 29, 2005                                     */
/*  DESCRIPTION :Main Program                                          */
/*  CPU TYPE    :H8/3664F                                              */
/*                                                                     */
/*  This file is generated by Hitachi Project Generator (Ver.2.1).     */
/*                                                                     */
/***********************************************************************/
                  


#ifdef __cplusplus
extern "C" {
#endif
void abort(void);
#ifdef __cplusplus
}
#endif

#include <machine.h>
#include <header3664.h>

#define SDA IO.PDR1.BIT.B2
#define SCL IO.PDR1.BIT.B1

//全局变量

unsigned char ack = 0;
enum enmStatus {READ, WRITE, WRITING, IDLE};
enum enmStatus MCUStatus;
unsigned char STD[45]={"Hi PC, this is h8/3664,I'm glad to meet you."};
unsigned char msgTransfer[256];
unsigned char chrStatus;
unsigned int msgLength;

//子程序声明:IIC部分

void Nop();								//延时

void SetSCL(unsigned char i);			//设置SCL电平
void SetSDA(unsigned char i);			//设置SDA电平
unsigned char GetSCL();					//获取SCL电平
unsigned char GetSDA();					//获取SDA电平

void Delay(int i);						//延时
void Initialize();						//初始化
void StartI2C();						//开启I2C端口
void StopI2C();							//关闭I2C端口
void AckI2C();							//应答I2C芯片
void SendByte(unsigned char c);			//向I2C发送一字节
unsigned char RcvByte();				//从I2C接收一字节
unsigned char IRcvByte(unsigned char SLA, unsigned char *str);
										//从I2C指定位置接收一字节
unsigned char IRcvStr(unsigned char SLA, unsigned char WDA, unsigned char *str, unsigned char no);
										//从I2C指定位置接收指定字节数
unsigned char ISendByte(unsigned char SLA, unsigned char str);
										//向I2C指定位置发送一字节
unsigned char ISend8Byte(unsigned char SLA, unsigned char WDA, unsigned char *str, unsigned char no);
										//向I2C指定位置发送8字节(一页)
unsigned char ISendStr(unsigned char SLA, unsigned char WDA, unsigned char *str, unsigned char no);
void InitialStr(unsigned char *str);	//向I2C指定位置发送指定字节数

//子程序声明:SCI部分
void SendMsgSCI(unsigned char *ptr, int msgLength);
										//通过串口向PC发送指定字符串
void ReceiveMsgSCI();					//通过串口从PC接收指定字符串


//子程序声明:SCI控制IIC部分
void React2PC();						//回应PC的指令
void CtrlRead();						//PC控制MCU读取I2C
void CtrlWrite();						//PC控制MCU写入I2C

//字符串转换
char ConvertStr2HexChar(char *str);		//
char ConvertHexChar(char ch);			//

/***********************************************************************/
/*                                                                     */
/*                              主程序                                 */
/*                                                                     */
/***********************************************************************/

void main(void)
{
	SendMsgSCI(STD, 45);
	Initialize();
	for(;;);
}

void Initialize()
{
	set_imask_ccr(0);
	IIC.ICCR.BIT.ICE=0;
}

void abort(void)
{
	
}

/***********************************************************************/
/*                                                                     */
/*                           子程序:IIC部分                           */
/*                                                                     */
/***********************************************************************/

void Delay(int n)
{
	int i = 0;
	for (i = 0; i<n; i++)
	{
		Nop();
	}
}

void Nop()
{
	int i=0;
}

void SetSCL(unsigned char i)
{
	IO.PCR1=IO.PCR1|0x02;
	SCL=i;
}

unsigned char GetSCL()
{
	IO.PCR1=IO.PCR1&0xFD;
	return SCL;
}

void SetSDA(unsigned char i)
{
	IO.PCR1=IO.PCR1|0x04;
	SDA=i;
}

unsigned char GetSDA()
{
	IO.PCR1=IO.PCR1&0xFB;
	return SDA;
}

void StartI2C()
{
	SetSDA(1);
	Nop();
	SetSCL(1);
	Nop();
	Nop();
	SetSDA(0);
	Nop();
	Nop();
	SetSCL(0);
	Nop();
	Nop();
}

void StopI2C()
{
	SetSDA(0);
	Nop();
	SetSCL(1);
	Nop();
	Nop();
	SetSDA(1);
	Nop();
	Nop();
}

void AckI2C(unsigned char a)
{
	if (a == 0)
		SetSDA(0);
	else
		SetSDA(1);
	Nop();
	SetSCL(1);
	Nop();
	SetSCL(0);
	Nop();
}

void SendByte(unsigned char c)
{
	unsigned char bitCnt;
	for (bitCnt = 0; bitCnt<8; bitCnt ++)
	{
		if ((c<<bitCnt)&0x80) 
			SetSDA(1);
		else
			SetSDA(0);
		Nop();
		SetSCL(1);
		Nop();
		Nop();
		SetSCL(0);
	}
	Nop();
	Nop();
	SetSDA(1);
	Nop();
	Nop();
	SetSCL(1);
	Nop();
	Nop();
	Nop();

	if (GetSDA() == 1) 
		ack = 0;
	else ack = 1;

	SetSCL(0);
	Nop();
	Nop();
}

unsigned char RcvByte()
{
	unsigned char retc = 0, bitCnt = 0;
	SetSDA(1);
	for (bitCnt = 0; bitCnt<8; bitCnt++)
	{
		Nop();
		SetSCL(0);
		Nop();
		Nop();
		SetSCL(1);
		Nop();
		Nop();
		retc <<= 1;
		if (GetSDA())
			retc++;
		Nop();
		Nop();
	}
	SetSCL(0);
	Nop();
	Nop();

	return retc;
}

unsigned char IRcvByte(unsigned char SLA, unsigned char *str)
{
	StartI2C();
	SendByte(SLA+1);
	if (ack == 0)
		return 0;
	*str = RcvByte();
	AckI2C(1);
	StopI2C();
	return 1;
}

unsigned char IRcvStr(unsigned char SLA, unsigned char WDA, unsigned char *str, unsigned char no)
{
	unsigned char i = 0, num = no;
	num--;
	StartI2C();
	SendByte(SLA);
	if (ack == 0)
		return 0;
	SendByte(WDA);
	if (ack == 0)
		return 0;
	StartI2C();
	SendByte(SLA+1);
	if (ack == 0)
		return 0;
	for (i = 0; i<num ; i++)
	{
		*str = RcvByte();
		Nop();
		AckI2C(0);
		str++;
	}
	*str = RcvByte();
	AckI2C(1);
	StopI2C();
	Nop();
	Nop();

	return 1;

}

unsigned char ISendByte(unsigned char SLA, unsigned char str)
{
	StartI2C();
	SendByte(SLA);
	if (ack==0)
		return 0;
	SendByte(str);
	if (ack==0)
		return 0;
	StopI2C();
	return;
}

unsigned char ISend8Byte(unsigned char SLA, unsigned char WDA, unsigned char *str, unsigned char no)
{
	unsigned char i = 0, num = no;
	StartI2C();
	SendByte(SLA);
	if (ack==0)
		return 0;
	SendByte(WDA);
	if (ack==0)
		return 0;
	for (i = 0; i<num; i++)
	{
		SendByte(*str);
		if (ack==0)
			return 0;
		str++;
	}
	StopI2C();

	return 1;
}

unsigned char ISendStr(unsigned char SLA, unsigned char WDA, unsigned char *str, unsigned char no)
{
	unsigned char i, count = 0, round = no, sendWDA = WDA, sendNo = 8, temp = 0;
	round /= 8;
	round++;
	for (i = 0; i<round; i++)
	{
		if (i==(round-1))
			sendNo = no%8;
		temp = ISend8Byte(SLA, sendWDA, str, sendNo);
		if (!temp)
			return 0;
		sendWDA += 8;
		str += 8;
		Delay(800);

	}
	Delay(10);


	return 1;
}

void InitialStr(unsigned char *str)
{
	int i = 0;
	for (i = 0; i<128; i++)
	{
		*str = 0xab;
		str++;
	}
}

/***********************************************************************/
/*                                                                     */
/*                           子程序:SCI部分                           */
/*                                                                     */
/***********************************************************************/

void ReceiveMsgSCI()
{
	int i = 0;
	unsigned char *ptr = msgTransfer;	

	msgLength = 0;

	set_imask_ccr(1);        /*禁止外部中断*/
	SCI3.SMR.BYTE=0x00;	     /*初始化串口*/
	SCI3.BRR=51;		
	IO.PMR1.BIT.TXD=1;		
	SCI3.SCR3.BYTE=0X30;
	msgLength = SCI3.RDR-48;
	if (msgLength==0) 
		msgLength = 256;
	for(i = 0 ; i < msgLength ; i++)
	{ 
		while(SCI3.SSR.BIT.RDRF != 1);        /*查询状态*/
		*ptr = SCI3.RDR;  
		ptr++; 		
	}
	SCI3.SCR3.BIT.RIE=1;
	
	React2PC();
}

void SendMsgSCI(unsigned char *ptr, int msgLength)
{
	int i = 0;

	set_imask_ccr(1);        /*禁止外部中断*/
	SCI3.SMR.BYTE=0x00;	     /*初始化串口*/
	SCI3.BRR=51;		
	IO.PMR1.BIT.TXD=1;		
	SCI3.SCR3.BYTE=0X30; 	
	for(i = 0 ; i < msgLength ; i++){ 
		SCI3.TDR=*ptr;  
		ptr++; 		
		while(SCI3.SSR.BIT.TDRE != 1);        /*查询状态*/	
	}
	SCI3.SCR3.BIT.RIE=1;
}


/***********************************************************************/
/*                                                                     */
/*                         子程序:SCI控制IIC部分                      */
/*                                                                     */
/***********************************************************************/

void React2PC()
{
	int i, intBg, intEnd;
	unsigned char chrIntRead[3] = "$R$";
	unsigned char chrIntWrite[3] = "$W$";
	unsigned char chrIntEnd[3] = "$E$";

	MCUStatus = IDLE;

	if (msgLength==256)
		MCUStatus = WRITING;
	if (msgLength==3)
	{
		MCUStatus = READ;
		for (i = 0; i<3; i++)
		{
			if (chrIntRead[i] != msgTransfer[i])
				{
					MCUStatus = WRITE;
					break;
				}
		}
	}

	if (MCUStatus==READ)
			CtrlRead();
	if (MCUStatus==WRITING)
			CtrlWrite();
}

void CtrlRead()
{
	IRcvStr(0xa0, 0x00, msgTransfer, 128);
	SendMsgSCI("$R$", 3);
	SendMsgSCI(msgTransfer, 128);
	SendMsgSCI("$E$", 3);
}

void CtrlWrite()
{
	int i;
	for (i = 0; i<128; i++)
	{
		msgTransfer[i] = ConvertStr2HexChar(msgTransfer+i*2);
	}
	ISendStr(0xa0, 0x00, msgTransfer, 128);
	SendMsgSCI("$Z$", 3);	
}

char ConvertHexChar(char ch) 
{
	if((ch>='0')&&(ch<='9'))
	return ch-0x30;
	else if((ch>='A')&&(ch<='F'))
		return ch-'A'+10;
	else if((ch>='a')&&(ch<='f'))
		return ch-'a'+10;
	else return (-1);
}

char ConvertStr2HexChar(char *str)
{
	int hexdata,lowhexdata;
	char lstr=str[1],hstr=str[0];
	hexdata=ConvertHexChar(hstr);
	lowhexdata=ConvertHexChar(lstr);
	hexdata=hexdata*16+lowhexdata;

	return hexdata;
}

⌨️ 快捷键说明

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