PIC12C508 Read and Write 93LC46 Program
/************************************************* ***********
static volatile unsigned char RTCC @ 0x01;
static unsigned char controlOPTION @ 0x00;
/* STATUS bits */
/* OPTION bits */
/* OSCCAL bits */
static volatile bit GP5 @(unsigned) & GPIO * 8 + 5;
#define CONFIG_ADDR 0xFFF
void Delay(unsigned int counter);
#define CLRWDT() asm("clrwdt")
#define ___mkstr1(x) #x
__CONFIG(MCLRDIS & WDTDIS & EXTRC & PROTECT);
/*------------------------------------------------ ----
void Delay(unsigned int counter)
/*------------------------------------------------ ----
void Pulse(void)
/*------------------------------------------------ ----
void StartBit(void)
/*------------------------------------------------ ----
void EWEN(void)
/*------------------------------------------------ ----
void EWDS(void)
/*------------------------------------------------ ----
void Write93LC46(unsigned char Offset_Addr, unsigned int tx_data)
/*------------------------------------------------ ----
unsigned int Read93LC46(unsigned char Offset_Addr)
void InitPIC(void)
/* Main routine */
Power 12W ,output voltage 3-12V, output current Max 1A, 6 dc tips. We can meet your specific requirement of the products, like label design. The material of this product is PC+ABS. All condition of our product is 100% brand new.
Our products built with input/output overvoltage protection, input/output overcurrent protection, over temperature protection, over power protection and short circuit protection. You can send more details of this product, so that we can offer best service to you!
12W Wall Adapter, 12W Wall Power Supply,12W Power Cord In Wall, 12W Wall Power Adapter Shenzhen Waweis Technology Co., Ltd. , https://www.waweis.com
* Processor: MicroChip PIC12C508
* Compiler: Hi-TECH PICC 8.00PL2
* Writer: Jason Kuo
* Description: It can read/write 93LC46 (64x16-bit organization)
************************************************** ***********/
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 volatile unsigned char controlTRIS @ 0x06;
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;
#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);
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 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;
/* 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 CSGP0 // Chip Select
#define CLKGP1 // Serial Data Clock
#define DIGP2 // Serial Data Input
#define DOGP4 // Serial Data Output
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 SLEEP() asm("sleep")
#define ___mkstr(x) ___mkstr1(x)
#define __CONFIG(x) asm(" psect config, CONFIG, delta=2");\
asm(" global config_word");\
asm(" config_word");\
asm(" dw" ___mkstr(x))
#define __IDLOC(w) asm(" psect idloc, IDLOC, delta=2");\
asm(" global idloc_word");\
asm(" idloc_word");\
asm(" irpc __arg," ___mkstr(w));\
asm(" dw 0&__arg&h");\
asm(" endm")
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 delays are based on internal 4MHz
-------------------------------------------------- ----*/
{
while (counter > 0) counter--;
}
Function: Pulse
Input: None
Output: None
Description: Send a pulse (10) to Serial Data Clock (CLK)
-------------------------------------------------- ----*/
{
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)
-------------------------------------------------- ----*/
{
CS = 1;
DI = 1;
Pulse();
}
Function: EWEN
Input: None
Output: None
Description: ERASE/WRITE Enable
-------------------------------------------------- ----*/
{
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
-------------------------------------------------- ----*/
{
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 16 bits data into 93LC46 Offset_Address
-------------------------------------------------- ----*/
{
unsigned char Addr, i;
unsigned int temp;
EWEN();
StartBit(); /*1*/
Offset_Addr = Offset_Addr & 0x3F; /*6 bits address*/
Addr = Offset_Addr + 0x40; /*01 AAAAAA, (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 (16 bits 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 16 bits data from 93LC46 offset address
-------------------------------------------------- ----*/
{
unsigned char Addr, i, temp;
unsigned int rx_data;
StartBit(); /*1*/
Offset_Addr = Offset_Addr & 0x3F; /*6 bits address*/
Addr = Offset_Addr + 0x80; /*10 AAAAAA, (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 (16 bits data)*/
for (i = 0; i < 16; i++)
{
Pulse();
if (DO)
rx_data |= 0x0001;
if (i < 15)
rx_data <<= 1;
}
CS = 0;
return(rx_data);
}
{
OPTION = (GPWU | GPPU | PS2 | PS1 | PS0);
TRIS = 0x10;
CS = 0;
CLK = 0;
DI = 0;
}
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);
}
}
August 04, 2025