VR2YIN 發表於 18-10-2015 20:10:28

再請教!!!

#define uchar unsigned char
#include <reg51.h>
                                        //PT2262發出訊號,PT2274L4接收D0-D3
                                        //D0-D3連接8051 P2.0-P2.3
                                        //收到P2.0 -P2.3的4位組合 P2.4或P2.5輸出=0 / 1       
                                        //P0 控制7劃管出字,P1控制位選,出0亮

sbit P24=P2^4;                //8051 輸出
sbit P25=P2^5;                //8051 輸出
sbit PUL=P2^6;                //頻率
sbit DIR=P2^7;                //方向
sbit EN=P3^7;       
/*******************************共陽LED段碼表*******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};

/*********************************端口定義**********************************/
char dat;                        //接收到的數據
//int Num;                        //步進數                        
/*********************************時間控制**********************************/

/*********************************延時控制**********************************/
void delay(unsigned int count)      /*定義延遲函數*/
{
        unsigned int m,n;
    for(m=0;m<count;m++)
                for(n=0;n<9;n++);
}
/*********************************步數控制**********************************/                           
void Move(void)
{       
        PUL=1;
        delay(5);
        PUL=0;
        delay(5);
}       
void Forward (void)
{
        int i;
        DIR=1;
        for(i=0;i<100;i++)                        //
        Move();                       
}
void Backward (void)
{
        int i;
        DIR=0;
        for(i=0;i<98;i++)                //
        Move();
}

/******************************主程序**************************************/
void main(void)
{
        P1=0x00;                                                //端口初始化
        P0=0x00;                                                //端口初始化
        P2=0xff;                                                     //置輸入狀態
       
while(1)
{
        dat=(P2&0x0f);                                        //00001111       
        if(dat==0x08)                                        //先按A 顯示1 燈亮 通道 開        0000 1000
                {
                               
                        P0=tab;                                        //數碼顯示
                        P1=0xfe;                                        //1111 1110
                        P24=0;                                                 //燈亮       
                                Forward();
                                while (P2&0x08)
                               {
                               }       
                }
       
       if(dat==0x04)                                        //再按B建 顯示2 燈滅通道 關       0000 0100
                {
                        P0=tab;                                        //數碼顯示
                        P1=0xfd;                                         //1111 1101
                        P24=1;                                                //關燈
                                Backward();
                                while (P2&0x04)
                               {
                                }
                }
               
       if(dat==0x02)                                        //按C鍵 顯示3 燈亮 通道 開       0000 0010
                {
                        P0=tab;                                        //數碼顯示
                        P1=0xfb;                                        //1111 1011
                        P25=0;                                        //燈亮
                                Forward();
                                delay(1000);
                                Backward();
                                while(P2&0x02);
                                {
                                }
                               
                                               
                }
        if(dat==0x01)                                        //再按D鍵 顯示4 通道 關             0000 0001               
                {       
                        P0=tab;
                        P1=0xf7;                                        //1111 0111
                        P25=1;                                                //關燈
                                Forward();
                                delay(5000);
                                delay(5000);
                                delay(5000);
                                delay(5000);
                                Backward();
                                while(P2&0x01);
                                {
                                }
      }               
        }
}

VR2YIN 發表於 18-10-2015 20:16:35

在上述程序中,如按3或4鍵,做完往返動作後,想再按鍵再做動作,應該如何改寫呢???
因PT2272 L4是鎖存訊號,試過改用PT2272 M4非鎖存,一,二鍵又再按就做動作,這樣角度又錯了!!!
求教啊!!!

VR2XPO 發表於 18-10-2015 22:14:14

你好, 謝謝你的難題.
你用 PT2272 L4(鎖存訊號), 如按下3鍵時,摩打動作做完時,程式是停在 while(P2&0x02); {   } ,一定要按其他的鍵 才跳得走, 否則再按下3鍵, 摩打是無動作的.
改用PT2272 M4非鎖存, 按鍵後, 摩打動作, 而程式最終是在 while (1)不斷polling .

VR2YIN 發表於 19-10-2015 18:40:09

正想辦法解決中!!!^.^”

VR2XPO 發表於 20-10-2015 13:25:21

有難題也登上,讓大家想辦法 ^_^

philip 發表於 24-2-2016 23:57:20

朋友,你之前相關的帖子有粗略看過因太忙所以沒進一步研究,覺得這類控制目標,可能採用switch case方式去編寫會更簡單及效率高,

philip 發表於 25-2-2016 11:37:49

本帖最後由 philip 於 25-2-2016 13:50 編輯

一、你程序中先define後include,這就像佳餚未上檯先起筷,夾空氣呀?這叫本末倒置。應include行頭define跟後。
二、程序中如太多判斷小段子,建議用switch比較有效。當然不一定要用switch,也可以用else if,條條大路通羅馬,
三、主程序中應盡量避免多於2個while()。

廢話完

你問按c鍵後做完正向轉動然後想再按c鍵沒反應,按c鍵做正向轉動是一直在轉動嗎?
建議在完成動作後跳回stand-by,至於2272鎖存與不鎖存沒所謂,在stand-by中做手腳就可以。

你可以嘗試邀請左先生協助你。

philip 發表於 26-2-2016 12:19:41

本帖最後由 philip 於 26-2-2016 13:16 編輯

朋友,多些使用debug功能,你會發覺如圖片中用switch的優點,壓縮檔rar是gif檔,因論壇不能上傳gif file,請自行解壓。


philip 發表於 26-2-2016 20:57:09

philip 發表於 26-2-2016 12:19
朋友,多些使用debug功能,你會發覺如圖片中用switch的優點,壓縮檔rar是gif檔,因論壇不能上傳gif file, ...

http://ww2.sinaimg.cn/mw1024/8071761cgw1f1d10mkr72g20ci08qzlv.gif

補充gif動畫。

中無論壇真是好失敗,連上傳gif動畫都不可以,這個問題大概1年多前已反映過時至今天還是沒解決。要放到別的地方再貼連接過來,真是費時失事多此一舉。

VR2ZOC 發表於 27-2-2016 07:56:24

本帖最後由 VR2ZOC 於 27-2-2016 07:58 編輯

philip 發表於 26-2-2016 20:57
補充gif動畫。

中無論壇真是好失敗,連上傳gif動畫都不可以,這個問題大概1年多前已反映過時至今天還 ...

完全同意"philip"兄意見,而且仲連表情圖案都無法放上超過好耐一段時間了。
頁: [1] 2
查看完整版本: 再請教!!!