国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 5817|回復: 9
打印 上一主題 下一主題

系統定時簡易封裝

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2009-6-24 22:14:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關鍵詞: 封裝 , 系統
裸奔的時候,
因為在一個子任務當中,
為提高效率,不能傻等,
需要系統定時的情況很多,
處理起來比較麻煩,
如果對系統定時器進行簡單的封裝,
就會比較方便,

下面的就是我寫的一個用系統定時器封裝后處理閃爍燈的例子:

main.h:

#ifndef _MAIN_H
#define _MAIN_H

#include

#define MAX_SYSTIMER_COUNT 6
extern unsigned short sysTimer[MAX_SYSTIMER_COUNT];


unsigned char SetSysTimer(unsigned char id,unsigned short value);
unsigned char GetSysTimer(unsigned char id);

#endif


main.c:

#include "main.h"
#include "led.h"

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & CP & CPD & BOREN & IESODIS & FCMEN & LVPDIS & DEBUGEN & WP0 & BORV21 );

unsigned char t0InitValue;


unsigned short sysTimer[MAX_SYSTIMER_COUNT];


////////////初始化timer0//////////////////////
void InitTimer0(void)
{

    OPTION = 0x06;                    //1:128分頻
   
    //8M 時鐘,10ms定時
    t0InitValue = 256-(20000/128);    /*256-100=156us,定時10ms = 20000 step/128 = 156.25*/
    TMR0 = t0InitValue;
   
    T0IF = 0;
    T0IE = 1;                        //開中斷
}

////////////////初始化系統定時/////////////////////////////////
void InitSysTimer(void)
{
    unsigned char i;
    for(i = 0; i < MAX_SYSTIMER_COUNT; i++)
    {
        sysTimer[i] = 0;
    }   
}

//////////////////////系統定時器計數/////////////////////////////
void CountSysTimer(void)
{
    unsigned char i;
    for(i = 0; i < MAX_SYSTIMER_COUNT; i++)
    {
        if(sysTimer[i] > 0)
            sysTimer[i]--;
    }   
}

////////////////////設置系統定時器/////////////////////////////////////////
unsigned char SetSysTimer(unsigned char id,unsigned short value)
{
    if(id < MAX_SYSTIMER_COUNT)
    {
        sysTimer[id] = value;
        return 1;
    }
    else
        return 0;   
}

/////////////////////獲取系統定時狀態////////////////////////////////////////
unsigned char GetSysTimer(unsigned char id)
{
    if(sysTimer[id] == 0)
        return 1;
    else
        return 0;
}                    

/////////////////系統初始化/////////////////////   
void InitSys(void)
{
    INTCON = 0;            //關閉總中斷,禁止外設,timer0,外部,電平中斷,清除timer0,外部,電平中斷標志
   
    ANSEL = 0;
    ANSELH = 0;            //所有IO都為數字口

    InitLedFlash();
   
    InitSysTimer();        //初始化系統定時器
    InitTimer0();        //初始化定時器0
    PEIE = 1;            //開外設中斷
    GIE = 1;            //開總中斷
}


///////////中斷函數//////////////
void interrupt ISR(void)
{
    if(T0IE && T0IF)
    {
        CountSysTimer();//系統定時器計數
        TMR0 = t0InitValue;
        T0IF = 0;
    }   
}


//////////////////主函數///////////////////////   
void main()
{
    OSCCON = 0x78;//時鐘8M,時鐘模式由配置字決定
    InitSys();   
    while(1)
    {
        FlashLed();
    }        
}


led.c:

#include "main.h"
#include "led.h"

void InitLedFlash(void)
{
    TRISD0 = 0;//輸出
}

void FlashLed()
{
    if(GetSysTimer(0))
    {
        RD0 ^= 1;
        SetSysTimer(0,100);//100*10ms = 1s
    }   
}
沙發
 樓主| 發表于 2009-6-24 22:16:47 | 只看該作者
帶proteus仿真的完整工程:

pic-basic.rar

56.99 KB, 下載積分: 積分 -1

板凳
發表于 2009-6-25 09:40:22 | 只看該作者
呵呵,采用狀態機就是避免死等
地板
 樓主| 發表于 2009-6-25 10:03:14 | 只看該作者
實際上狀態機的叫法過于玄乎,
就是一種任務分割而已,
就是把任務分割稱若干斷不可再分割的代碼段,
根據條件執行這些代碼段.

實際上這種封裝帶來的好處是不死等延時處理的方便,
而不是代替任務分割這種方法.
地下室
發表于 2009-7-7 12:27:33 | 只看該作者
呵呵,寫得不錯,如果用Bool變量作為布爾型值來處理,更省內存.
6
 樓主| 發表于 2009-7-7 13:36:04 | 只看該作者
呵呵,
我覺得這種封裝真的很好用啊.

我寫的那個" 基于PIC的I2C從動模塊的鍵盤,顯示例子",

鍵盤延時和數碼管顯示閃爍延時用起來很方便.
7
 樓主| 發表于 2009-7-7 13:38:47 | 只看該作者
用位結構的省RAM,
但是多幾行代碼,
運行速度降低了,

這個東西要在定時中斷里面不斷掃描,
還是快一點好
8
 樓主| 發表于 2009-7-7 14:08:15 | 只看該作者
要說改進可以把void CountSysTimer(void)采用宏定義的方法,
省去函數調用,
在定時器中斷里面運行速度快一點.
9
發表于 2009-7-7 20:33:52 | 只看該作者
嗯不錯,我也在一個產品中做了類似的工作
1、把所有的CPU空閑時間收集起來交給一個Idel函數來處理,如果以后要休眠就在這個函數內部做就好了。
2、中斷采取類似DPC調用的方式處理幾個相關的工作
3、建立mini的MessageQuen
10
發表于 2010-7-26 10:23:01 | 只看該作者
太強了
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天堂网在线资源www最新版| CHINESE老阿姨免费视频| 国产亚洲精品看片在线观看 | 午夜激情小视频| 青娱乐国产在线| 色综合区| 香蕉狠狠干| 国产WW久久久久久久久久| 农民下乡在线观看3| 王色视频| 日韩a级片| 无人区乱码1区2区3区免费| 真实国产精品视频国产网| 国产在线观看免费观看不卡| 亚洲 日韩 国产 中文视频| 亚洲一区二区三区国产精品| 污污视频在线免费观看| 午夜国产精品理论片久久影院| xxx日本hd| 午夜理论片日本中文在线| 日本欧美在线播放| 日韩视频www| 亚洲a在线视频| 国产麻豆精品人妻无码A片| 一个人在线观看视频免费| 欧美蜜桃臀在线观看一区| 天天射日日| 一级a毛片免费观看久久精品| 宫交拔不出来了h黑人| 亚洲高清中文字幕免费| 亚洲七七久久综合桃花| 日韩在线天堂| 亚洲狠狠综合久久| 超级碰碰青草久热国产| 青青草A在在观免费线观看| 亚洲综合狠狠| 香蕉三级| 张柏芝xxxhd| 两个女人互添下身高潮自视频| 在线看无码的免费网站| 欧美中文字幕在线播放|