All pastes #994399 Raw Edit

Someone

public text v1 · immutable
#994399 ·published 2008-04-23 11:44 UTC
rendered paste body
//實驗一 鍵盤控制7節顯示器  (0~F)
#include "8052.h"

/*-----------------------------------------------------------------*\
 *  禮拜二實驗一進階題                                             *
 *  先設定 min 在設定 max                                          *
 *  按住 C 每次 +1; 按住 D 每次 -1                                 *
 *  按住 E 一直 +1; 按住 F 一直 -1                                 *
 *  **注意** 要一直在 min ~ max 之間跑                             *
\*-----------------------------------------------------------------*/

/*******************************************/
/* keyboard's infomation                   */
/*******************************************/
code char ser[]={0xfe,0xfd,0xfb,0xf7};
code int key[]={1,2,3,12,4,5,6,13,7,8,9,14,10,0,11,15};
code char keymsg[]={0xee,0xed,0xeb,0xe7,
                    0xde,0xdd,0xdb,0xd7,
                    0xbe,0xbd,0xbb,0xb7,
                    0x7e,0x7d,0x7b,0x77
                   };
/*******************************************/
/* 7-seg 接 Vcc 即是陽極 , 反之則為陰極    */
/*******************************************/
/*code char table[]={0x3f,0x06,0x5b,0x4f,
                   0x66,0x6d,0x7d,0x07,
                   0x7f,0x6f,0x77,0x7c,
                   0xb9,0x5e,0x79,0x71};  //字形,陰極
*/

code char table[]={0xc0,0xf9,0xa4,0xb0,
                   0x99,0x92,0x82,0xf8,
                   0x80,0x90,0x88,0x83,
                   0xc6,0xa1,0x86,0x8e
                  };  //字形,陽極

/*******************************************/
/* delay  -> 延遲輸出                      */
/* getkey -> 從鍵盤掃描出所按之數字        */
/*******************************************/

#define PN0 P1
#define PN1 P3
void delay (int t);
int getkey();
int a = 0, b = 0;
int min=0,max=9;
int set = 0;

void main () {
    int i=0;
    P3=table[0];

    while (1) {
        i = getkey();
        if (set == 1)
            P3 = table[min];
        else if (set == 2)
            P3 = table[max];
        else
            P3 = table[i];
    }
}
int getkey() {
    int i,j,k=-1;
    while (1) {
        for (i=0;i<4;i++) {
            P1=ser[i];
            if (P1!=ser[i]) {
                if (P1==keymsg[i])
                    k=key[i];
                else if (P1==keymsg[i+4])
                    k=key[i+4];
                else if (P1==keymsg[i+8])
                    k=key[i+8];
                else if (P1==keymsg[i+12])
                    k=key[i+12];
            }
            if (k!=-1) break ;
        }

        /*
         * 以下 if 包含了
         * 1.先設定最小值 (set = 0) 與 設定最大值 (set = 1)
         * 2.按 C  -> 往上+1
         * 3.按 D  -> 往下-1
         */

        if ( k!=-1 && k != 14 && k != 15) {
            // 先設定最小值
            if (set == 0)
                min = k;
            // 再按一次按鈕變設定最大值
            if (set == 1)
                max = k;
            // 再按第三個鈕就先算出區間範圍
            if (set == 2)
                b = max - min;
            // 按鍵如果是 C (k == 12) => 往上 +1 ( a += 1 )
            if (k == 12)
                a += 1;
            // 按鍵如果是 C (k == 13) => 往下 -1 ( a += b )
            if (k == 13)
                a += b;
            ++set;
            // 判斷有沒有 overflow 比方說 a -> 11 => a%10=1 修正回來
            a %= (b+1);
            // 除了 E & F 其他按鈕都是 block 的!
            while (1) {
                P1=ser[i];
                if (P1==ser[i]) {
                    if (set == 1 || set == 2)
                        return k;
                    else
                        return (a+min);
                }
            }
        }
        // 按鈕 E 按住就會一直 +1
        if (k == 14) {
            a+=1;
            // delay
            for (i = 0;i<=500;i++)
                for (j = 0;j<=100;j++)
                    ;
        }
        // 按鈕 F 按住就會一直 -1
        if (k == 15) {
            a+=b;
            // delay
            for (i = 0;i<=500;i++)
                for (j = 0;j<=100;j++)
                    ;
        }
        // 一樣是修正 overflow 的問題
        a %= (b+1);
        return (a+min);
    }
}

void delay (int t) {
    int x;
    for (x=0;x<t;x++);
}