┊ 网站导航 ┊ 管理登陆 ┊ 免责声明 ┊ 问题反馈 ┊ 友链说明┊本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正! 不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作! ![]() ![]() ![]() ![]() ![]() ![]() 本站学习交流群:138..158(高级群1-满)、77930286(高级群2)、61804809(群3) Copyright© MCUSY All Rights Reserved 本站网警备案号: WZ36040002485 ICP备案证书号:粤ICP备09034963号 |
/************************************************************ * 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("\tglobal\tconfig_word"); \ asm("config_word"); \ asm("\tdw "___mkstr(x)) #define __IDLOC(w) asm("\tpsect idloc,class=IDLOC,delta=2");\ asm("\tglobal\tidloc_word"); \ asm("idloc_word"); \ asm("\tirpc\t__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); } }
┊ 网站导航 ┊ 管理登陆 ┊ 免责声明 ┊ 问题反馈 ┊ 友链说明┊本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正! 不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作! ![]() ![]() ![]() ![]() ![]() ![]() 本站学习交流群:138..158(高级群1-满)、77930286(高级群2)、61804809(群3) Copyright© MCUSY All Rights Reserved 本站网警备案号: WZ36040002485 ICP备案证书号:粤ICP备09034963号 |