#include void delay(unsigned int t); void display(unsigned char x); unsigned char i,scan,buffer; unsigned char led_buffer[3]; unsigned char code font[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9之7段顯示器顯示字型內容 sbit PB1 = P3^2; //設定PB1代表P3.2 sbit PB2 = P3^3; //設定PB1代表P3.3 sbit PB3 = P3^4; //設定PB1代表P3.3 void main(void) { led_buffer[0] = font[0]; //3個七段顯示器最初字型設定為0 led_buffer[1] = font[0]; led_buffer[2] = font[0]; TMOD = 0x01; //設定Timer0工作於模式1 TH0 = (65536-1000) / 256; //給予初值, 1ms中斷一次 TL0 = (65536-1000) % 256; TR0 = 1; //啟動計時器 IE = 0x82; //啟動Timer0中斷 scan = 0; while(1) { while(PB1 == 0) //檢查PB1是否為0 { delay(3); //延遲, 判斷是否為彈跳訊號 if (PB1 == 0) //如果PB1仍然為0, 則 { buffer= buffer + 1; //buffer內的值減1,並將它反向送到P2顯示 display(buffer); } while(PB1 == 0); //如果PB1仍然為0, 則停在此行,直到放開 } while(PB2 == 0) //檢查PB2是否為0 { delay(6); if (PB2 == 0) { buffer= buffer + 5; //buffer內的值加5 display(buffer); } while(PB2 == 0); } while(PB3 == 0) //檢查PB3是否為0 { delay(6); if (PB3 == 0) { buffer= buffer + 10; //buffer內的值加10 display(buffer); } while(PB3 == 0); } } } void scan_7seg() interrupt 1 //Timer0中斷程式(中斷向量1) { TH0 = (65536-1000) / 256; //重設一次初值 TL0 = (65536-1000) % 256; P1 = 0xfd + scan; //控制第n位數導通,並將P1.7~P1.4設為1, 控制從第5位數開始顯示 P2 = led_buffer[scan++]; //送出第n位數要顯示之字型資料, 並將位置加1,指到下一個位數 if(scan==3) //判斷是否已掃描3次,如果是則歸0重新掃描 scan=0; } void display(unsigned char x) //此副程式的目的在將數值轉成七段顯示器字型 { unsigned char y; led_buffer[0] = font[x/100]; //將百位數轉成七段顯示器自行送到百位數緩衝區 y = x % 100; //除100取餘數, 保留10位和個位 led_buffer[1] = font[y/10]; //將十位數轉成七段顯示器字型送到十位數緩衝區 led_buffer[2] = font[y%10]; //將個位數轉成七段顯示器字型送到個位數緩衝區 } void delay(unsigned int t) { unsigned int i; while(t--) { i=10000; while(i--); } }