娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年01月17日(星期五)

正在發生

2018年01月17日 | 24LCxx讀寫EEPROM的實例(C語言)

發布者:真誠相伴 來源: eefocus關鍵字:24LCxx  讀寫EEPROM 手機看文章 掃描二維碼
隨時隨地手機看文章

//************************************************************************ 
//* 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 */ 

#include  
#include    // Load I2C Header file from defult direct 
#include  
#include "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=0x1000 
const 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_RAM 
near 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 Function 
 TRISAbits.TRISA4=1;  // Set SW2 for input 
 TRISEbits.TRISE1=1;  // Set SW6 for Input  
 Initialize_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 = 0x0008 

void isr_high_direct(void)  
{          
_asm      //begin in-line assembly 
goto 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_high 

void isr_high(void) 

 PIR1bits.TMR2IF=0;     // Clear Timer2 interrupt Flag 
  
 if (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 bit 
  IPR1bits.TMR2IP=1;   // Set Timer2 for High Priority 
  INTCONbits.GIEH=1;   // Enable High Priority Interrupt 

  OpenTimer2 (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 idle 
 StartI2C();      // Start condition 
 I2C_Done();      // Wait Start condition completed and clear SSPIF flag     

 WriteI2C(ctrl);     // Write Control+Write to EEPROM & Check BF flag 
 while(SSPCON2bits.ACKSTAT);  // wait until received the AcknowLEDge from EEPROM 
 I2C_Done();      // Clear SSPIF flag 

 WriteI2C(addr);     // Write Address to EEPROM 
 while(SSPCON2bits.ACKSTAT);  // wait until received the Acknowledge from EEPROM 
 I2C_Done(); 

 WriteI2C(data);     // Write Data to EEPROM 
 while(SSPCON2bits.ACKSTAT);  // wait until received the Acknowledge from EEPROM 
 I2C_Done(); 

 StopI2C();      // Stop condition 
 I2C_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 idle 
 StartI2C();      // Start condition 
 I2C_Done();      // Wait Start condition completed 
  
 WriteI2C(ctrl);     // Write Control+Write to EEPROM & Check BF flag 
 while(SSPCON2bits.ACKSTAT);  // wait until received the Acknowledge from EEPROM 
 I2C_Done();      // Clear SSPIF flag 

 WriteI2C(addr);     // Write Address to EEPROM 
 while(SSPCON2bits.ACKSTAT);  // wait until received the Acknowledge from EEPROM 
 I2C_Done(); 

 while (length!=0)    // Check write completed ? 
 { 
  WriteI2C(*dptr);   // Write data to EEPROM 
  while(SSPCON2bits.ACKSTAT); // wait until received the Acknowledge from EEPROM 
  I2C_Done();  
  dptr++;      // Point to next byte 
  length--; 
 } 
  
 StopI2C();      // Stop condition 
 I2C_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 idle 
 StartI2C();      // Start condition 
 I2C_Done();      // Wait Start condition completed 

 WriteI2C(ctrl);     // Write Control to EEPROM (WRITE) 
 I2C_Done();      // Clear SSPIF flag 

 while (SSPCON2bits.ACKSTAT)  // test for Acknowledge from EEPROM 

  for (i=0;i<100;i++);  // Delay for next Repet-Start 

 RestartI2C();  // initiate Repet-Start condition 
  I2C_Done();    // Wait Repet-Start condition completed 

  WriteI2C(ctrl);    // Write Control to EEPROM (WRITE) 
  I2C_Done();      // Clear SSPIF flag 

 StopI2C(); // send STOP condition 
 I2C_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 idle 
 StartI2C();      // Start condition 
 I2C_Done();      // Wait Start condition completed 

 WriteI2C(ctrl);     // Write Control to EEPROM 
while(SSPCON2bits.ACKSTAT);  // test for ACK condition, if received 
 I2C_Done();      // Clear SSPIF flag 

 WriteI2C(addr);     // Write Address to EEPROM 
while(SSPCON2bits.ACKSTAT);  // test for ACK condition, if received 
 I2C_Done();      // Clear SSPIF flag 

 RestartI2C();   // initiate Restart condition 
 I2C_Done(); 

 WriteI2C(ctrl+1);    // Write Control to EEPROM 
 while(SSPCON2bits.ACKSTAT);  // test for ACK condition, if received 
 I2C_Done();      // Clear SSPIF flag 

 f=ReadI2C();     // Enable I2C Receiver & wait BF=1 until received data 
 I2C_Done();      // Clear SSPIF flag 

 NotAckI2C();     // Genarate Non_Acknowledge to EEPROM 
 I2C_Done();  

StopI2C();  // send STOP condition 
 I2C_Done();      // wait until stop condition is over 

 return(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 idle 
 StartI2C();      // Start condition 
 I2C_Done();      // Wait Start condition completed 

 WriteI2C(ctrl);     // Write Control to EEPROM 
while(SSPCON2bits.ACKSTAT);  // test for ACK condition, if received 
 I2C_Done();      // Clear SSPIF flag 

 WriteI2C(addr);     // Write Address to EEPROM 
while(SSPCON2bits.ACKSTAT);  // test for ACK condition, if received 
 I2C_Done();      // Clear SSPIF flag 

 RestartI2C();   // initiate Restart condition 
 I2C_Done(); 

 WriteI2C(ctrl+1);    // Write Control to EEPROM 
 while(SSPCON2bits.ACKSTAT);  // Test for ACK condition, if received 
 I2C_Done();      // Clear SSPIF flag 

 while (length!=0) 
 { 
  *dptr=ReadI2C();   // Enable I2C Receiver & Store EEPROM data to Point buffer 
  I2C_Done();  
  dptr++;  
  length--; 
     
  if (length==0) NotAckI2C(); 
  else AckI2C();    // Continue read next data, send a acknowledge to EEPROM 
   
  I2C_Done(); 
 } 

StopI2C();  // send STOP condition 
 I2C_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; 
}


關鍵字:24LCxx  讀寫EEPROM 引用地址:24LCxx讀寫EEPROM的實例(C語言)

上一篇:128X64帶中文字庫的液晶模塊應用與程序
下一篇:51單片機W77E58的存儲器訪問

推薦閱讀

  近日,在由斯坦福大學發起的機器閱讀理解領域頂級賽事SQuAD中,阿里巴巴憑借82.440的精準率,超越了人類82.304的成績。下面就隨網絡通信小編一起來了解一下相關內容吧。  據了解,SQuAD比賽構建了一個大規模機器閱讀理解數據集,其中包含10萬個問題,文章來源于500多篇維基百科文章。比賽旨在通過梳理出這套試題的線索,看機器學習模型是否能夠經過...
根據國外媒體報道,最近微軟又有一項專利被曝光,通過這項專利來看很有可能未來對旗下的Surface Dial配件進行重大升級,升級之后,這款原本作為繪圖輔助工具的配件甚至可以取代傳統鼠標,成為必不可少的輸入設備。Windows Latest最新發現的這項專利名為“外設用戶界面設備”,它描述了與當前Surface Dial的一些相似功能,比如旋轉操作的方式,但這項專...
聽覺是人類各種感覺中的相當重要的一種,也是最基本的一種。隨著人們生活水平的不斷提高,便攜式的電子設備不斷發展,越來越多的人追求生活的高品質,也隨之對娛樂設備的音頻輸出有了更高的期許。基于 ADI ADAU1452 音視頻高保真方案,本方案提供 4 路高性能 Analog In & Out,一路S/PDIFF In & Out,兩路 I2S In & Out,兩路 DSD In,...
前言前面我說過STM32的定時器功能很強大,今天就來總結一下它的另外一個“強大”功能:TIM的比較輸出功能,輸出可調PWM波形。直接調用函數接口“TIM2_CH1_PWM(uint32_t Freq, uint16_t Dutycycle)”傳入頻率和占空比就能輸出指定的波形。我提供的軟件工程直接調用是比較簡單就能實現想要的PWM波形。但是,如果你是學習者,建議還是進去函數把每一個細節...

史海拾趣

問答坊 | AI 解惑

還有一個:簡易數字顯示聲音信號采集測量儀(需討論)

預測題:簡易數字顯示聲音信號采集測量儀(地方題) 一、 任務 設計并制作一個簡易數字顯示聲音信號采集測量儀,示意圖如圖1所示。 圖1 簡易數字顯示聲音信號采集測量儀示意圖 二、要求 1、 基本要求 (1) 聲級測量 a、測 ...…

查看全部問答∨

基本電能質量測量方法和常見問題原因

雖然我們享受著固態技術的發展所帶來的巨大好處,但在實際上,處于這一技術核心地位的微電子技術卻依賴著清潔電能。更快的速度和更低的電壓,意味著對電能質量有著更高的要求。  電能質量(PQ)涉及面較廣,從像電壓突降、驟升、中斷以及瞬變這樣的 ...…

查看全部問答∨

請問誰有MQ-3酒精傳感器的資料啊???

我現在在制作酒精測試儀,用的是MQ-3酒精傳感器,其用處是:將MQ-3采集到的數據進過AD轉換后,通過單片機處理,最后在LCD上顯示。      我不知道酒精濃度與電壓的對應關系是怎么樣,沒有數據手冊。各位大師,誰用過的告訴一下 ...…

查看全部問答∨

怎樣把接收數據存到數據庫中

我想把串口接收到的數據存到數據庫中,要怎么實現啊?大家幫幫忙。。。。多謝 我已經試了在一個文件里定義一個變量,然后把值賦給變量,但是值傳不出去…

查看全部問答∨

救命啦,中文亂碼怎么解決啊?~

用。NET 開發的程序在WINCE5.1上中文顯示的全是方框,有沒有遇到過啊,怎么解決啊。…

查看全部問答∨

有人用workbench 2.4 嗎?

是不是tornado太落后了。…

查看全部問答∨

F449的UART0的重大問題!!!!

P2DIR |= BIT0+BIT1+BIT2+BIT6; 用以上程序語句初始化P2DIR后,UART0居然不能工作了!!!! 沒有以上的程序語句就可以。 實在不明白這是為什么!!!!???? 難道這BUG???不知道大家有沒有遇到過,我測試過N次了,才找到這個問題!! ...…

查看全部問答∨

通訊接收

請教各位,我用基于MODBUS協議實現單片機和pc機通訊,單片機中斷接收,查詢發送,以下是我的中斷程序,我的想法是先接收完所有的數據再進行處理(包括地址判斷,讀寄存器等然后再發送),這樣的話我接收的數據就定下來了,比如程序中只接受8個字節 ...…

查看全部問答∨

如何用verilog寫一句等待按鍵釋放語句?

如何用verilog寫一句等待按鍵釋放語句?…

查看全部問答∨

誰有 索思達SSD-DM642 視頻開發板例程資源????

現在正在索思達SSD-DM642 視頻開發板上進行開發,但是開發板的資料沒有。 請問大家誰有這個開發板的資料,就是板子上幾個簡單的視頻例程就可以了。 能不能發給我一份,謝謝大家了 我的郵箱:383487353@qq.com 再次感謝。…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 庐江县| 囊谦县| 会泽县| 海盐县| 博客| 綦江县| 华坪县| 屯门区| 左云县| 宁晋县| 宁德市| 黎城县| 武胜县| 鹤山市| 永城市| 安新县| 蓬安县| 新巴尔虎右旗| 沁水县| 雅安市| 博乐市| 莒南县| 巩留县| 怀化市| 蒙城县| 出国| 洛南县| 万全县| 宾阳县| 陇南市| 塘沽区| 广元市| 兖州市| 宝清县| 武功县| 安阳县| 家居| 宝兴县| 镇沅| 得荣县| 吉林省|