- #include "stc8g.h"
- // #include <REGX51.H>
- #include <tm1638.h>
-
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
-
- unsigned int num[13]; //各个数码管显示的值
- char num1=0,swan,wan,qian,bai,shi,ge;
- /*
- TIM_1000MS_Flag=1000ms的标志位 ;
- TIM_xz_Flag=修正标志位
- ALM_zd_Flag=整点报时标志位
- TIM_ds1_Flag=定时报警标志位
- ALM_beep_Flag=蜂鸣响标志位
- */
-
- bit TIM_1000MS_Flag,TIM_100MS_Flag,TIM_xz_Flag,TIM_zd_Flag,TIM_ds1_Flag,TIM_ds2_Flag,TIM_ds3_Flag,ALM_beep_Flag;
- u8 k=0,w=0x5f,u=0;
- u16 j=0,z=0,y=0,x,t,s,v=0x28140;
-
- int main(void)
- {
- unsigned char i;
- P5M0 = 0x00;
- P5M1 = 0x00;
- P3M0 = 0x00;
- P3M1 = 0x00;
- time0_init();
- EA=1; //总中断允许
- init_TM1638(); //初始化TM1638
- for(i=0;i<8;i++)
- Write_DATA(i<<1,tab[0]); //初始化寄存器
-
- while(1)
- {
- i=Read_key(); //读按键值 ~~~ 这里 i=(0-7)
- if(i<8)
- {
- if (i==0) //如果S1按下 k:模式切换
- {
- while(Read_key()==i); //等待按键释放
- k++;
- if (k>3) k=0;
- }
- if (i==1) //如果S2按下 小时-
- {
- while(Read_key()==i);
- num[3+3*k]--; //~~~ 数组 num[0]里的数值加
- }
- if (i==2) //如果S3按下 小时+
- {
- while(Read_key()==i);
- num[3+3*k]++; //~~~ 数组 num[0]里的数值加
- }
- if (i==3) //如果S4按下 分钟-
- {
- while(Read_key()==i);
- num[2+3*k]--;
- }
- if (i==4) //如果S5按下 分钟+
- {
- while(Read_key()==i);
- num[2+3*k]++;
- }
- if (i==5) //如果S6按下 秒-
- {
- while(Read_key()==i);
- num[1+3*k]--;
- }
- if (i==6) //如果S7按下 秒+
- {
- while(Read_key()==i);
- num[1+3*k]++;
- }
- if (i==7) //如果S8按下 空置
- {
- while(Read_key()==i);
- }
- }
-
- if ((num[2]==0) &&(num[1]==0)) TIM_zd_Flag=1;
- if (num[3]==num[6] && num[2]==num[5] && num[1]==num[4]) TIM_ds1_Flag=1;
- if (num[3]==num[9] && num[2]==num[8] && num[1]==num[7]) TIM_ds2_Flag=1;
- if (num[3]==num[12] && num[2]==num[11] && num[1]==num[10]) TIM_ds3_Flag=1;
-
- /*整点铃声------------------*/
- if (TIM_zd_Flag==1)
- {
- TIM_zd_Flag=0;
- if (TIM_100MS_Flag == 1) { TIM_100MS_Flag=0; w=w<<1; ALM_beep_Flag=w & 0x80;}
- }
- else {w=0x5f; } //01011111 嘀。嘀嘀嘀
-
- /*定时铃声------------------*/
- if (TIM_ds1_Flag==1 || TIM_ds2_Flag==1 || TIM_ds3_Flag==1)
- {
- if (TIM_100MS_Flag == 1) {
- TIM_100MS_Flag=0; v=v<<1; ALM_beep_Flag=v & 0x8000;
- u++;
- if (u>=30) {u=0;TIM_ds1_Flag=0;TIM_ds2_Flag=0;TIM_ds3_Flag=0;} //u BEEP时间控制 50是5s
- }
- if (v==0) v=0x28140;
- }
- else {v=0x28140; } // 00101000000101000000 嘀。嘀。。。。嘀。嘀。。。。
- if (ALM_beep_Flag) ALM=0; else ALM=1;
-
-
-
- if (num[1+3*k]>=60) {num[1+3*k]=0;num[2+3*k]++;}
- if (num[2+3*k]>=60) {num[2+3*k]=0;num[3+3*k]++;}
- if (num[3+3*k]>=24) {num[3+3*k]=0;}
-
-
- swan=(num[3+3*k]/10)%10; //小时
- wan=num[3+3*k]%10; //小时
- qian=(num[2+3*k]/10)%10; //分钟
- bai=num[2+3*k]%10; //分钟
- shi=(num[1+3*k]/10)%10; //秒
- ge=num[1+3*k]%10; //秒
-
- Write_DATA((7)*2,tab[ge]); //0xCE
- Write_DATA((6)*2,tab[shi]); //0xCC
- Write_DATA((5)*2,tab[bai]); //0xCA
- Write_DATA((4)*2,tab[qian]); //0xC8
- Write_DATA((3)*2,tab[wan]); //0xC6
- Write_DATA((2)*2,tab[swan]); //0xC4
- Write_DATA((0)*2,tab[k]); //0xC0
- // Write_DATA(i*2,tab[num[i]]); // ~~~ 左边是要显示的位置(0-7)显示在1-8位数码管上。
- // Write_DATA((7-num1)*2,tab[num[i]]); // ~~~ 左边是要显示的位置(0-7)显示在1-8位数码管上。右边是要显示的数值
- Write_allLED(led[ge]); // led灯会按跑马灯形式按 ge 的数值往右移
- }
- }
-
- void time0_init(void)
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD = 0x01; //设置定时器模式
- TL0 = 0xCD; //设置定时初始值
- TH0 = 0xD4; //设置定时初始值
- ET0 = 1; //定时器中断控制位
- TR0 = 1; //定时器0开始计时
- }
-
- void time0(void) interrupt 1
- {
- TL0 = 0xCD; //设置定时初始值
- TH0 = 0xD4; //设置定时初始值
- t++;
- j++;
-
- if (j>=1000) {j=0;num[1]++; z++;} //1S到计时+1
- if (z>=520) {z=0; if (num[1]>0) num[1]--; } //时间修正
-
- if (t>=100){t=0;TIM_100MS_Flag=1;}
- if (num[1]>=60) {num[1]=0;num[2]++;}
- if (num[2]>=60) {num[2]=0;num[3]++;}
- if (num[3]>=24) {num[3]=0;}
- swan=(num[3+3*k]/10)%10; //小时
- wan=num[3+3*k]%10; //小时
- qian=(num[2+3*k]/10)%10; //分钟
- bai=num[2+3*k]%10; //分钟
- shi=(num[1+3*k]/10)%10; //秒
- ge=num[1+3*k]%10; //秒
- }
-
-
-
复制代码 程序使用定时器产生1ms中断给时钟计时,分别设了整点报时和几个闹铃。
|