单片机
返回首页

用HI-TECH C写的使用PIC12C508单片机读写93LC46范例程式

2019-10-21 来源: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);

}


}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控音效发生器电路

  • 一个简单的警笛电路图

  • 优化电路板布局的简单方法

  • 一个简单的立体声平衡指示器电路

  • 分享一个电网倾角计电路

  • 使用NE555和磁簧开关的橱柜照明电路

    相关电子头条文章