|
1黑币
本人已经将代码写了一部分了,能够将第一个按钮控制第一第二个数码管的计时,希望有大佬能够把第二个按钮控制第三第四个数码管的计时完善一下。
谢谢帮忙了!
代码如下
- #include <STC89C5xRC.H>
- #include <intrins.H>
- /*分频*/
- #define u8 unsigned char
- #define u16 unsigned int
- #define cpu_f 12000000
- #define machine_cycle 6 //如使用RC/RD单片机的双倍速模式则需要改成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翻转*/
- 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(); //任务
- return 1;
- }
- else
- return 0;
- }
- else
- return 0;
- }
- /*******************************************************************************
- 函数功能:
- * @ 定时器0初始化
- 参数描述:
- * @ ms 初始化时间
- 返回值描述:
- * @ 无
- 说明:
- * @
- *******************************************************************************/
- void configTime0(u16 ms,u8 *T0H,u8 *TOL)
- {
- unsigned long temp;//0~4,294,967,296(32字节一般的时钟都用这个变量算)
- /*加载初值*/
- temp=cpu_f/machine_cycle;//该宏定义在timer.c(52RC/RD具备6T双倍速模式,如果为提高程序运行效率可更改宏定义)
- temp=(temp*ms)/1000; //调用函数变量ms要转换成秒
- temp=65536-temp;
- temp=temp+1;//中断在准备中断时会使用一些机器周期去保存变量,造成响应延迟,这里尝试抵消延迟
-
- /*数据结算*/
- *T0H=(u8)(temp>>8);//变量类型强制转换 //ff
- *TOL=(u8)temp; //f5
-
- /*清空T0控制位,将T0配置成模式1*/
- TMOD &=0XF0;
- TMOD |=0X01; //置位 0000 0001
-
- /*赋初值*/
- TH0=*T0H;//初负载值(高) 8位寄存器
- TL0=*TOL;//(低)
- /*初始化T0*/
- TF0=0;//清空溢出标志位
- ET0=1;//使能T0中断
- TR0=1;//启动T0
- EA=1;//开启总中断
- }
- void smg_watch(unsigned char wx,dx)
- {
- /*关闭段选*/
- P26=1;
- P0=0Xff;/*清空位选*/
- P27=1;//打开位选 =
- P0=_crol_(0XFE,wx);//进行位选
-
- /*关闭位选*/
- 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 //主要模式为计数
- {
- static unsigned char jishu=0;
- TH0=T0RH;//初负载值(高)
- TL0=TORL;//(低)
- /*计时*/
- if(time_le)
- jishu++;
- if((jishu==20))//1s后
- {
- time_count++;
- if(time_count==61)
- time_count=0;
- jishu=0;
- }
- }
复制代码
|
|