📄 mcu(单片机上的程序).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 + -