网站首页
IC库存
IC展台
电子资讯
技术资料
PDF文档
我的博客
IC72论坛
ic72 logo
搜索关键字: 所有资讯 行业动态 市场趋势 政策法规 新品发布 技术资讯 价格快报 展会资讯
  • 达普IC芯片交易网 > 新闻中心 > 设计应用 > 正文
  • RSS
  • c51写的93C46的读写程序
    http://www.ic72.com 发布时间:2007/5/13 11:29:25
    #include <reg52.h>
    sbit CS=P2^7;
    sbit SK=P2^6;
    sbit DI=P2^5;
    sbit DO=P2^4;
    /*
    extern unsigned char ReadChar(unsigned char address);
    extern void WriteChar(unsigned char address,unsigned char InData);
    extern void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number);
    extern void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number);
    */
    // Write enable must precede all programming modes.
    void Ewen(void) {
    unsigned char temp,InData;
    CS=0;
    SK=0;
    CS=1;
    InData=0x98; // 10011XXXX
    for(temp=9;temp!=0;temp--) { // 9
    DI=InData&0x80;
    SK=1; SK=0;
    InData<<=1;
    }
    CS=0;
    }
    // Disables all programming instructions.
    void Ewds(void) {
    unsigned char temp,InData;
    CS=0;
    SK=0;
    CS=1;
    InData=0x80; // 10000XXXX
    for(temp=9;temp!=0;temp--) { // 9
    DI=InData&0x80;
    SK=1; SK=0;
    InData<<=1;
    }
    CS=0;
    }
    // Reads data stored in memory, at specified address.
    unsigned int Read(unsigned char address) {
    unsigned char temp;
    unsigned int result;
    Ewen();
    SK=0; DI=1; // 110 A5-A0
    CS=0; CS=1;
    SK=1; SK=0; // 1
    address=address&0x3f|0x80;
    for(temp=8;temp!=0;temp--) { // 8
    DI=address&0x80;
    SK=1; SK=0;
    address<<=1;
    }
    DO=1;
    for(temp=16;temp!=0;temp--) { // 16
    SK=1;
    result=(result<<1)|DO;
    SK=0;
    }
    CS=0;
    Ewds();
    return(result);
    }
    // Writes memory location An - A0.
    void Write(unsigned char address,unsigned int InData) {
    unsigned char temp;
    Ewen();
    SK=0; DI=1; // 101 A5-A0
    CS=0; CS=1;
    SK=1; SK=0; // 1
    address=address&0x3f|0x40;
    for(temp=8;temp!=0;temp--) { // 8
    DI=address&0x80;
    SK=1; SK=0;
    address<<=1;
    }
    for(temp=16;temp!=0;temp--) { // 16
    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();
    }
    /*
    // Erase memory location An - A0.
    void Erase(unsigned char address) {
    unsigned char temp;
    Ewen();
    SK=0; DI=1; // 111 A5-A0
    CS=0; CS=1;
    SK=1; SK=0; // 1
    address|=0xc0;
    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();
    }
    // Erases all memory locations. Valid only at VCC = 4.5V to 5.5V.
    void Eral(void) {
    unsigned char temp,InData;
    Ewen();
    CS=0;
    SK=0;
    CS=1;
    InData=0x90; // 10010XXXX
    for(temp=9;temp!=0;temp--) { // 9
    DI=InData&0x80;
    SK=1; SK=0;
    InData<<=1;
    }
    CS=0; DO=1;
    CS=1; SK=1;
    while(DO==0) {
    SK=0; SK=1;
    }
    SK=0; CS=0;
    Ewds();
    }
    // Writes all memory locations. Valid only at VCC = 4.5V to 5.5V.
    void Wral(unsigned int InData) {
    unsigned char temp,address;
    Ewen();
    CS=0;
    SK=0;
    CS=1;
    address=0x88; // 10001XXXX
    for(temp=9;temp!=0;temp--) { // 9
    DI=address&0x80;
    SK=1; SK=0;
    address<<=1;
    }
    for(temp=16;temp!=0;temp--) { // 16
    DI=InData&0x8000;
    SK=1; SK=0;
    InData<<=1;
    }
    CS=0; DO=1;
    CS=1; SK=1;
    while(DO==0) {
    SK=0; SK=1;
    }
    SK=0; CS=0;
    Ewds();
    }
    */
    unsigned char ReadChar(unsigned char address) {
    unsigned char temp=address>>1;
    if(address&0x01) return((unsigned char)(Read(temp)>>8));
    else return((unsigned char)(Read(temp)));
    }
    void WriteChar(unsigned char address,unsigned char InData) {
    unsigned char temp=address>>1;
    if(address&0x01) Write(temp,(unsigned int)(Read(temp)&0x00ff|(InData<<8)));
    else Write(temp,(unsigned int)(Read(temp)&0xff00|InData));
    }
    void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) {
    while(Number!=0) {
    *RamAddress=ReadChar(RomAddress);
    RamAddress++;
    RomAddress++;
    Number--;
    }
    }
    void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number) {
    unsigned int temp;
    if(Number==0) return;
    if(RomAddress&0x01) {
    WriteChar(RomAddress,*RamAddress);
    RamAddress++;
    RomAddress++;
    Number--;
    }
    if(Number==0) return;
    while(Number>>1) {
    temp=*RamAddress;
    RamAddress++;
    temp=temp|(*RamAddress)<<8;
    RamAddress++;
    Write(RomAddress>>1,temp);
    RomAddress++;
    RomAddress++;
    Number--;
    Number--;
    }
    if(Number) WriteChar(RomAddress,*RamAddress);
    }



    www.ic72.com 达普IC芯片交易网
  • 行业动态
  • 市场趋势
  • 政策法规
  • 新品发布
  • Baidu

    IC快速检索:abcdefghijklmnopqrstuvwxyz0123456789
    COPYRIGHT:(1998-2010) IC72 达普IC芯片交易网
    客户服务:service@IC72.com 库存上载:IC72@IC72.com
    (北京)联系方式: 在线QQ咨询:点击这里给我发消息 联系电话:010-82614113 传真:010-82614123
    京ICP备06008810号-21 京公网安备 11010802032910 号 企业资质