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