请教:为何keil 8编译后运行正常,模式0编译后结果错误?
[复制链接]
#include
#include //包含_nop_()函数定义的头文件
/*****************************************************
基础函数功能:延时5ns
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
#define DELAYNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();};
/*****************************************************
基础函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
{
for(j=0;j<33;j++)
{
}
}
}
/*****************************************************
基础函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delaynms(unsigned char m_ms)
{
unsigned char i;
for(i=0;i
{
delay1ms();
}
}
/*****************************************************
基础函数功能:延时若干秒
入口参数:n
***************************************************/
void delays(unsigned char m_s)
{
unsigned char i;
for(i=0;i
{
delaynms(1000);
}
}
//*****************************************************
//x5045子程序
//*****************************************************
sbit SCK=P2^2; //将SCK位定义为P2.引脚
sbit SI=P2^3; //将SI位定义为P2.3引脚
sbit SO=P2^5; //将SO位定义为P2.5引脚
sbit CS=P2^4; //将CS位定义为P2.4引脚
#define WREN 0x06 //写使能锁存器允许
#define WRDI 0x04 //写使能锁存器禁止
#define WRSR 0x01 //写状态寄存器
#define READ 0x03 //读出
#define WRITE 0x02 //写入
/*****************************************************
函数功能:从X5045的当前地址读出数据
出口参数:x
***************************************************/
unsigned char ReadCurrent(void)
{
unsigned char i;
unsigned char x=0x00; // 储存从X5045中读出的数据
SCK=1; // 将SCK置于已知的高电平状态
DELAYNOP(); // 延时5us
for(i = 0; i < 8; i++)
{
SCK=1; // 拉高SCK
DELAYNOP(); // 延时5us
SCK=0; // 在SCK的下降沿输出数据
DELAYNOP(); // 延时5us
x<<=1; // 将x中的各二进位向左移一位,因为首先读出的是字节的最高位数据
x|=(unsigned char)SO; // 将SO上的数据通过按位“或“运算存入 x
DELAYNOP(); // 延时5us
}
return(x); // 将读取的数据返回
}
/*****************************************************
函数功能:写数据到X5045的当前地址
入口参数:dat
***************************************************/
void WriteCurrent(unsigned char m_writedata)
{
unsigned char i;
SCK=0; // 将SCK置于已知的低电平状态
DELAYNOP(); // 延时5us
for(i = 0; i < 8; i++) // 循环移入8个位
{
SI=(bit)(m_writedata&0x80); // 通过按位“与”运算将最高位数据送到S
// 因为传送时高位在前,低位在后
DELAYNOP(); // 延时5us
SCK=0;
DELAYNOP(); // 延时5us
SCK=1; // 在SCK上升沿写入数据
DELAYNOP(); // 延时5us
m_writedata<<=1; // 将y中的各二进位向左移一位,因为首先写入的是字节的最高位
}
}
/*****************************************************
函数功能:写状态寄存器 ,可以设置看门狗的溢出时间及数据保护
入口参数:rs; //储存寄存器状态值
***************************************************/
void WriteSR(unsigned char m_WriteRs)
{
DELAYNOP(); // 延时5us
CS=0; // 拉低CS,选中X5045
WriteCurrent(WREN); // 写使能锁存器允许
CS=1; // 拉高CS
CS=0; // 重新拉低CS,否则下面的写寄存器状态指令将被丢弃
WriteCurrent(WRSR); // 写状态寄存器
WriteCurrent(m_WriteRs); // 写入新设定的寄存器状态值
CS=1; // 拉高CS
}
/*****************************************************
函数功能:写数据到X5045的指定地址
入口参数:addr
***************************************************/
void WriteSet(unsigned char m_WriteSetData,unsigned char m_WriteAddress)
{
DELAYNOP(); // 延时5us
SCK=0; // 将SCK置于已知状态
DELAYNOP(); // 延时5us
CS=0; // 拉低CS,选中X5045
DELAYNOP(); // 延时5us
WriteCurrent(WREN); // 写使能锁存器允许
DELAYNOP(); // 延时5us
CS=1; // 拉高CS
DELAYNOP(); // 延时5us
CS=0; // 重新拉低CS,否则下面的写入指令将被丢弃
DELAYNOP(); // 延时5us
WriteCurrent(WRITE); // 写入指令
DELAYNOP(); // 延时5us
WriteCurrent(m_WriteAddress); // 写入指定地址
DELAYNOP(); // 延时5us
WriteCurrent(m_WriteSetData); // 写入数据
DELAYNOP(); // 延时5us
CS=1; // 拉高CS
DELAYNOP(); // 延时5us
SCK=0; // 将SCK置于已知状态
}
/*****************************************************
函数功能:从X5045的指定地址读出数据
入口参数:addr
出口参数:dat
***************************************************/
unsigned char ReadSet(unsigned char m_ReadSetAdress)
{
unsigned char m_ReadSetData;
DELAYNOP(); // 延时5us
SCK=0; // 将SCK置于已知状态
DELAYNOP(); // 延时5us
CS=0; // 拉低CS,选中X5045
WriteCurrent(READ); // 开始读
DELAYNOP(); // 延时5us
WriteCurrent(m_ReadSetAdress); // 写入指定地址
DELAYNOP(); // 延时5us
m_ReadSetData=ReadCurrent(); // 读出数据
DELAYNOP(); // 延时5us
CS=1; // 拉高CS
DELAYNOP(); // 延时5us
SCK=0; // 将SCK置于已知状态
DELAYNOP(); // 延时5us
return m_ReadSetData; // 返回读出的数据
}
/*--------------------------------------
读X5045状态
--------------------------------------*/
unsigned char X5045ReadStatus(void)
{
unsigned char val;
CS = 0; // 打开X5045片选
DELAYNOP(); // 延时5us
WriteCurrent(0x05); // 发送读X5045状态命令
val = ReadCurrent(); // 接收X5045状态数据
CS = 1; // 打开X5045片选
DELAYNOP(); // 延时5us
return val;
}
/*****************************************************
函数功能:看门狗复位程序
***************************************************/
void WatchDog(void)
{
CS=1; // 拉高CS
DELAYNOP(); // 延时5us
CS=0; // CS引脚的一个下降沿复位看门狗定时器
DELAYNOP(); // 延时5us
CS=1; // 拉高CS
DELAYNOP(); // 延时5us
}
unsigned char m_ShowData;
unsigned char m_X5045Adress = 0x00;
main()
{
WriteSR(0x12); //写状态寄存器(设定看门狗溢出时间为600ms,写不保护)
delaynms(10); //X5045的写入周期约为10ms
while(1)
{
delaynms(10); //X5045的写入周期约为10ms
//WriteSet(0x56,m_X5045Adress); //将数据m_ShowData”写入指定地址“0x00”
delaynms(10); //X5045的写入周期约为10ms
delaynms(100); //X5045的写入周期约为10ms
m_ShowData = ReadSet(m_X5045Adress); //将数据读出送显示
m_ShowData = X5045ReadStatus();
delaynms(10); //X5045的写入周期约为10ms
}
}
|