All pastes #994400 Raw Edit

Someone

public c v1 · immutable
#994400 ·published 2008-04-23 11:45 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 P3void 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++);}