- /*
- 按下S2數碼管數值加1,按下S3數碼管數值減1
- 且長按數字會累加或累減
- 與軟件延時方式去做數碼管動態掃描的區別:
- 軟件延時掃描,當按下按鍵時數碼管只會顯示1位數
- 中斷方式掃描,當按下按鍵時不影響數碼管應顯示的位數
- */
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit we = P2^7; //位定義數碼管位選鎖存器接口
- sbit du = P2^6; //位定義數碼管位選鎖存器接口
- sbit key_s2 = P3^0;//S2按鍵位定義
- sbit key_s3 = P3^1;//S3按鍵位定義
- uchar i;//數碼管顯示位選變量
- uchar num[] = {0, 0, 0, 0}; //百十個位,總數暫存數組
- //數碼管0~9段選表
- uchar code leddata[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
- //數碼管1~3位選表
- uchar code DPY[]={0xfe, 0xfd, 0xfb};
- //毫秒級延時函數
- void delay(uint z)
- {
- uint x,y;
- for(x = z; x > 0; x--)
- for(y = 114; y > 0 ; y--);
- }
- //中斷服務特殊功能寄存器配置
- void init()
- {
-
- TMOD = 0x01; //定時器16為計數工作模式
- TH0 =0xED;
- TL0 =0xFF; //5ms
- ET0 = 1; //開定時器0中斷
- TR0 = 1;//啟動定時器0
- EA = 1; //開總中斷
- }
- void main()
- {
- init();//初始化定時器0
- while(1)
- {
- if(key_s2 == 0)//判斷S2是否按鍵
- {
- delay(5);//軟件延時
- if(key_s2 == 0)
- {
- if(num[3] == 999)num[3]=0;//當等于255時不再加1
- delay(300);//軟件延時
- num[3]++; //加1
- }
- // while(!key_s2); //松手檢測
- }
- if(key_s3 == 0)//判斷S3是否按鍵
- {
- delay(5);//軟件延時
- if(key_s3 == 0)
- {
- if(num[3] != 0) //當等于0時,不再減1
- delay(300);//軟件延時
- num[3]--; //減1
- }
- //while(!key_s3); //松手檢測
- }
- }
- }
- //定時器0中斷服務程序 做數碼管動態掃描,不用軟件延時
- void timer0() interrupt 1
- {
- TH0 =0xED;
- TL0 =0xFF; //5ms 模式1非自動重裝需要手動重裝
- if(i < 3)
- {
- num[0] = num[3] / 100; //計算百位
- num[1] = num[3] % 100 / 10; //計算十位
- num[2] = num[3] % 10;//計算個位
- P0 = 0xff; //清除斷碼
- we = 1;//打開位選
- P0 = DPY[ i]; we = 0; //關閉位選 P0 = 0xff; //清除斷碼 du = 1; //打開段選 P0 = leddata[num[ i]]; du = 0; //關閉段選 i++;//顯示下一位 } else { i = 0; }
- }
復制代碼
|