新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ATMEGA16驅動內部EEPROM程序

        ATMEGA16驅動內部EEPROM程序

        作者: 時間:2016-11-30 來源:網絡 收藏
        // 8MHZ晶體在ATMEGA16上運行

        // 顯示效果:顯示按鍵設定數字
        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        #pragmadata:code
        const uchar table[]="I LIKE AVR !";
        const uchar table1[]="WWW*FUMANCHE*COM";
        const uchar table_num[]="01234567890";

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

        void delay(uint ms)//延時
        {
        uint i,j;
        for(i=0;i {
        for(j=0;j<1142;j++);
        }
        }
        void write_com(uchar com) //寫指令
        {
        PORTD&=~BIT(4);
        PORTD&=~BIT(5);
        PORTC=com;
        PORTD|=BIT(6);
        delay(1);
        PORTD&=~BIT(6);
        }

        void write_dat(uchar dat) //寫數據
        {
        PORTD|=BIT(4);
        PORTD&=~BIT(5);
        PORTC=dat;
        PORTD|=BIT(6);
        delay(1);
        PORTD&=~BIT(6);
        }

        /*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);
        *p_buff++ = 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 ++;
        EECR |= (1 << EEMWE);
        EECR |= (1 << EEWE);
        }
        }

        void main()
        {

        uchar i;
        uchar bai,shi,ge,temp;
        DDRB = 0xf0; //PB口低四位設為輸入
        PORTB = 0x0f; //PB口低四位上拉電阻使能
        DDRC=0XFF; //液晶端口設定為輸出
        DDRD|=BIT(4)|BIT(5)|BIT(6);

        delay(250); //加入延時,避免影響干擾下一句
        PORTD&=~BIT(6);

        write_com(0X38); //液晶初始化
        delay(5);
        write_com(0X01); //顯示清屏
        delay(5);
        write_com(0X0C); //開顯示
        delay(5);
        // write_com(0X0F); //顯示光標并閃爍
        // delay(5);
        delay(250); //啟動延時
        eprom_read(0x10, 0x01, &temp);//讀出記錄

        while(1)
        {
        if(PINB==0x0e) //PB0按鍵檢測
        {
        delay(250); //啟動延時
        eprom_read(0x10, 0x01, &temp);//讀出記錄
        temp++; //刷新記錄
        eprom_write(0x10, 0x01, &temp);//寫入記錄
        }
        while(PINB==0x0e); //當按鍵始終按下時等待

        if(PINB==0x0d) //PB1按鍵檢測
        {
        delay(250); //啟動延時
        eprom_read(0x10, 0x01, &temp);//讀出記錄
        temp--; //刷新記錄
        eprom_write(0x10, 0x01, &temp);//寫入記錄
        }
        while(PINB==0x0d);


        delay(5);
        ge=temp%10;
        shi=temp%100/10;
        bai=temp/100;
        write_com(0X80+0X06);//數據起始指針設置--重新設置為這個地址開始存放數據
        write_dat(table_num[bai]);
        delay(5);
        write_dat(table_num[shi]);
        delay(5);
        write_dat(table_num[ge]);
        delay(5);

        write_com(0X80+0X40);//數據起始指針設置
        delay(5);
        for(i=0;i<16;i++) //循環13次顯示內容
        {
        write_dat(table1[i]);
        delay(5);
        }
        /*
        for(i=0;i<16;i++) //循環16次從LCD屏幕左邊一直顯示到右邊
        {
        write_com(0X1c);
        delay(500);
        }
        */

        }
        }
        //本程序通過驗證,運行穩定!!



        關鍵詞: ATMEGA16EEPRO

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 岱山县| 凤台县| 洛阳市| 得荣县| 宜良县| 阳朔县| 通化市| 谷城县| 松桃| 昌江| 车致| 鄯善县| 黑河市| 德惠市| 磐安县| 霍林郭勒市| 舒城县| 安图县| 昭苏县| 昌宁县| 南川市| 南平市| 崇仁县| 准格尔旗| 碌曲县| 宜昌市| 南涧| 金门县| 彰化市| 沅江市| 新乐市| 保康县| 兴海县| 吴桥县| 万年县| 东阳市| 永嘉县| 扶沟县| 莱州市| 寻乌县| 金山区|