历史上的今天
返回首页

历史上的今天

今天是:2025年03月09日(星期日)

正在发生

2018年03月09日 | 基于HI-TECH C的PIC12C508读写93LC4源程序

2018-03-09 来源:eefocus

  /************************************************************ 
 * Processer : MICroChip PIC12C508        *
 * Compiler : Hi-TECH PICC 8.00 PL2      *
 * Writer : Jason Kuo          *
 * Description : It CAN read/write 93LC46 (64 x 16-bit organization) *
 *************************************************************/ 
 
static volatile unsigned char RTCC @ 0x01;
static volatile unsigned char TMR0 @ 0x01;
static volatile unsigned char PCL @ 0x02;
static volatile unsigned char STATUS @ 0x03;
static          unsigned char FSR @ 0x04;
static volatile unsigned char OSCCAL @ 0x05;
static volatile unsigned char GPIO @ 0x06;

    static          unsigned char control OPTION @ 0x00;
static volatile unsigned char control TRIS @ 0x06;

    /* STATUS bits */
static bit  GPWUF @ (unsigned)&STATUS*8+7;
static bit PA0 @ (unsigned)&STATUS*8+5;
static bit  TO @ (unsigned)&STATUS*8+4;
static bit  PD @ (unsigned)&STATUS*8+3;
static bit  ZERO @ (unsigned)&STATUS*8+2;
static bit DC @ (unsigned)&STATUS*8+1;
static bit CARRY @ (unsigned)&STATUS*8+0;

    /* OPTION bits */
#define  GPWU (1<<7)
#define  GPPU (1<<6)
#define  T0CS (1<<5)
#define  T0SE (1<<4)
#define  PSA (1<<3)
#define  PS2 (1<<2)
#define  PS1 (1<<1)
#define  PS0 (1<<0)

    /*      OSCCAL bits    */
static volatile bit    CAL3    @ (unsigned)&OSCCAL*8+7;
static volatile bit    CAL2    @ (unsigned)&OSCCAL*8+6;
static volatile bit    CAL1    @ (unsigned)&OSCCAL*8+5;
static volatile bit    CAL0    @ (unsigned)&OSCCAL*8+4;

    static volatile bit GP5 @ (unsigned)&GPIO*8+5;
static volatile bit GP4 @ (unsigned)&GPIO*8+4;
static volatile bit GP3 @ (unsigned)&GPIO*8+3;
static volatile bit GP2 @ (unsigned)&GPIO*8+2;
static volatile bit GP1 @ (unsigned)&GPIO*8+1;
static volatile bit GP0 @ (unsigned)&GPIO*8+0;

    #define CONFIG_ADDR 0xFFF

    /* code protection */
#define MCLREN  0xFFFF // memory clear enable
#define MCLRDIS  0xFFEF // memory clear dISAble

    /*watchdog*/
#define WDTEN  0xFFFF // watchdog timer enable
#define WDTDIS  0xFFFB // watchdog timer disable

    /* code protection */
#define PROTECT  0xFFF7 // protect the program code
#define UNPROTECT 0xFFFF // do not protect the program code

    /*osc configurations*/
#define EXTRC    0xFFFF // external resistor/caPACitor
#define INTRC  0xFFFE // internal
#define XT  0xFFFD // crystal/resonator
#define LP  0xFFFC // low power crystal/resonator

    /* 93LC46 I/O PIN define */
#define CS  GP0  //Chip Select
#define CLK GP1  //Serial Data CLOCk
#define DI GP2  //Serial Data Input
#define DO GP4  //Serial Data Output

    void Delay(unsigned int counter);
void Pulse(void);
void StartBit(void);
void EWEN(void);
void EWDS(void);
extern void Write93LC46(unsigned char Offset_Addr, unsigned int tx_data);  
extern unsigned int Read93LC46(unsigned char Offset_Addr);
void InitPIC(void);

    #define CLRWDT() asm(" clrwdt")
#define SLEEP()  asm(" sleep")

    #define ___mkstr1(x) #x
#define ___mkstr(x) ___mkstr1(x)
#define __CONFIG(x) asm("tpsect config,class=CONFIG,delta=2");
  asm("tglobaltconfig_word"); 
  asm("config_word"); 
  asm("tdw "___mkstr(x))

    #define __IDLOC(w)      asm("tpsect idloc,class=IDLOC,delta=2");
    asm("tglobaltidloc_word"); 
    asm("idloc_word"); 
    asm("tirpct__arg," ___mkstr(w)); 
    asm("tdw 0&__arg&h"); 
    asm("tendm")

   

     


    
__CONFIG(MCLRDIS & WDTDIS & EXTRC & PROTECT);

    
/*---------------------------------------------------- 
 Function : Delay          
 Input : unsigned int (counter)        
 Output : None          
 Description : Delay routine        
 if counter=1  delay 35us , if counter=10 delay 134us, 
 if counter=100 delay 1.12ms,
 These delay is base on internal 4MHz      
------------------------------------------------------*/      
void Delay(unsigned int counter)
{
  while(counter>0) counter--;  
}                                   

    
/*---------------------------------------------------- 
 Function : Pulse          
 Input : None        
 Output : None          
 Description : Send a pulse (10) to Serial Data Clock(CLK)        
------------------------------------------------------*/      
void Pulse(void)
{
    CLK = 1;
    Delay(25);
    CLK = 0;
}

  /*---------------------------------------------------- 

 Function : StartBit          
  Input : None        
 Output : None          
  Description :  
  1. Set Chip Select(CS) = 1 (high)
 2. Set a Start Bit(1) to Serial Data Input(DI)
------------------------------------------------------*/      
void StartBit(void)
{
    CS = 1;
    DI = 1;
    Pulse();
}

    /*---------------------------------------------------- 
 Function : EWEN          
  Input : None        
 Output : None          
  Description :  ERASE/WRITE Enable
 ------------------------------------------------------*/      
void EWEN(void)
{
    unsigned char i,temp;

        StartBit();                  /* 1 */

        temp = 0x80;                        /* 0011xxxx ,(opcode:00, Address:11xxxx) */
    for(i=0; i<8; i++) {
        if(0x30 & temp)
            DI = 1;
        else
            DI = 0;
        Pulse();
        temp >>= 1;
    }

        CS = 0;
}

    /*---------------------------------------------------- 
 Function : EWDS          
  Input : None        
 Output : None          
  Description :  ERASE/WRITE DISAble
 ------------------------------------------------------*/      
void EWDS(void)
{
    unsigned char i;

        StartBit();                  /* 1 */

        DI = 0;                      /* 0000xxxx, (opcode:00, Address:00xxxx) */
    for(i=0; i<8; i++)
        Pulse();

        CS = 0;
}

    /*---------------------------------------------------- 
 Function : Write93LC46          
  Input : unsigned char Offset Address, unsigned int tx_data        
 Output : None          
  Description :  Write 16bits data in to 93LC46 Offset Address
 ------------------------------------------------------*/      
void Write93LC46(unsigned char Offset_Addr, unsigned int tx_data)
{
    unsigned char Addr, i;
    unsigned int temp;

        EWEN();

        StartBit();                  /* 1 */
    Offset_Addr=Offset_Addr&0x3F; /* 6bits address */
    Addr = Offset_Addr + 0x40;          /* 01AAAAAA ,(opcode:01, address:AAAAAA) */
    temp = 0x0080;
    for(i=0; i<8; i++) {
        if(Addr & temp)
            DI = 1;
        else
            DI = 0;
        Pulse();
        temp >>= 1;
    }

        temp = 0x8000;                      /* DDDDDDDDDDDDDDDD(16bits data)*/
    for(i=0; i<16; i++) {
        if(tx_data & temp)
            DI = 1;
        else
            DI = 0;
        Pulse();
        temp >>= 1;
    }
    CS = 0;

        EWDS();
}

    /*---------------------------------------------------- 
 Function : Read93LC46          
  Input : unsigned char Offset Address
 Output : unsigned int          
  Description :  Read 16bits data from 93LC46 offset address
 ------------------------------------------------------*/      
unsigned int Read93LC46(unsigned char Offset_Addr)
{
    unsigned char Addr, i, temp;
    unsigned int  rx_data;

        StartBit();                  /* 1 */
    Offset_Addr = Offset_Addr&0x3F; /* 6bits address */
    Addr = Offset_Addr + 0x80;          /* 10AAAAAA ,(opcode:10, address:AAAAAA) */
    temp = 0x80;
    for(i=0; i<8; i++) {
        if(Addr & temp)
            DI = 1;
        else
            DI = 0;
        Pulse();
        temp >>= 1;
    }

        rx_data = 0x0000;                    /* DDDDDDDDDDDDDDDD(16bits data)*/
    for(i=0; i<16; i++) {
        Pulse();
        if(DO)
            rx_data |= 0x0001;
        if(i < 15)
            rx_data <<= 1;
    }
    CS = 0;

        return(rx_data);
}

    void InitPIC(void)
{
    OPTION = (GPWU | GPPU | PS2 | PS1 | PS0);
    TRIS = 0x10;    
    CS = 0;
    CLK = 0;
    DI = 0;    
}

    /* Main routine */
void main(void)
{
 unsigned char addr;
 unsigned int rx_buf;
 
 InitPIC();
 /* Read a word then +1 and write back to 93LC46 */
 for (addr = 0; addr < 10; addr++)
 {
  rx_buf = Read93LC46(addr);
  rx_buf = rx_buf+1;
  Write93LC46(addr, rx_buf);
 }

    }


推荐阅读

史海拾趣

BEKA Associates Ltd公司的发展小趣事

在电子行业,供应链管理对于企业的生存和发展至关重要。BCD Semi(Diodes)深知这一点,因此在供应链管理方面进行了大量的优化工作。公司与多家优质的供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量可靠。同时,公司还采用先进的物流管理系统,实现了对供应链的实时监控和高效运作,有效降低了运营成本并提高了运营效率。

CommScope Inc公司的发展小趣事

CommScope Inc公司的前身可以追溯到1953年,在北卡罗莱纳州的山核桃成立的高级电缆公司。这个公司以其卓越的电话线产品赢得了市场的认可。到了1964年,康普的产品线开始使用高级电缆和同轴电缆,标志着公司在电缆技术领域的突破。随着技术的不断革新,1966年,康普在卡托巴县的福特社区开始数控制造,进一步提升了生产效率。1976年,大陆高级康普部门被Frank Drendel领导的投资者集团收购,这为公司日后的发展奠定了坚实的基础。

Anderson Power Products公司的发展小趣事

CommScope Inc公司的前身可以追溯到1953年,在北卡罗莱纳州的山核桃成立的高级电缆公司。这个公司以其卓越的电话线产品赢得了市场的认可。到了1964年,康普的产品线开始使用高级电缆和同轴电缆,标志着公司在电缆技术领域的突破。随着技术的不断革新,1966年,康普在卡托巴县的福特社区开始数控制造,进一步提升了生产效率。1976年,大陆高级康普部门被Frank Drendel领导的投资者集团收购,这为公司日后的发展奠定了坚实的基础。

ADI(亚德诺半导体)公司的发展小趣事

尽管康普在通信行业取得了显著的成就,但它也面临着诸多挑战。其中最大的挑战之一来自网络安全和数据保护。近年来,随着网络安全事件的频发,康普也遭受了数据泄露等网络安全事件的冲击。然而,康普积极应对挑战,加强了网络安全和数据保护的投入,提升了公司的网络安全防护能力。同时,康普也积极寻找新的增长点,拓展5G、物联网等新兴市场及成长型市场的渠道,为公司的未来发展奠定了坚实的基础。

以上五个故事仅是CommScope Inc公司电子行业发展的部分缩影,实际上,公司的发展历程远比这些故事更为丰富和复杂。但通过这些故事,我们可以看到CommScope Inc公司在技术创新、市场开拓、产品升级以及应对挑战等方面所做出的努力和取得的成就。

Enterpoint公司的发展小趣事

作为一家有社会责任感的企业,Enterpoint公司始终关注可持续发展问题。他们积极推广绿色、环保的生产方式,减少对环境的影响。同时,公司还积极参与社会公益活动,通过捐赠物资、支持教育等方式回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

Cofan Usa Inc公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,Cofan Usa Inc公司开始积极拓展国内外市场。通过与各大电商平台和实体零售商建立合作关系,公司成功将产品推向更广泛的消费者群体。同时,公司注重品牌建设,通过精准的市场定位和有效的营销策略,逐渐树立了独特的品牌形象。

问答坊 | AI 解惑

现代制动系统保养方式

子式工具组,工作简单快捷,舒适安全,且一人便可独立完成。工具组主要功用是:①测试制动液的湿沸点,确定是否应该更换。②使用独有的工具进行旧制动液的排放和新制动液的加注。③换液时,工具中采用先进的电子传感显示技术的部件,能准确有效地判 ...…

查看全部问答>

cpld课程实验

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 cpld课程实验  …

查看全部问答>

老生常谈:如何学习嵌入式--------希望能给初学者一点帮助

     最近不断有学生问我嵌入式很有意思,但是应该如何入手呢?有些学生虽然在指导下做了一些小东西,但事后却往往不知道学到了些什么!只知道似乎很有意思。那么该如何学习嵌入式呢?学习嵌入式需要哪些知识呢?    ...…

查看全部问答>

请问tcl语言中如何将内容打印到文件啊,如内文例子。

请问tcl语言中如何将内容打印到文件啊,比如下面这句:puts [ format \"%40s%13s%13s%13s\"\"name\" \"num\" \"code\" \"com\"]在modelsim中执行后会在modelsim命令窗口打印相应字符,如果想把这些打印到文件中,该用什么命令呢。刚开始学习tcl,还 ...…

查看全部问答>

找ise foundation 10.1 的开发软件

我现在找了很久ise foundation 10.1或webpack的开发软件,有谁有的可以给我提供以下吗,我在学校,去xilinx网站下要花很大的流量,下不起,图书馆借了个光盘也不能用,哪位好心人能帮我一下,感激涕零啊!邮箱:ffxsppan@163.com…

查看全部问答>

如何使用GPRS替代RS232端口?

我在工作中使用的测量仪器原本是由PC通过RS232来控制的。现在我需要将这种测量仪器放在工地,PC仍留在室内。请问是否可以使用GPRS或其它无线通信技术来实现?我原本编写的通过RS232端口控制仪器的程序要改写吗?请高手指教,最好能够合作!…

查看全部问答>

evc4.0下怎么做才能读和写 csv文件,在线等

evc4.0下怎么做才能读和写 csv文件,我想把它考到pc机上去。…

查看全部问答>

请教

本帖最后由 paulhyde 于 2014-9-15 09:02 编辑 如果自己做的模块没有用竞赛提供的芯片,可以吗?再重新做模块还来得及吗?  …

查看全部问答>

开关电源 负载调整率

本帖最后由 paulhyde 于 2014-9-15 09:15 编辑 …

查看全部问答>

LaunchPad能烧写二进制文件么?怎么操作?用CCS

LaunchPad能烧写二进制文件么?怎么操作?用CCS…

查看全部问答>