打印

93c46读数据不对问题

[复制链接]
1760|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bcd8421|  楼主 | 2013-3-14 20:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<stdio.h>
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit l1=P2^7;//LED1选通位,为0有效,初始都为1
sbit l2=P2^6;//LED2选通位
sbit l3=P2^5;//LED3选通位
sbit l4=P2^4;//LED4选通位

/*93c46工作在8位模式*/

sbit CS=P2^3;//93c46片选信号
sbit SK=P2^2;//93c46时钟信号
sbit DI=P2^1;//93c46数据写入脚
sbit DO=P2^0;//93c46数据读出脚
uchar led1=0,led2=1,led3=2,led4=3;//4位数码管显示值
uchar dispcode[]={0XCF,0X48,0XD6,0XDC,0X59,0X9D,0X9F,0XCE,0XDF,0XDD};//0--9
void delay1ms(uint p)//12mhz 延时1毫秒
{
        uchar i,j;
        for(i=0;i<p;i++)
        {
                  for(j=0;j<124;j++)
                  {
                        ;
                }
        }
}
/*93c46擦/写使能指令程序*/

void Ewen(void) {
        unsigned char temp,InData;
        CS=0;
        SK=0;
        CS=1;
        InData=0x98; // 10011XXXXXX
        for(temp=10;temp!=0;temp--)// 10
        {
                DI=InData&0x80;
                SK=1; SK=0;
                InData<<=1;
        }
        CS=0;
}
/*93c46擦/写禁止指令程序*/
void Ewds(void)
{
        unsigned char temp,InData;
        CS=0;
        SK=0;
        CS=1;
        InData=0x80; // 10000XXXX
        for(temp=10;temp!=0;temp--)// 10
        {
                  DI=InData&0x80;
                  SK=1; SK=0;
                  InData<<=1;
        }
        CS=0;
}

/*读取数据指令程序*/

uchar Read(uchar address)
{
        uchar temp;
        uchar result;
        Ewen();
        SK=0; DI=1; // 110 A6-A0
        CS=0; CS=1;
        SK=1; SK=0;   // 1 指令起始位
        DI=1; SK=1; SK=0;//操作码第一位1,第二位0循环里移入
        address=address&0x7f;
        for(temp=8;temp!=0;temp--) // 8,   7位地址写入
        {
                  DI=address&0x80;
                  SK=1; SK=0;
                  address<<=1;
        }
        DO=1;
        for(temp=8;temp!=0;temp--) // 8        一字节循环读出数据
        {
                  SK=1;
                  result=(result<<1)|DO;
                  SK=0;
        }
        CS=0;
        Ewds();
        return(result);//返回读出字节数据
}


/*写入数据指令程序*/

void Write(unsigned char address,unsigned char InData)
{
        unsigned char temp;
        Ewen();
        SK=0; DI=1; // 101 A6-A0
        CS=0; CS=1;
        SK=1; SK=0;   // 1 指令起始位
        DI=0; SK=1; SK=0; //写操作码第一位0
        address=address|0x80;
        for(temp=8;temp!=0;temp--)// 8, 7位地址写入
        {
                  DI=address&0x80;
                  SK=1; SK=0;
                  address<<=1;
        }
        for(temp=8;temp!=0;temp--)// 一字节数据循环写入
        {
                  DI=InData&0x8000;
                  SK=1; SK=0;
                  InData<<=1;
        }
        CS=0; DO=1;
        CS=1; SK=1;
        while(DO==0)  // busy test
        {   
                  SK=0; SK=1;
        }                                 
        SK=0; CS=0;
        Ewds();
}

/*擦除指定地址数据*/

void Erase(unsigned char address)
{
        unsigned char temp;
        Ewen();
        SK=0; DI=1; // 111 A6-A0
        CS=0; CS=1;
        SK=1; SK=0;   // 1  指令码起始位
        DI=1; SK=1; SK=0;//操作码第一位
        address|=0x80;
        for(temp=8;temp!=0;temp--)// 8
        {
                  DI=address&0x80;
                  SK=1; SK=0;
                  address<<=1;
        }
        CS=0; DO=1;
        CS=1; SK=1;
        while(DO==0)
        {
                  SK=0; SK=1;
        }
        SK=0; CS=0;
        Ewds();
}

void displed()//显示程序
{
        P0=dispcode[led1];
        l1=0;
        delay1ms(2);
        l1=1;
        P0=dispcode[led2];
        l2=0;
        delay1ms(2);
        l2=1;
        P0=dispcode[led3];
        l3=0;
        delay1ms(2);
        l3=1;
        P0=dispcode[led4];
        l4=0;
        delay1ms(2);
        l4=1;                       
                               
}


                        
main()
{
        uchar a=0,b=0,c=0,d=0,e=0;
        P2=0XFF;
        Erase(0);
        Erase(1);
        Write(0,0X59);
        Write(1,0XDF);
        led1=Read(0);
        led2=Read(1);
        led3=Read(2);
        led4=Read(3);
        while(1)
        {       
                displed();
        }
}

把程序贴出来了,工作在8位模式

相关帖子

沙发
bcd8421|  楼主 | 2013-3-14 20:07 | 只看该作者
用的89c52

使用特权

评论回复
板凳
bcd8421|  楼主 | 2013-3-14 20:20 | 只看该作者
        for(temp=8;temp!=0;temp--) // 8,   7位地址写入
        {
                  DI=address&0x80;
                  SK=1; SK=0;
                  address<<=1;
        }
用的12M的晶振,信号转换要用延时么?

使用特权

评论回复
地板
airwill| | 2013-3-14 20:35 | 只看该作者
据手册:
High Speed Operation: 4 MHz (5 V), 2 MHz (1.8 V)
应该不需要延时.

使用特权

评论回复
5
bcd8421|  楼主 | 2013-3-14 21:03 | 只看该作者
        for(temp=10;temp!=0;temp--)// 10
        {
                DI=InData&0x80;
                SK=1; SK=0;
                InData<<=1;
        }
        CS=0;
这里循环有溢出,会不会影响?

使用特权

评论回复
6
bcd8421|  楼主 | 2013-3-14 21:17 | 只看该作者
        for(temp=8;temp!=0;temp--) // 8,   7位地址写入
        {
                  DI=address&0x80;
                  SK=1; SK=0;
                  address<<=1;
        }
        DO=1;
        for(temp=8;temp!=0;temp--) // 8        一字节循环读出数据
        {
                  SK=1;
     D0置1后,这里SK上升沿有效,那么D0这里的数据会怎么样?
                  result=(result<<1)|DO;
                  SK=0;
        }

使用特权

评论回复
7
bcd8421|  楼主 | 2013-3-15 10:03 | 只看该作者
为什么读出的数据全都是0呀

使用特权

评论回复
8
bcd8421|  楼主 | 2013-3-15 17:08 | 只看该作者
搞定了,用的NS的芯片不行,换ATMEL的就没可以了,程序没有问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

8

帖子

0

粉丝