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++);
}