下面是我编写关于93C46的读写代码,P0引脚连接的是8个LED,目的是通过读写93C46实现LED闪烁的效果。
现在程序运行时,DO引脚始终是高电平,LED常亮,检查好几遍时序设置,也没有发现问题,请各位高手帮我分析一下到底问题出现在哪了,谢谢!
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit cs = P1^0;
sbit sk = P1^1;
sbit din = P1^2;
sbit dout = P1^3;
void sk_cp() //时钟脉冲
{
sk = 0;
_nop_();
_nop_();
sk = 1;
_nop_();
_nop_();
sk = 0;
}
void start() //启动93C46
{
cs = 0;
sk = 0;
din = 0;
cs = 1;
}
void end() //关闭93C46
{
cs = 0;
sk = 0;
din = 0;
}
void sendbit(uchar adress, uchar num) //向93C46发送指令或指令地址
{
uchar i;
adress <<= 1; //去掉最高位
for(i = 0; i < num; i++)
{
din = (bit)(adress & 0x80);
adress <<= 1;
_nop_();
_nop_();
sk_cp();
}
}
void senddata(uchar num) //向93C46发送数据或数据地址
{
uchar i;
for(i = 0; i < 8; i++)
{
din = (bit)(num & 0x80);
num <<= 1;
_nop_();
_nop_();
sk_cp();
}
}
void ewen() //93C46写使能函数
{
start();
sendbit(0x40,3);
sendbit(0x60,7);
end();
}
void ewds() //93C46写无效函数
{
start();
sendbit(0x40,3);
sendbit(0x00,7);
end();
}
uchar read(uchar address) //读取93C46某一地址的数据
{
uchar i;
uchar temp = 0x00;
ewen();
start();
sendbit(0x60,3);
sendbit(address,7);
for(i = 0; i < 8; i++)
{
temp <<= 1;
sk_cp();
_nop_();
_nop_();
if(dout == 1)
temp = temp | 0x01;
}
end();
ewds();
return temp;
}
/*void erase(uchar address) //擦写93C46某一地址
{
ewen();
start();
sendbit(0x70,3);
sendbit(address,7);
cs = 0;
_nop_();
cs = 1;
_nop_();
_nop_();
while(!dout);
_nop_();
end();
ewds();
} */
/*void eral() //将93C46存储器内容全部擦除
{
ewen();
start();
sendbit(0x40,3);
sendbit(0x40,7);
cs = 0;
_nop_();
cs = 1;
_nop_();
_nop_();
while(!dout);
_nop_();
end();
ewds();
}*/
void writebyte(uchar address, uchar num) //向93C46某一地址写入数据
{
ewen();
start();
sendbit(0x50,3);
sendbit(address,7);
senddata(num);
cs = 0;
_nop_();
cs = 1;
_nop_();
_nop_();
while(!dout);
_nop_();
end();
ewds();
}
void delay(uint time) //延时函数
{
uint i,j;
for(i = 0; i < time; i++)
for(j = 0; j < 100; j++);
}
void main()
{
uchar temp;
//eral();
writebyte(0x00,0x00);
writebyte(0x02,0xff);
while(1)
{
temp = read(0x00);
P0 = temp;
delay(300);
temp = read(0x02);
P0 = temp;
delay(300);
}
}
此帖出自
小平头技术问答
一周热门 更多>