新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ATmega128(EEPROM)

        ATmega128(EEPROM)

        作者: 時間:2016-11-10 來源:網絡 收藏
        //atmega128的讀寫EEPROM示例程序,記錄CPU啟動的次數到EEPROM中

        //在LED數碼管上顯示讀出的數據,可用復位鍵刷新顯示
        //編譯環境 AVR Studio 4.17/AVR GCC
        //系統時鐘7.3728MHZ,設置熔絲位為外部高頻石英晶體振蕩,啟動時間4.1ms

        //***********************************************************************
        //包含文件
        //***********************************************************************

        本文引用地址:http://www.104case.com/article/201611/317434.htm

        #include
        #include
        #define F_CPU7372800// 單片機主頻為7.3728MHz,用于延時子程序
        #include
        #include <avr/io.h>
        #include
        #include interrupt.h> //中斷信號頭文件

        //***********************************************************************
        //定義變量區
        //***********************************************************************

        #define Data_IO PORTA //數碼管數據口
        #define Data_DDR DDRA //數碼管數據口方向寄存器
        #define D_LE0 PORTD &= ~(1 << PD4) //數碼管段控制位為0,鎖存端口數據
        #define D_LE1 PORTD |= (1 << PD4) //數碼管段控制位為1,鎖存器輸出與端口一致
        #define W_LE0 PORTD &= ~(1 << PD5) //數碼管位控制位為0
        #define W_LE1 PORTD |= (1 << PD5) //數碼管位控制位為1


        #define delay_us(x) _delay_us(x) //AVR GCC延時函數 x(us)
        #define delay_ms(x) _delay_ms(x) //AVR GCC延時函數 x(ms)

        #define uchar unsigned char
        #define uint unsigned int

        //***********************************************************************
        //共陰數碼管顯示的斷碼表0~F
        //***********************************************************************

        uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
        uint A1,A2,A3; //定義的變量,顯示數據處理

        //***********************************************************************
        //IO端口初始化
        //***********************************************************************

        void system_init()
        {
        Data_IO=0xFF; //數據口為輸出
        Data_DDR=0xFF;

        PORTD=0xFF; //74HC573的控制口,設置為輸出
        DDRD=0xFF;
        PORTB=0XFF;
        DDRB=0XFF;
        }

        //*************************************************************************
        //74HC573控制數碼管動態掃描顯示函數,顯示采集到的溫度
        //*************************************************************************

        void Display_EEPROM(void)
        {
        uchar i,j;
        system_init();
        j=0x01; //此數據用來控制位選
        for(i=0;i<5;i++) //用后3位數碼管來顯示
        {
        D_LE1;
        W_LE1;
        Data_IO=~j;
        W_LE0;
        j=(j<<1);
        Data_IO=0x00;
        D_LE0;
        delay_ms(1);
        }
        D_LE1;
        W_LE1;
        Data_IO=~j;
        W_LE0;
        j=(j<<1);
        Data_IO=table[A1];
        D_LE0;
        delay_ms(1);

        D_LE1;
        W_LE1;
        Data_IO=~j;
        W_LE0;
        j=(j<<1);
        Data_IO=table[A2];
        D_LE0;
        delay_ms(1);

        D_LE1;
        W_LE1;
        Data_IO=~j;
        W_LE0;
        j=(j<<1);
        Data_IO=table[A3];
        D_LE0;
        delay_ms(1);

        D_LE1;
        W_LE1;
        Data_IO=0xff;
        W_LE0;

        }


        //*************************************************************************
        //數據處理函數
        //*************************************************************************
        void data_do(uchar temp_d)
        {
        uint A2t;
        A1=temp_d/100; //分出百,十,和個位
        A2t=temp_d%100;
        A2=A2t/10;
        A3=A2t%10;
        }


        //***********************************************************************
        // EEPROM讀取函數*/
        // addr:地址;number:長度;p_buff:讀出數據存放指針
        //***********************************************************************
        void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {

        while(EECR & (1 << EEWE)); //等待前面的寫完成

        EEARH = 0x00; //寫高字節地址

        while(number --) {
        EEARL = addr ++; //寫地址低字節
        EECR |= (1 << EERE); //讀允許位置1
        *p_buff++ = EEDR; //讀出EEDR中的數據
        }
        }
        //***********************************************************************
        // EEPROM寫入函數
        // addr:地址;number:長度;p_buff:寫入數據存放指針
        //***********************************************************************
        void eprom_write(unsigned int addr, unsigned char number, unsigned char *p_buff) {

        EEARH = 0x00;

        while(number --) {
        while(EECR & (1 << EEWE)); //等待前面的寫完成
        EEARL = addr ++; //寫地址
        EEDR = *p_buff ++; //寫數據到EEDR
        EECR |= (1 << EEMWE); //主機寫入允許位
        EECR&=~(1<EECR |= (1 << EEWE); //EEWE為1,執行寫操作
        }
        }


        //***********************************************************************
        // 主函數
        //***********************************************************************
        int main(void)
        {

        unsigned char temp;
        system_init(); //系統初始化
        eprom_read(0x10, 0x01, &temp);//讀出記錄
        delay_ms(10);
        temp ++; //計數值加1
        eprom_write(0x10, 0x01, &temp);//寫入記錄
        delay_ms(10);

        while (1)
        {
        data_do(temp); //每啟動一次temp加1,記錄到EEPROM中
        Display_EEPROM();//顯示計數值
        }
        }



        關鍵詞: ATmega128EEPRO

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 哈密市| 贵港市| 盐源县| 锦州市| 凤凰县| 京山县| 民勤县| 临清市| 蓝田县| 漯河市| 盐亭县| 元氏县| 漳浦县| 河池市| 衡山县| 洛川县| 彰化市| 阿荣旗| 杭锦旗| 石狮市| 涡阳县| 牙克石市| 同江市| 弋阳县| 土默特左旗| 剑河县| 炎陵县| 灌云县| 井陉县| 大荔县| 濉溪县| 明水县| 清镇市| 双鸭山市| 永年县| 玉山县| 中山市| 鲜城| 双城市| 德阳市| 遵义县|