顯示具有 805X原始碼 標籤的文章。 顯示所有文章
顯示具有 805X原始碼 標籤的文章。 顯示所有文章

5/18/2012

UART通訊控制IO程式

再加個碼吧。
剛剛那一篇發表的是程式庫,這一篇發表的是頭文件和應用程式。

理論上來說啦,我比較想用UART中斷來做,但如果用了中斷,就沒有辦法使用stdio.h的函數。所以只好用輪詢的方式,
再沒有更好的選擇之前,我也只能將就著用著了。

基於我個人的美感,這個程式有個問題。

我不知道該怎麼清除畫面,當在輸入第二次的時候,在終端機顯示的時候,並不會跳到第一行第一列,而是往下增加。
這不是很嚴重的BUG,只是我個人的美感不能接受而已。
不過,話說回來了……
不過就是MCU的程式,在終端機監控部份的UI這麼在意做什麼?
……
我還是不太能接受……

timerAPI.h
 /************************************************************************************************/
/*
本程式依照創用CC規範,也就是說,愛怎麼用就怎麼用,就算拿去賺錢,只要別讓我知道就好。
設計者:Ethan
設計日期:2012/5/5
程式功能:使用計時器,做出一個週期為兩秒的方波
*/

#ifndef   __timerAPI_H__
#define   __timerAPI_H__


//程式功能:內部計時,TR啟動,
//DelayX1msTimer1Mode0 == Timer1,Mode0 1ms延遲產生程式;
extern void DelayX1msTimer0Mode0(unsigned int count);

//程式功能:內部計時,TR啟動,
//DelayX1msTimer0Mode0 == Timer0,mode0 1ms延遲產生程式;
extern void DelayX1msTimer0Mode1(unsigned int count);

//程式功能:內部計時,TR啟動,
//DelayX1msTimer0Mode0 == Timer0,mode0 1ms延遲產生程式;
extern void DelayX1msTimer1Mode1(unsigned int count);

//程式功能:內部計時,TR啟動,
//DelayX1msTimer1Mode0 == Timer1,Mode1 1ms延遲產生程式;
extern void DelayX1msTimer1Mode0(unsigned int count);

//程式功能:內部計時,TR啟動,溢位自動載入
//DelayX1msTimer2      == Timer0,mode0 1ms延遲產生程式;
//8052專屬程式,當需要使用這個函數的時候,請記得加上
//『#define AT8052』這一行指令

#ifdef AT8052
extern void DelayX1msTimer2(unsigned int count);
#endif

#endif 

 main.c
 /************************************************************************************************/
#include
#include
#include
#include"timer\timerAPI.h"
//#include"time\DelayX1msTimer0Mode1.c"

//char uart_data;

extern void Timer2InterupUART(void);
//extern void DelayX1msTimer0Mode1(unsigned int count);

void main (void){
    char input;
    char *c_input;
    char page2;
//    TMOD = 0x01;   
    Timer2InterupUART();
    P1 =0x00;

       TI=1;
    printf("\n");
       printf("*******Welcome*******\n");
       printf("Select function:\n");
    printf("a. port0 on \n");
    printf("b. port1 on \n");
    printf("c. port3 on \n");
    printf("d. next page \n");

       scanf("%c",&input);     
    printf("\n",input);


       printf("*******Power cycle*******\n");   
    printf("a. port0 on 100ms , off 5s \n");

       scanf("%c",&page2);     
    printf("\n",page2);
   
    //scanf("%s",&c_input);
    //printf("\n %s",page2);

   
   while(RI==0){
        switch(input){
        case 'a':
            //11111110
            //P1=0xFE;
            //00000001
            P1=0x01;
            break;
        case 'b':
            //11111101
            //P1=0xFD;
            //00000010
            P1=0x02;
            break;
        case 'c':
            //11110111
            //P1_3=0xF7;
            //00001000
            P1=0x08;
            break;
        }
        switch(page2){
        case 'a':
            P1=0x01;
            DelayX1msTimer0Mode1(5000);
            P1=0x00;
            DelayX1msTimer0Mode1(50000);
            break;
        }

  
   } // endless
 
}

8052延遲程式Library

以下是我最近對8052在計時器上的研究程式。
基本上就只是延遲1ms的程式,因為裡頭有個迴圈,可以透過函數傳值(傳遞數值)的方式去指定需要多少延遲時間。
假設DelayX1msTimer2(1000)為例子,傳入的值是”1000”的時候,代表這個函數要延遲一秒鐘。

請不要說這個程式有錯,因為沒有main()主程式。因為這是函式庫的程式
看到『extern 』這個字了沒?

或多或少也得公開一點原始碼,省得有人說我『這個人不過就是個找不到答案想要免費解答,結果得到STFW安慰獎就開始爆走的人而以,的確不專業和不敬業』
 這是什麼鳥話?這是中文嗎?連標點符號都沒有。


#include
#include "timerAPI.h"
#define AT8052

/*

本程式依照創用CC規範,也就是說,愛怎麼用就怎麼用,就算拿去賺錢我,只要別讓我知道就好。

設計者:Ethan

設計日期:2012/5/5

程式功能:內部計時,TR啟動,
DelayX1msTimer1Mode0 == Timer1,Mode0 1ms延遲產生程式;
DelayX1msTimer1Mode0 == Timer1,Mode1 1ms延遲產生程式;
DelayX1msTimer0Mode0 == Timer0,mode0 1ms延遲產生程式;
DelayX1msTimer0Mode0 == Timer0,mode0 1ms延遲產生程式;
DelayX1msTimer2      == Timer0,mode0 1ms延遲產生程式;
*/

//Timer 2,內部計數,溢位重新載入,TR啟動,計時1ms副程式
//Count=延遲時間
//Count=1000,延遲一秒
//Count=10000,延遲十秒
//僅限在8052上使用

#ifdef AT8052

extern void DelayX1msTimer2(unsigned int count){

      RCAP2H=TH2=(65536-1000)/256;  //設定TIMER2重新載入時間
      RCAP2L=TL2=(65536-1000)%256;
    //因為使用Timer2,會自動重新載入設定
    while(count){
        TR2=1;
        while(TF2 ==0);
        TF2=0;
        count--;  
    }
    TR2=0;
}

#endif


//Timer 1,Mode 0 ,內部計數,TR啟動,計時1ms副程式
//Count=延遲時間
//Count=1000,延遲一秒
//Count=10000,延遲十秒
extern void DelayX1msTimer1Mode0(unsigned int count){
    //13位元計數,所以是2^13=8192
    //TLx=(計數位元數-計數次數)%256
    //THx=(計數位元數-計數次數)/256
     TL1=(8192-1000)%32;
    TH1=(8192-1000)/32;
    TR1=1;//Timer 0啟動
    while (count)
    {
        //TF,計數溢位旗標,數到了就會變為0
        while(TF1==0);
        //重新設定Timer 0
        TL1=(8192-1000)%32;
        TH1=(8192-1000)/32;
        TF1=0;
        count--;
    }
     TR1=0;//Timer 0關閉
 }


//Timer 0,Mode 0 ,內部計數,TR啟動,計時1ms副程式
//Count=延遲時間
//Count=1000,延遲一秒
//Count=10000,延遲十秒
extern void DelayX1msTimer0Mode0(unsigned int count){
    //13位元計數,所以是2^13=8192
    //TLx=(計數位元數-計數次數)%256
    //THx=(計數位元數-計數次數)/256
     TL0=(8192-1000)%32;
    TH0=(8192-1000)/32;
    TR0=1;//Timer 0啟動
    while (count)
    {
        //TF,計數溢位旗標,數到了就會變為0
        while(TF0==0);
        //重新設定Timer 0
        TL0=(8192-1000)%32;
        TH0=(8192-1000)/32;
        TF0=0;
        count--;
    }
     TR0=0;//Timer 0關閉
 }

//Timer 0,Mode 1 ,內部計數,TR啟動,計時1ms副程式
//Count=延遲時間
//Count=1000,延遲一秒
//Count=10000,延遲十秒
extern void DelayX1msTimer0Mode1(unsigned int count){
    //16位元計數,所以是2^16=65535
    //TLx=(計數位元數-計數次數)%256
    //THx=(計數位元數-計數次數)/256
     TL0=(65536-1000)%256;
    TH0=(65536-1000)/256;
    TR0=1;//Timer 0啟動
    while (count)
    {
        //TF,計數溢位旗標,數到了就會變為0
        while(TF0==0);
        //重新設定Timer 0
        TL0=(65536-1000)%256;
        TH0=(65536-1000)/256;
        TF0=0;
        count--;
    }
     TR0=0;//Timer 0關閉
 }

//Timer 1,Mode 1 ,內部計數,TR啟動,計時1ms副程式
//Count=延遲時間
//Count=1000,延遲一秒
//Count=10000,延遲十秒
extern void DelayX1msTimer1Mode1(unsigned int count){
    //16位元計數,所以是2^16=65535
    //TLx=(計數位元數-計數次數)%256
    //THx=(計數位元數-計數次數)/256
     TL1=(65536-1000)%256;
    TH1=(65536-1000)/256;
    TR1=1;//Timer 0啟動
    while (count)
    {
        //TF,計數溢位旗標,數到了就會變為0
        while(TF1==0);
        //重新設定Timer 0
        TL1=(65536-1000)%256;
        TH1=(65536-1000)/256;
        TF1=0;
        count--;
    }
     TR1=0;//Timer 0關閉
 }


Google
Creative Commons License markscat的異想世界markscat製作,以創用CC 姓名標示-非商業性-相同方式分享 2.5 台灣 授權條款釋出。