求助:关于93C46的问题

2019-03-24 19:59发布

下面是我编写关于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); 
 }
} 此帖出自小平头技术问答
0条回答

一周热门 更多>