|
1黑幣
本人已經(jīng)將代碼寫了一部分了,能夠?qū)⒌谝粋按鈕控制第一第二個數(shù)碼管的計時,希望有大佬能夠把第二個按鈕控制第三第四個數(shù)碼管的計時完善一下。
謝謝幫忙了!
代碼如下
- #include <STC89C5xRC.H>
- #include <intrins.H>
- /*分頻*/
- #define u8 unsigned char
- #define u16 unsigned int
- #define cpu_f 12000000
- #define machine_cycle 6 //如使用RC/RD單片機(jī)的雙倍速模式則需要改成6
- static unsigned char time_count=0;
- unsigned char code dm[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
- unsigned char T0RH=0,TORL=0;//初始化高低位值存放變量
- bit time_le=1;
- //時鐘周期=晶振/12(6)
- void configTime0(u16 ms,u8 *T0H,u8 *TOL);
- void smg_watch(unsigned char wx,dx);
- void delay_ms(unsigned int count_ms);
- unsigned char key(void (*call_key)());
- void stop_begin(void);
- void stop_begin2(void);
- /*1s翻轉(zhuǎn)*/
- void main(void)
- {
- P1=0XFF;
- configTime0(50,&T0RH,&TORL); //定時器初始化,
- while(1)
- {
- smg_watch(0,time_count/10);
- smg_watch(1,time_count%10);
- key(stop_begin2);
- }
- }
- void stop_begin(void)
- {
- static unsigned char mode=1;
- mode=!mode;
- if(mode)
- TR0=1;
- else
- TR0=0;
- }
- void stop_begin2(void)
- {
- static unsigned char mode2=1;
- mode2=!mode2;
- if(mode2)
- time_le=1;
- else
- time_le=0;
- }
- unsigned char key(void (*call_key)())
- {
- if(!P30)//做下降沿檢測
- {
- delay_ms(20);//延時消抖
- if(!P30)//做下降沿檢測
- {
- while(!P30);//做松手檢測
- call_key(); //任務(wù)
- return 1;
- }
- else
- return 0;
- }
- else
- return 0;
- }
- /*******************************************************************************
- 函數(shù)功能:
- * @ 定時器0初始化
- 參數(shù)描述:
- * @ ms 初始化時間
- 返回值描述:
- * @ 無
- 說明:
- * @
- *******************************************************************************/
- void configTime0(u16 ms,u8 *T0H,u8 *TOL)
- {
- unsigned long temp;//0~4,294,967,296(32字節(jié)一般的時鐘都用這個變量算)
- /*加載初值*/
- temp=cpu_f/machine_cycle;//該宏定義在timer.c(52RC/RD具備6T雙倍速模式,如果為提高程序運行效率可更改宏定義)
- temp=(temp*ms)/1000; //調(diào)用函數(shù)變量ms要轉(zhuǎn)換成秒
- temp=65536-temp;
- temp=temp+1;//中斷在準(zhǔn)備中斷時會使用一些機(jī)器周期去保存變量,造成響應(yīng)延遲,這里嘗試抵消延遲
-
- /*數(shù)據(jù)結(jié)算*/
- *T0H=(u8)(temp>>8);//變量類型強(qiáng)制轉(zhuǎn)換 //ff
- *TOL=(u8)temp; //f5
-
- /*清空T0控制位,將T0配置成模式1*/
- TMOD &=0XF0;
- TMOD |=0X01; //置位 0000 0001
-
- /*賦初值*/
- TH0=*T0H;//初負(fù)載值(高) 8位寄存器
- TL0=*TOL;//(低)
- /*初始化T0*/
- TF0=0;//清空溢出標(biāo)志位
- ET0=1;//使能T0中斷
- TR0=1;//啟動T0
- EA=1;//開啟總中斷
- }
- void smg_watch(unsigned char wx,dx)
- {
- /*關(guān)閉段選*/
- P26=1;
- P0=0Xff;/*清空位選*/
- P27=1;//打開位選 =
- P0=_crol_(0XFE,wx);//進(jìn)行位選
-
- /*關(guān)閉位選*/
- P27=0;
- P0=0X00;/*清空段選*/
- P26=1;//打開段選
- P0= dm[dx];//輸入段選信號
- delay_ms(1);//留顯
-
- }
- void delay_ms(unsigned int count_ms)
- {
- unsigned int count=0;
- unsigned char i, j;
- for(count=0;count<count_ms;count++)
- {
- _nop_();
- _nop_();
- i = 2;
- j = 15;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- void Interrupt_timer0(void) interrupt 1 //主要模式為計數(shù)
- {
- static unsigned char jishu=0;
- TH0=T0RH;//初負(fù)載值(高)
- TL0=TORL;//(低)
- /*計時*/
- if(time_le)
- jishu++;
- if((jishu==20))//1s后
- {
- time_count++;
- if(time_count==61)
- time_count=0;
- jishu=0;
- }
- }
復(fù)制代碼
|
|