芯片:應廣 PMS154C
一個按鍵,一個8位數碼管
1位天/2位小時/2位分鐘/2位秒/1位0.1秒
我發現論壇上關于 應廣單片機 的資料少的可憐,應該是沒多少人用過吧。我發一個我以前寫的8數碼管計時器秒表程序。
因為我直接用的仿真器,所以沒有實物,直接拍的開發板照片。如果有其他的需要,我還可以發發其他的應廣單片機程序。比如,流水燈,數碼管,PWM之類的。
制作出來的實物圖如下:
E5EB53E06628B10E7AE33A9C4E745CFD.jpg (5.12 MB, 下載次數: 84)
下載附件
2021-12-27 16:54 上傳
3514875C2A2D5AB6BC982DF7BF1ACA90.jpg (4.91 MB, 下載次數: 67)
下載附件
2021-12-27 16:54 上傳
單片機源程序如下:
- /*秒表計時顯示程序?1個按鍵、8位數碼管
- 數碼管顯示: 1位天/2位小時/2位分鐘/2位秒/1位0.1秒
- 請用T16計時
- 按鍵按第一次:開始計數顯示
- 按鍵按第二次:暫停計數顯示
- 長按按鍵1秒:定時器清零,并停止計數。*/
- #include "extern.h"
- #define data PB
- #define wei_A PA.6//位
- #define duan_B PA.7//段
- #define key pa.3
- word time,b,n;
- byte duan,wei,keysignal,keysignal2,type;
- byte second_01,second,second_10,minute,minute_10,hour,hour_10,day,hour_24;
- // 0.1s /1s /10s 1分 10分 1小時 /10小時/天/小時
- word reload_T16;
- void weiTable(void)
- {
- _Pcadd
- {
- ret 0xfe;//第一位 1111 1110
- ret 0xfd;//第二位 1111 1101
- ret 0xfb;//3 1111 1011
- ret 0xf7;//4 1111 0111
- ret 0xef;//5 1110 1111
- ret 0xdf;//6 1101 1111
- ret 0xbf;//7 1011 1111
- ret 0x7f;//8 0111 1111
- }
- }
- void duanTable(void)//8位共陰極數碼管 段碼
- {
- _Pcadd
- {
- ret 0x3f;//0 //無小數點
- ret 0x06;//1
- ret 0x5b;//2
- ret 0x4f;//3
- ret 0x66;//4
- ret 0x6d;//5
- ret 0x7d;//6
- ret 0x07;//7
- ret 0x7f;//8
- ret 0x6f;//9
- ret 0xbf;//0 //帶小數點
- ret 0x86;//1
- ret 0xdb;//2
- ret 0xcf;//3
- ret 0xe6;//4
- ret 0xed;//5
- ret 0xfd;//6
- ret 0x87;//7
- ret 0xff;//8
- ret 0xef;//9
-
- }
- }
- void T16_Init(void) //t16中斷
- {
- // $ T16M IHRC,/16,bit10;
- // reload_T16 = 1024-1000; //每次進中斷為1ms;
- //計算公式為 [1/(時鐘源/分頻器)]*(中斷源-reload_T16)=[1/(16M/16)]*(24)=0.001s
- $ T16M IHRC,/16,bit15;
- reload_T16 = 32768-1000; //每次進中斷為1ms;
- // 設定INTEN、INTRQ的初始值
- INTEN.T16 = 1; //開T16中斷
- INTRQ.T16 = 0; //清零INTRQ寄存器。
- ENGINT; //打開全局中斷
- }
- void leddis(void) //查表顯示
- {
-
- data = 0x00; //去重影
- duan_B = 1;
- duan_B = 0;
- A = wei; //取位碼
- weiTable();
- data = A;
- wei_A = 1;
- wei_A = 0;
- A = duan; //取段碼
- duanTable();
- data = A;
- duan_B = 1;
- duan_B = 0;
- }
- void keyscan(void) //按鍵掃描
- {
- if(pa.3==0)
- {
- .delay 10000
-
- if(pa.3==0)
- { if(pa.3==0)
- { while(pa.3==0)
- {
- n++;
- .delay 1000;
- if(n>=1000) //長按1s清零
- { n=0;
- keysignal2=1;
- break;
- }
- }
- keysignal++;
- if(keysignal>2)
- {
- keysignal=1;
- }
- }
- }
- }
- if(keysignal==1) //按鍵1開始
- {
- type=1;
- n=0;
- }
- if(keysignal==2) //按鍵2暫停
- {
- type=0;
- n=0;
- }
- if(keysignal2==1) //長按清零
- { keysignal=2;
- time=0;
- second_01=1; //0.1秒
- second=1; //秒
- second_10=1; //10秒
- minute=1; //分
- minute_10=1; //10分
- hour=1; //小時
- hour_10=1; //10時
- day=1; //天
- hour_24=1; //24小時
- keysignal2=0;
- type=0;
- while(pa.3==0){nop;}
- }
- }
- void FPPA0 (void)
- {
- .ADJUST_IC SYSCLK=IHRC/16, IHRC=16MHz, VDD=5V;
- T16_Init();
- paph=0b1111_1111; //啟用Pa端口的,上拉電阻
- pac=0b1110_0110; //開啟pa.0,pa.3,pa.4輸入功能
- pbc=0xff; //設置Pb口為輸出功能
- pb=0xff; //設置Pb口全部輸出高電平
- time=0;
- wei=8;
- second_01=1; //0.1秒
- second=1; //秒
- second_10=6; //10秒
- minute=10; //分
- minute_10=6; //10分
- hour=4; //小時
- hour_10=3; //10時
- day=9; //天
- hour_24=23; //24小時
- duan=1;
- keysignal=0;
- keysignal2=0;
- n=0;
- type=0;
-
- while (1)
- {
- keyscan();
- }
- }
- void Interrupt (void)//T16
- {
- pushaf;
- if (Intrq.T16)
- { stt16 reload_T16; //設定計數器初始值reload_T16
- if(type==1) //按鍵控制計時啟停
- {
- time++;
- }
- leddis();
- b++;
- if(b>8)
- {b=0;}
- if(time>=100)//0.1s
- { time=0;
- second_01++;
- if(second_01>10) //1s
- { second_01=1;second++; //秒歸零,進10s
- if(second>10)//10s
- { second=1;second_10++; //10秒歸零,進分鐘
- if(second_10>6)//1M
- { second_10=1;minute++; //分鐘歸零,進10分
- if(minute>10)//10m
- { minute=1;minute_10++; //10分歸零,進1h
- if(minute_10>6)//1h
- { minute_10=1;
- hour++;
- hour_24++; //1h歸零,進10h
- if(hour>10)//10h
- { hour=1; hour_10++; //10h>20h
- }
- if(hour_24>=24)//1day //24小時歸零,進天
- { hour_10=1; //10小時清零
- hour_24=1; //24小時清零
- hour=1; //小時清零
- day++; //天加
- if(day>10) //10天清零
- {day=1;second_01=1;}//天歸零
- }
- }
- }
- }
- }
- }
- }
- switch(b)
- {
- case 0:
- duan=second_01; //0.1秒
- wei=8;
- break;
- case 1:
- duan=second+10; //1s
- wei=7;
- break;
- case 2:
- duan=second_10; //10s
- wei=6;
- break;
- case 3:
- duan=minute+10; //分
- wei=5;
- break;
- case 4:
- duan=minute_10; //10分
- wei=4;
- break;
- case 5:
- duan=hour+10; //時
- wei=3;
- break;
- case 6:
- duan=hour_10; //10小時
- wei=2;
- break;
- case 7:
- duan=day+10; //天
- wei=1;
- break;
- default:break;
- }
-
- Intrq.T16 = 0;
- }
- popaf;
- }
復制代碼 以上代碼下載:
T0510 1個按鍵、8位數碼管秒表計時.7z
(13.84 KB, 下載次數: 54)
2021-12-27 16:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|