• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 用Atmega8實現8路鍵盤D觸發鎖存器源程序代碼

    用Atmega8實現8路鍵盤D觸發鎖存器源程序代碼

    作者: 時間:2013-12-11 來源:網絡 收藏

    原文參見:http://avr.eefocus.com/article/10-07/833141280106635.html

    /********************************************************
    實驗四(第二版):用實現的功能
    實現目的:
    1. 管腳設定為輸入時,了解如何可以編程設定上拉電阻。
    2. 如何使用軟件控制取樣頻率及時間,達到一定的抗干擾目的
    3. 為了讓程序運行更穩定,防止跑飛,如何使用看門狗?
    By armok (2004-09-18) a13809260240@126.com
    *************************************************************/

    #include iom8v.h> //本實驗使用
    #include macros.h>

    #define sapleing_way 2 //定義多少路采樣。最大值為8。PB為輸入,PD輸出。
    #define sampling_times 20 //定義取樣的次數,連續次數的取樣值相同,視為有效取樣。
    #define sampling_interval 50 //定義每次取樣的時間間隔,單位 us.
    typedef struct
    { unsigned int v_last; //上一次sampling_times個取樣值的結果
    unsigned int v_current; //當前sampling_times個取樣值的結果
    unsigned int v[sampling_times]; //存放連續sampling_times次的取樣值
    unsigned int v_temp; //存放比較的臨時值,為1時有效,0時無效
    } inputStruct;

    void delay_nus(unsigned int n); //延時函數,單位 us.
    void watchdog_init(void); //初始化watchdog函數
    void port_init(void); //端口初始化函數
    void main(void) //主函數
    {
    unsigned int i;
    unsigned int j;
    inputStruct pb_input[sapleing_way];

    port_init(); //初始化端口
    watchdog_init(); //初始化watchdog

    while (1)
    {
    //以下的for循環,將連續sampling_times次的取樣結果存放在相應的數組里
    for (i=0;isampling_times;i++)
    {
    delay_nus(sampling_interval); //每隔sampling_interval取樣一次
    for(j=0;jsapleing_way;j++)
    {
    pb_input[j].v[i]=PINBBIT(j);
    }
    }
    //以下的for循環,判斷連續sampling_times次的取樣結果是否有效
    for(j=0;jsapleing_way;j++)
    {
    for (i=1;isampling_times;i++)
    {
    if (pb_input[j].v[i-1]==pb_input[j].v[i]) //如果sampling_times次取樣結果均相同,視為有效
    pb_input[j].v_temp=1; //sampling_times次取樣有效的標志
    else //否則舍棄,不作處理。
    {
    pb_input[j].v_temp=0; //sampling_times次取樣無效,不作處理
    break;
    }
    }

    //以下的if判斷PB輸入的電平,與上一次取樣計算結果比較,判斷是否翻轉相應的PD
    if (pb_input[j].v_temp==1) //sampling_times次取樣有效,進行以下判斷
    {
    if (pb_input[j].v[0]==0) //輸入為低電平
    pb_input[j].v_current=0;
    else
    pb_input[j].v_current=1; //輸入為高電平
    if (pb_input[j].v_last==1 pb_input[j].v_current==0)//如果前十個取樣是高電平,現在十個是低電平,視為有效的動作,執行輸出
    PORTD^=BIT(j); //將相應的PD位翻轉
    pb_input[j].v_last=pb_input[j].v_current; //將當前結果傳給上一次結果,準備下一次處理
    }
    } //end for

    WDR(); //看門狗計數清零
    } //end while
    } // end main()
    void delay_nus(unsigned int n)//n微秒延時函數
    {
    unsigned int i;
    for (i=0;in;i++)
    {
    asm("nop");
    }
    }

    void port_init(void)
    {
    DDRB=0x00;//設置PB0-7為輸入
    PORTB=0xFF; //與下一句同時起作用
    SFIOR=~BIT(2); //置SFIOR的PDU上拉電阻有效。與上一句一起生效。
    DDRD=0xFF;//PD0-7為輸出
    }

    void watchdog_init(void)
    {
    WDR(); //看門狗計數清零
    WDTCR=0x0F; //使能watchdog,并且,采用2048K分頻,典型溢出時間5V時2.1S
    }

    上拉電阻相關文章:上拉電阻原理


    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 黎平县| 河北区| 江城| 普兰县| 新蔡县| 镇沅| 喀什市| 常熟市| 巴马| 香港 | 上犹县| 牡丹江市| 余姚市| 房山区| 罗田县| 临漳县| 太和县| 富平县| 永寿县| 河间市| 日照市| 澄迈县| 泽库县| 武山县| 白山市| 山阴县| 来宾市| 来安县| 台州市| 琼海市| 萝北县| 东阿县| 清原| 霍山县| 延津县| 交城县| 洪洞县| 牡丹江市| 沁水县| 乃东县| 晋江市|