PIC单片机片内EEPROM的读写程序

合集下载

单片机EEPROM读写程序

单片机EEPROM读写程序
uint iSectorAddr; iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */ ISP_ADDRH = (uchar)(iSectorAddr >> 8); ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8;
/* 清空低 3 位 */
/* 指向下一个字节 */
/* ========================= 扇区读出 ========================= */
/* 程序对地址没有作有效性判断,请调用方事先保证他在规定范围内 */
void ArrayRead(uint begin_addr, uchar len){
// uchar xdata data_buffer[];
/* 整个扇区读取缓存区 */
uint iSectorAddr;
uint i;
iSectorAddr = begin_addr; // & 0xfe00;
/* 取扇区地址 */
ISP_IAP_enable(); for(i = 0; i < len; i++){
ISP_DATA = 0;
ISP_TRIG = 0x46;
/* 触发 ISP_IAP 命令字节 1 */
ISP_TRIG = 0xb9;
/* 触发 ISP_IAP 命令字节 2 */
_nop_();
Ttotal[i] = ISP_DATA; iSectorAddr++; } ISP_IAP_disable(); }
ISP_TRIG = 0x46; ISP_TRIG = 0xb9; _nop_();

PIC读写24LCxx系列的EEPROM的实例C语言程序

PIC读写24LCxx系列的EEPROM的实例C语言程序

PIC:读写24LCxx系列的EEPROM的实例C语言程序//********************************************************* //* Using I2C Master Mode for access Slave (EEPRM)//*//* Written by: Richard Yang//* Sr. Corporate Application Engineer//* Microchip Technology Inc.//* Date: Oct. 3nd '2002//* Revision: 1.00//* Language tools : MPLAB-C18 v2.09.13//* MPLINK v3.10//* MPLAB-IDE v6.00.17 & ICD2 //***********************************************************/* Include Header files */#i nclude <p18f452.h>#i nclude <i2c.h> // Load I2C Header file from defult direct#i nclude <timers.h>#i nclude "P18LCD.h" // Load P18LCD Header file form current working direct/* Declare the Function Prototype */void Initialize_I2C_Master(void);void EE_Page_Write(unsigned char,unsigned char,unsigned char,unsigned char *); void EE_SEQU_Read(unsigned char,unsigned char,unsigned char,unsigned char *);void EEPROM_Write(unsigned char,unsigned char,unsigned char);void EEPROM_ACK(unsigned char);unsigned char EEPROM_Read(unsigned char,unsigned char);void I2C_Done(void);void Initialize_Timer2(void);void isr_high_direct(void);void isr_high(void);#pragma romdata My_romdata=0x1000const rom far unsigned char LCD_MSG1[]="SW2: Byte Write ";const rom far unsigned char LCD_MSG2[]="SW6: Random Read";const rom far unsigned char LCD_MSG3[]="Byte Write Mode ";const rom far unsigned char LCD_MSG4[]="Random Read Mode";const rom far unsigned char LCD_MSG5[]="Sended: ";const rom far unsigned char LCD_MSG6[]="Send: ";const rom unsigned char I2C_Write_Buffer[]="Microchip Technology";#pragma romdata/* Define following array in data memory */unsigned char I2C_Read_Buffer [32];/* define following variable in data memory at Access Bank */#pragma udata access My_RAMnear unsigned char Debounce;near unsigned char Send_Addr;near unsigned char Send_Data;near unsigned char Send_Length;near unsigned char Read_Data;near unsigned char P_SW2;near unsigned char P_SW6;#pragma udata#define Page_Length 8#define SW2 PORTAbits.RA4#define SW6 PORTEbits.RE1#define Bounce_Time 6#define EE_CMD 0xA0//***********************************************************/* *//* Main Program *//* *///***********************************************************void main(void){ADCON1=0b00000110; // Disable A/D FunctionTRISAbits.TRISA4=1; // Set SW2 for inputTRISEbits.TRISE1=1; // Set SW6 for InputInitialize_Timer2( );Initialize_I2C_Master( );OpenLCD( );if (SW2 & SW6)Debounce=0;else Debounce = Bounce_Time;while(1){LCD_Set_Cursor(0,0); // Put LCD Cursor on (0,0)putrsLCD(LCD_MSG1);LCD_Set_Cursor(1,0); // Put LCD Cursor on (1,0)putrsLCD(LCD_MSG2);P_SW2=P_SW6=0;Send_Addr=0;while(1){if (P_SW2){P_SW2=0;Debounce = Bounce_Time;LCD_Set_Cursor(0,0); // Put LCD Cursor on (0,0)putrsLCD(LCD_MSG3);LCD_Set_Cursor(1,0); // Put LCD Cursor on (0,0)putrsLCD(LCD_MSG5);do{while (!P_SW2);P_SW2=0;LCD_Set_Cursor(1,8);Send_Data=I2C_Write_Buffer[Send_Addr];EEPROM_Write(EE_CMD,Send_Addr,Send_Data);puthexLCD(EE_CMD);putcLCD(' ');puthexLCD(Send_Addr);putcLCD(' ');puthexLCD(Send_Data);EEPROM_ACK(EE_CMD);Send_Addr++;} while (I2C_Write_Buffer[Send_Addr]!=0x00);break;}if (P_SW6){P_SW6=0;Debounce = Bounce_Time;LCD_Set_Cursor(0,0); // Put LCD Cursor on (0,0)putrsLCD(LCD_MSG4);LCD_Set_Cursor(1,0); // Put LCD Cursor on (0,0)putrsLCD(LCD_MSG6);while(1){if (P_SW6){P_SW6=0;LCD_Set_Cursor(1,5);Read_Data = EEPROM_Read(EE_CMD,Send_Addr);puthexLCD(EE_CMD);putcLCD(' ');puthexLCD(Send_Addr);putcLCD(' ');puthexLCD(EE_CMD);putcLCD(' ');puthexLCD(Read_Data);Send_Addr++;}if (P_SW2) break;}if (P_SW2) break;}if (P_SW2){P_SW2=0;break;}}}}//************************************************ //* #pragma Interrupt Declarations *//* *//* Function: isr_high_direct *//* - Direct execution to the actual *//* high-priority interrupt code. *//************************************************ #pragma code isrhighcode = 0x0008void isr_high_direct(void){_asm //begin in-line assemblygoto isr_high //go to isr_high function_endasm //end in-line assembly}#pragma code//************************************************ //* Function: isr_high(void) *//* High priority interrupt for Timer2 * //************************************************#pragma interrupt isr_highvoid isr_high(void){PIR1bits.TMR2IF=0; // Clear Timer2 interrupt Flagif (Debounce==0){if (!SW2){ P_SW2=1; Debounce =Bounce_Time; }if (!SW6){ P_SW6=1; Debounce =Bounce_Time; }}else if (SW2 & SW6)Debounce--;else Debounce =Bounce_Time;}#pragma code//*********************************************** //* Write a Byte to EEPROM//* - ctrl : Control Byte of EEPROM//* - addr : Location of EEPROM//* - data : Data Byte of EEPROM//***********************************************void Initialize_Timer2(void){RCONbits.IPEN=1; // Enable Interrupt Priority bitIPR1bits.TMR2IP=1; // Set Timer2 for High PriorityINTCONbits.GIEH=1; // Enable High Priority InterruptOpenTimer2 (TIMER_INT_ON // Turn On the Timer2 with Interrupt & T2_PS_1_4 // (4Mhz/4) [4*10*(99+1)] = 4mS */& T2_POST_1_10);PR2 = 99;}//*********************************************** //* Write a Byte to EEPROM *//* - ctrl : Control Byte of EEPROM *//* - addr : Location of EEPROM *//* - data : Data Byte of EEPROM *//*********************************************** void EEPROM_Write(unsigned char ctrl,unsigned char addr,unsigned char data){IdleI2C(); // ensure module is idleStartI2C(); // Start conditionI2C_Done(); // Wait Start condition completed and clear SSPIF flagWriteI2C(ctrl); // Write Control+Write to EEPROM & Check BF flagwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done(); // Clear SSPIF flagWriteI2C(addr); // Write Address to EEPROMwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done();WriteI2C(data); // Write Data to EEPROMwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done();StopI2C(); // Stop conditionI2C_Done(); // Wait the Stop condition completed}//***********************************************//* Pae Write to EEPROM//*//* - ctrl : Control Byte of EEPROM//* - addr : Location of EEPROM//* - length : Write counter//* - *dptr : RAM point --> EEPROM//*//***********************************************void EE_Page_Write(unsigned char ctrl,unsigned char addr,unsigned char length,unsigned char *dptr){IdleI2C(); // ensure module is idleStartI2C(); // Start conditionI2C_Done(); // Wait Start condition completedWriteI2C(ctrl); // Write Control+Write to EEPROM & Check BF flagwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done(); // Clear SSPIF flagWriteI2C(addr); // Write Address to EEPROMwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done();while (length!=0) // Check write completed ?{WriteI2C(*dptr); // Write data to EEPROMwhile(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROMI2C_Done();dptr++; // Point to next bytelength--;}StopI2C(); // Stop conditionI2C_Done(); // Wait the Stop condition completed}//***********************************************//* EEPROM Acknowledge Polling *//* -- The routine will polling the ACK *//* response from EEPROM *//* -- ACK=0 return *//* -- ACK=1 send Restart & loop check *//***********************************************void EEPROM_ACK(unsigned char ctrl){unsigned char i;IdleI2C(); // ensure module is idleStartI2C(); // Start conditionI2C_Done(); // Wait Start condition completedWriteI2C(ctrl); // Write Control to EEPROM (WRITE)I2C_Done(); // Clear SSPIF flagwhile (SSPCON2bits.ACKSTAT) // test for Acknowledge from EEPROM{for (i=0;i<100;i++); // Delay for next Repet-StartRestartI2C(); // initiate Repet-Start conditionI2C_Done(); // Wait Repet-Start condition completedWriteI2C(ctrl); // Write Control to EEPROM (WRITE)I2C_Done(); // Clear SSPIF flag}StopI2C(); // send STOP conditionI2C_Done(); // wait until stop condition is over}//*********************************************** //* Random Read a Byte from EEPROM *//* - ctrl : Control Byte of EEPROM (Write) *//* (Ctrl +1 ) : Read Command *//* - addr : Address Byte of EEPROM *//* - Return : Read Data from EEPROM *//*********************************************** unsigned char EEPROM_Read(unsigned char ctrl,unsigned char addr){unsigned char f;IdleI2C(); // ensure module is idleStartI2C(); // Start conditionI2C_Done(); // Wait Start condition completedWriteI2C(ctrl); // Write Control to EEPROM while(SSPCON2bits.ACKSTAT); // test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagWriteI2C(addr); // Write Address to EEPROM while(SSPCON2bits.ACKSTAT); // test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagRestartI2C(); // initiate Restart conditionI2C_Done();WriteI2C(ctrl+1); // Write Control to EEPROMwhile(SSPCON2bits.ACKSTAT); // test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagf=ReadI2C(); // Enable I2C Receiver & wait BF=1 until received dataI2C_Done(); // Clear SSPIF flagNotAckI2C(); // Genarate Non_Acknowledge to EEPROMI2C_Done();StopI2C(); // send STOP conditionI2C_Done(); // wait until stop condition is overreturn(f); // Return Data from EEPROM}//***********************************************//* Sequential Read from EEPROM//*//* - ctrl : Control Byte of EEPROM//* - addr : Location of EEPROM//* - length : Read counter//* - *dptr : Store EEPROM data to RAM//*//***********************************************void EE_SEQU_Read(unsigned char ctrl,unsigned char addr,unsigned char length,unsigned char *dptr){IdleI2C(); // ensure module is idleStartI2C(); // Start conditionI2C_Done(); // Wait Start condition completedWriteI2C(ctrl); // Write Control to EEPROMwhile(SSPCON2bits.ACKSTAT); // test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagWriteI2C(addr); // Write Address to EEPROMwhile(SSPCON2bits.ACKSTAT); // test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagRestartI2C(); // initiate Restart conditionI2C_Done();WriteI2C(ctrl+1); // Write Control to EEPROMwhile(SSPCON2bits.ACKSTAT); // Test for ACK condition, if receivedI2C_Done(); // Clear SSPIF flagwhile (length!=0){*dptr=ReadI2C(); // Enable I2C Receiver & Store EEPROM data to Point bufferI2C_Done();dptr++;length--;if (length==0) NotAckI2C();else AckI2C(); // Continue read next data, send a acknowledge to EEPROMI2C_Done();}StopI2C(); // send STOP conditionI2C_Done(); // wait until stop condition is over}//***********************************************//* Check I2C action that is completed *//***********************************************void I2C_Done(void){while (!PIR1bits.SSPIF); // Completed the action when the SSPIF is Hi.PIR1bits.SSPIF=0; // Clear SSPIF}//************************************************ //* Initial I2C Master Mode with 7 bits Address *//* Clock Speed : 100KHz @4MHz *//************************************************void Initialize_I2C_Master(void){OpenI2C(MASTER,SLEW_ON);SSPADD= 9;}。

I2C24LC02C读写例程(PIC单片机)

I2C24LC02C读写例程(PIC单片机)

I2C24LC02C读写例程(PIC单片机)I2C 24LC02 C读写例程(PIC单片机)[单片机]发布时间:2008-04-22 10:11:001 I2C总线特点I2C总线最主要的优点是其简单性和有效性。

由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。

总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。

I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。

一个主控能够控制信号的传输和时钟频率。

当然,在任何时间点上只能有一个主控。

2 I2C总线工作原理I2C总线上的数据稳定规则,SCL为高电平时SDA上的数据保持稳定,SCL为低电平时允许SDA变化。

如果SCL处于高电平时,SDA 上产生下降沿,则认为是起始位,SDA上的上升沿认为是停止位。

通信速率分为常规模式(时钟频率100kHz)和快速模式(时钟频率400kHz)。

同一总线上可以连接多个带有I2C接口的器件,每个器件都有一个唯一的地址,既可以是单接收的器件,也可以是能够接收发送的器件。

每次数据传输都是以一个起始位开始,而以停止位结束。

传输的字节数没有限制。

最高有效位将首先被传输,接收方收到第8位数据后会发出应答位。

数据传输通常分为两种:主设备发送从设备接收和从设备发送主设备接收。

这两种模式都需要主机发送起始位和停止位,应答位由接收方产生。

从设备地址一般是1或2个字节,用于区分连接在同一I2C上的不同器件。

I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。

开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC 发出特定的低电平脉冲,表示已收到数据。

pic单片机16F877与spi接口的eeprom读写C程序

pic单片机16F877与spi接口的eeprom读写C程序
TRISC5=0;
TRISC4=1;
SSPCON=0b00100000;
INTCON=0x00;
SSPSTAT=0b11000000;
ADCON1=0b00000110;
TRISA1=0;
}
//*----spi comuncation
void spi_com(unsigned char x)
{
SSPBUF=x;
TRISD=0b00110000;
unsigned char d=4,one,ten,hund,thou;
unsigned char seg8[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
0x07,0x7F,0x67};//显示比划代码
one=x%10;
ten=x/10%10;
while(SSPIF==0);
SSPIF=0;
}
//-----------spi enable
void spi_en()
{
RA1=0;
spi_com(0x06);//WREN code
RA1=1;
nop();
}
//send data ========
void send(unsigned char data,unsigned char add)
delay(300);
//for see to delay
RD2=0;//stop display ten
delay(4);
//stop to delay
PORTB=seg8[hund];
//display hund code to PORTB
RD1=1;
//begain to display

PIC16F877 EEPROM读写实验

PIC16F877 EEPROM读写实验

PIC16F877 EEPROM每一个单元的读/写所用时间典型值为:4ms,最大值为8ms。

在烧写每个EEPROM 单元过程中,需要CPU插入等待时间,既可利用中断功能,也可利用软件查询方式来解决。

在此我们利用了软件查询方式,循环检测WR烧写控制位兼烧写完成标志位。

程序如下:;实战《16F877内部EEPROM读/写实验》;本实战的目的是让大家熟悉PIC16F87X内部EEPROM的读/写方法;项目实现的功能:对于地址为00H-3FH的64个EEPROM数据存储单元,分;别将数据0-63依次烧写进去,然后再循环读出,显示在LED数码管上;程序清单如下:;************************************INCLUDE"P16F877.INC"STATUS EQU 3H ;定义状态寄存器地址RP0 EQU 5H ;定义页选位RP0的位地址RP1 EQU 6H ;定义页选位RP1的位地址Z EQU 2H ;定义0状态位的位地址PORTC EQU 7H ;定义RC口数据寄存器地址PORTD EQU 8HTRISC EQU 87H ;定义RC口方向控制寄存器地址TRISD EQU 88HEECON1 EQU 18CH ;定义写控制寄存器1的地址EECON2 EQU 18DH ;定义写控制寄存器2的地址EEDATA EQU 10CH ;定义读/写数据寄存器地址EEADR EQU 10DH ;定义读/写地址寄存器地址RD EQU 0 ;定义读启动控制位位地址WR EQU 1 ;定义写启动控制位位地址WREN EQU 2 ;定义写使能控制位位地址EEPGD EQU 7 ;定义访问目标选择控制位位址F EQU 1 ;定义目标寄存器为RAM的指示符W EQU 0 ;定义目标寄存器为W的指示符ADDR EQU 70H ;定义地址变量DATA1 EQU 71H ;定义数据变量;*************************************ORG 0000H ;NOP ;放置一条ICD必须的空操作指令GOTO MAIN ;ORG 0008H ;MAINBCF STATUS,RP1 ;选体1为当前体BSF STATUS,RP0 ;MOVLW 00H ;设定RC全部为输出MOVWF TRISC ;BSF STATUS,RP1 ;体3为当前体CLRF ADDR ;地址变量清0CLRF DATA1 ;数据变量清0WRITEBSF STATUS,RP1 ;选定体3BTFSC EECON1,WR ;上一次写操作是否完成GOTO $-1 ;否!返回继续检测BCF STATUS,RP0 ;选定体2MOVF ADDR,W ;取地址MOVWF EEADR ;送地址寄存器MOVF DATA1,W ;取数据MOVWF EEDATA ;送数据寄存器BSF STATUS,RP0 ;选定体3BCF EECON1,EEPGD ;选定EEPROM为访问对向BSF EECON1,WREN ;开放写操作使能控制MOVLW 55H ;MOVWF EECON2 ;送55H到寄存器EECON2(读写内部EEPROM,这句是固定的) MOVLW 0AAH ;MOVWF EECON2 ;送AAH到寄存器EECON2(读写内部EEPROM,这句是固定的) BSF EECON1,WR ;启动写操作BCF EECON1,WREN ;禁止写操作发生INCF DATA1,F ;数据递增INCF ADDR,F ;地址递增MOVF ADDR,W ;XORLW D'64' ;将当前地址与64比较BTFSS STATUS,Z ;检测=64否GOTO WRITE ;否!继续写后面单元READ1DECF ADDR,F ;地址递减BCF STATUS,RP0 ;选体2为当前体BSF STATUS,RP1 ;MOVF ADDR,W ;取地址MOVWF EEADR ;送地址寄存器BSF STATUS,RP0 ;选体3为当前体BCF EECON1,EEPGD ;选定EEPROM为访问对象BSF EECON1,RD ;启动读操作BCF STATUS,RP0 ;体2为当前体MOVF EEDATA,W ;取数据BCF STATUS,RP1 ;体0为当前体MOVWF PORTC ;送显LEDCALL DELAY ;调用廷时子程序MOVF ADDR,F ;检测当前地址BTFSS STATUS,Z ;是否为0?是!跳一步GOTO READ1 ;否!返回继续读出和显示READ2INCF ADDR,F ;地址递增BCF STATUS,RP0 ;选体2为当前体BSF STATUS,RP1 ;MOVF ADDR,W ;取地址MOVWF EEADR ;送地址寄存器BSF STATUS,RP0 ;选体3为当前体BCF EECON1,EEPGD ;选定EEPROM为访问对象BSF EECON1,RD ;启动读操作BCF STATUS,RP0 ;体2为当前体MOVF EEDATA,W ;取数据BCF STATUS,RP1 ;体0为当前体CALL LED_SHOW ;送数码管显示CALL DELAY ;调用廷时子程序MOVF ADDR,W ;检测当前地址与64比较XORLW D'64' ;BTFSS STATUS,Z ;是否等于64GOTO READ2 ;否!返回继续读出和显示GOTO READ1 ;返回大循环起点;******************************************DELAYMOVLW 0 ;MOVWF 72H ;将外层循环参数值256送外层循环寄存器DELAY1MOVLW 0 ;将内层循环参数值256送内层循环寄存器MOVWF 73H ;DECFSZ 73H,1 ;递减廷时程序GOTO $-1 ;DECFSZ 72H,1 ;GOTO DELAY1 ;RETURN;==========================================================; 2位LED共阳数码管显示模块; 入口: 待显示的数据在W中;----------------------------------------------------------LCD1 EQU 20H ;定义显示缓存单元LCD2 EQU 21HW_TEMP EQU 22H ;保护单元STATUS_TEMP EQU 23HCOUNT0 EQU 24HCOUNT1 EQU 25HCOUNT2 EQU 26HLED_SHOW; MOVLW 7FH ;;;;;;;MOVWF LCD1 ;现场保护,将W的内容暂存于LCD1MOVWF W_TEMP ;现场保护[W-->W_TEMP]SWAPF STATUS,W ;用SWAPF才不会影响标志位[W与STATUS高低4位交换] MOVWF STATUS_TEMP ;将W和STATUS存入各保护寄存器[STATUS-->STATUS_TEMP]BCF STATUS,RP1 ;选体1为当前体BSF STATUS,RP0 ;MOVLW 00HMOVWF TRISD ;设RD为输出口BCF STATUS,RP0 ;恢复体0; MOVWF LCD1 ;W-->LCD1MOVF LCD1,W ;LCD1-->WANDLW B'11110000' ;0FH与W相"与"后送WMOVWF LCD2 ;W-->FSWAPF LCD2 ;F高低4位互换MOVF LCD2,WCALL CONVERT ;绎码MOVWF PORTCMOVLW 02HMOVWF PORTD ;开LCD十位CALL DELAY2 ;延时MOVLW 0HMOVWF PORTD ;关LCD个位MOVF LCD1,W ;F-->WANDLW B'00001111' ;0FH与W相"与"后送WCALL CONVERT ;绎码MOVWF PORTCMOVLW 01HMOVWF PORTD ;开LCD个位CALL DELAY2 ;延时MOVLW 0HMOVWF PORTD ;关LCD个位SWAPF STATUS_TEMP,W ;恢复中断前STATUS,W的值MOVWF STATUSSWAPF W_TEMP,F ;W_TEMP高低4位互换SWAPF W_TEMP,W ;(用SWAPF才不会影响STATUS的值)RETURN ;子程序返回;==========================================================;-------------------- 共阳顺序7段数码管段码 --------------- CONVERT ;取数码管段码ADDWF PCL,1 ;地址偏移量加当前PC值TABLE RETLW 0C0H ;0RETLW 0F9H ;1 RETLW 0A4H ;2RETLW 0B0H ;3RETLW 99H ;4RETLW 92H ;5RETLW 82H ;6RETLW 0F8H ;7RETLW 80H ;8RETLW 90H ;9RETLW 88H ;ARETLW 83H ;bRETLW 0C6H ;cRETLW 0A1H ;dRETLW 86H ;ERETLW 8EH ;F; RETLW 7FH ;. 小数点RETLW 00H ;结束符;---------------------------------------------------------- ;--------------------------- 廷时子程序 ----------------- DELAY2MOVLW .2 ;设置延时常数 [.2--即为2] MOVWF COUNT0L1MOVLW .50 ;MOVWF COUNT1L2MOVLW .100 ;MOVWF COUNT2L3DECFSZ COUNT2,1 ;递减循环GOTO L3 ;DECFSZ COUNT1,1 ;GOTO L2 ;DECFSZ COUNT0,1 ;GOTO L1 ;RETLW 0;========================================================== END。

eeprom读写程序

eeprom读写程序
#include "EEPROM.h&PROM_Read(unsigned int uiAddress)
{
while(EECR & (1 << EEWE));
EEAR= uiAddress;
EECR |= (1 << EERE);
return EEDR;
DataTemp=DataTemp%100000;
ReadData[1]=DataTemp/10000;
DataTemp=DataTemp%10000;
ReadData[2]=DataTemp/1000;
DataTemp=DataTemp%1000;
ReadData[3]=DataTemp/100;
{
unsigned long TR_APDU_Buffer[6];
unsigned char i;
unsigned long TestCoun=0;
TR_APDU_Buffer[0]=EEPROM_Read2(AddrH,0x0C);
TR_APDU_Buffer[1]=EEPROM_Read2(AddrH,0x0D);
EEPROM_Write(EEPAdr+0x10+ ReadData[3]*11,ReadData[4]);
EEPROM_Write(EEPAdr+0x10+ ReadData[4]+1+ReadData[3]*11,ReadData[5]);
}
unsigned long ReadTestCounter(unsigned char AddrH)
void EEPROM_Write(unsigned int uiAddress, unsigned char ucData)

PIC单片机的EEPROM读写实例及说明

PIC单片机的EEPROM读写实例及说明

PIC单片机的EEPROM读写实例及说明; PIC 单片机的EEPROM 读写实例及说明;****************************************************************************; This is a program to test the function of readingwritting for EEPROM.; You can observe the value of register(30H--?) buy changing “VALU” and “WRC_”.; Notice that:it must be { ADDR+WRC_=0ffh } !;****************************************************************************include “p16f877.inc”ADDR EQU 20H ;写入地址寄存器VALU EQU21H ;写入值REC_ EQU 22H ;读计数WRC_ EQU 24H ;写计数org 0goto mainmainbcf STATUS,RP1bcf STATUS,RP0 ;bank0movlw 10hmovwf ADDR ;写入EEPROM 初始值movlw 90hmovwf VALU ;初始写入值movlw 30hmovwf FSR ;间址,读出值初始存放地址movlw 0Fhmovwf WRC_ ;写入次数movwf REC_;incf REC_ ;读出次数wri_ ;写子程序bsf STATUS,RP1bsf STATUS,RP0 ;bank3btfsc EECON1,WRgoto $-1bcf STATUS,RP0bcf STATUS,RP1 ;bank0movf ADDR,Wbsf STATUS,RP1 ;bank2movwf EEADRbcf STATUS,RP1 ;bank0movf VALU,Wbsf STATUS,RP1 ;bank2movwf EEDATAbsf STATUS,RP0 ;bank3bcf EECON1,EEPGD ;to data memorybsf EECON1,WRENbcf INTCON,GIEmovlw 55hmovwf EECON2movlw 0aahmovwf EECON2bsf EECON1,WRbcf STATUS,RP0bcf STATUS,RP1 ;bank0incf ADDR,1decf VALU,1decfsz WRC_ ;all write,to read_goto wri_read_ ;读子程序bcf STATUS,RP1bcf STATUS,RP0 ;bank0decf ADDR ;next valuebsf STATUS,RP1 ;bank2movwf EEADRbsf STATUS,RP0 ;bank3EEwr.asm 程序说明:1、本程序是对PIC16F877 单片机的EEPROM 数据区进行读写的演示程序;。

dsPIC30F6014内部EEPROM读写C程序设计及其应用

dsPIC30F6014内部EEPROM读写C程序设计及其应用
用于读写 EEPROM 存储器的 4 个特殊功能寄存器 SFR(Special Function Register)是:
· NVMCON · NVMADR · NVMADRU · NVMKEY NVMCON 寄存器控制要擦除的块,要烧写的存储 器类型以及烧写周期的起始时刻。 NVMADR 寄存器用于保持有效地址的低两位,捕 捉执行过的末尾表指令的EA[15:0]位并选择要写的行。 N V M A D R U 寄存器用于保持有效地址的高两位, 捕捉执行过的末尾表指令的 EA[23:16]位。 NVMKEY 寄存器是只写寄存器,用于写保护。在 开始写或者擦除操作时,用户必须连续的写 0x55 和 0 x A A 到 N V M K E Y 寄存器。 dsPIC30F6014 内部 EEPROM 存储器允许读写单个 字或者含有 1 6 个字的块, 寄存器 N V M A D R 和 N V M A D R U 用于访问 EEPROM 的地址,指令 T B L R D L 和 T B L W T L 用于对 E E P R O M 的读写。在相应的 EEPROM 存储器位置做擦除操作后必须执行写保护, 写保护通常需要 2ms 时间来完成。在对 EEPROM 进行 擦除操作时,用户不能同时对 EEPROM 进行读和写。
利用 M i c r o c h i p 公司 C 3 0 编译器提供的
NVMCONbits.WR = 1; // 设定寄存器 NVMCON
_EEDATA(N) 来装载数据,其中 N 为对齐字节,其具
的 W R 位,开始擦除
体定义如下:
while (NVMCONbits.WR == 1); // 检测寄存器
96 电子产品世界 2005.11

DESIGN FIELD
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PIC单片机片内EEPROM的读写程序
因为也是摸索着学习PIC单片机,当要用到EEPROM存储部分系统参数,看单片机手册上的资料,觉得还是比较麻烦,然后还是不太会,然后就想找找看网上有没有现成的PIC单片机的片内EEPROM的读写程序,然后都没有找到想要的,而且对汇编语言的也不知道,所以搜索了下最后终于发现PICC编译器里面其实对内部的EEPROM的读写有头文件,可以直接来用,方法如下:
PICC的安装目录下C:\Program Files\HI-TECH Software\PICC\9.81\include(这是我的电脑里目录)里面有一个eeprom_routines.h的文件这个就是关于EEPROM 中的读写程序,具体程序如下:
// This header file should not be included directly
// Inclusion of this file is provided indirectly by including htc.h
/******************************************************************** ***/
/****** EEPROM memory read/write macros and function definitions *******/
/******************************************************************** ***/
/* NOTE WELL:
The macro EEPROM_READ() is NOT safe to use immediately after any
write to EEPROM, as it does NOT wait for WR to clear. This is by
design, to allow minimal code size if a sequence of reads is
desired. To guarantee uncorrupted writes, use the function
eeprom_read() or insert
while(WR)continue;
before calling EEPROM_READ().
*/
#if EEPROM_SIZE > 0
#ifdef __FLASHTYPE
// macro versions of EEPROM write and read
#define EEPROM_WRITE(addr, value) \
do{ \
while(WR)continue;EEADRL=(addr);EEDATA=(value); \
EECON1&=0x3F;CARRY=0;if(GIE)CARRY=1;GIE=0; \
WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \
if(CARRY)GIE=1; \
}while(0)
#define EEPROM_READ(addr)
((EEADRL=(addr)),(EECON1&=0x3F),(RD=1),EEDATA)
#else // else doesn't write flash
#define EEPROM_WRITE(addr, value) \
do{ \
while(WR)continue;EEADRL=(addr);EEDATA=(value); \
CARRY=0;if(GIE)CARRY=1;GIE=0; \
WREN=1;EECON2=0x55;EECON2=0xAA;WR=1;WREN=0; \
if(CARRY)GIE=1; \
}while(0)
#define EEPROM_READ(addr) ((EEADRL=(addr)),(RD=1),EEDATA) #endif
/* library function versions */
extern void eeprom_write(unsigned char addr, unsigned char value); extern unsigned char eeprom_read(unsigned char addr);
#endif // end EEPROM routines
看到这里就知道了。

然后在程序中用的时候可以直接调用:
EEPROM_WRITE(addr, value);写(地址,值)
EEPROM_READ(addr);读(地址)
也可以参考这个来自己写程序。

相关文档
最新文档