新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR學習心得(二)

        AVR學習心得(二)

        作者: 時間:2016-11-10 來源:網絡 收藏
        AVR mega128 I/O控制

        下面是我用C語言寫的第一個實驗:花樣流水燈

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

        功能說明:

        1.有四種顯示方式,沒鍵按下時為默認的第1種方式:循環點亮

        2.當按下K1時,顯示第1種方式:循環點亮;當按下K2時,顯示第2種方式:逐個點亮;當按下K3時,顯示第3種方式:間隔點亮;當按下K4時,顯示第4種方式:循環熄滅。

        實驗中容易出現的問題:

        1.在定義數組時,要區別與51的定義方式:

        51:unsigned charcodearr[ ] = { };

        AVR:#program codeunsigned char arr[ ] = { }; 或constunsigned char arr[ ] = { };

        2.在端口設置時,應該把PORTX放在前面,DDRX放在后面,否則會出現一些初始化時的錯誤。例如:如果端口接的是低電平有效的發光二極管,放反后就會出現短暫的閃爍。

        3.if((key_scan&0xF0)!=0xF0),在這一句中如果沒有括號,程序不能正常運行。所以應注意C語言中符合的優先級和結合方式。

        /************************************************
        文件:main.c
        用途:
        注意:內部8M晶振
        創建:2008.4.23
        修改:2008.4.23
        Copy Right (c) zhaojun
        ************************************************/
        #include
        #include

        // 按鍵端口定義
        #define KEY_DDR DDRD
        #define KEY_PORT PORTD
        #define KEY_PIN PIND
        #define S1 4
        #define S2 5
        #define S3 6
        #define S4 7

        //
        const unsigned char led1[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0xFF};//循環點亮
        const unsigned char led2[]={0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};//逐個點亮
        const unsigned char led3[]={0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0xFF};//間隔點亮
        const unsigned char led4[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};//循環熄滅

        /*============================ 延時部分 ======================================*/

        void delay_1ms(void) //1ms延時函數
        {
        unsigned int i;
        for (i=0;i<1140;i++);
        }

        void delay_nms(unsigned int n) //N ms延時函數
        {
        unsigned int i=0;
        for (i=0;i delay_1ms();
        }
        /*============================ 按鍵部分 ======================================*/

        void key_init(void) //按鍵端口初始化
        {
        KEY_PORT|= (1< KEY_DDR &= (1<}

        unsigned char key_get(void) //按鍵獲取
        {
        unsigned char key_value = 0xFF;
        key_value = KEY_PIN&((1< if(key_value!=((1< {
        delay_nms(2);//延時消抖
        if(KEY_PIN&((1< {
        key_value = KEY_PIN&((1< while((KEY_PIN&((1< //等待按鍵釋放
        }
        }
        return key_value; //返回按鍵值
        }
        /*============================ 流水燈部分 ====================================*/

        unsigned char scan(const unsigned char * led)
        {
        unsigned char i;
        unsigned char key_scan;
        for(i=0;i<16;i++)
        {
        PORTE = led[i]; // 輸入顯示
        delay_nms(300); // 延時
        key_scan=key_get(); // 按鍵掃描
        if((key_scan&0xF0)!=0xF0)// 如果有鍵按下,返回按鍵值
        return key_scan;
        }
        }

        /*============================ 主函數部分 ====================================*/
        void main(void)
        {
        unsigned char key;
        const unsigned char * led_temp;
        PORTE = 0xFF; // 初始化顯示端口
        DDRE = 0xFF;
        key_init(); // 初始化按鍵端口
        led_temp=led1; // 默認方式
        while(1)
        {
        key=scan(led_temp); // 流水燈顯示
        switch(key)
        {
        case((1< case((1< case((1< case((1< default:break;
        }
        }
        }

        /*============================ 程序結束 ======================================*/



        關鍵詞: AVR學習心

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 沁源县| 白朗县| 阿巴嘎旗| 安仁县| 濮阳县| 平原县| 德令哈市| 海阳市| 莱芜市| 高邑县| 榆树市| 松阳县| 高州市| 新兴县| 罗江县| 凭祥市| 宁海县| 佛教| 北票市| 耿马| 师宗县| 无为县| 宁河县| 宝丰县| 阳城县| 沅江市| 北川| 正阳县| 横山县| 重庆市| 丰镇市| 北海市| 元氏县| 长岭县| 仙游县| 原阳县| 郑州市| 惠东县| 铜梁县| 富顺县| 湖南省|