钻石会员 
 
主题
回帖0
积分11561
阅读权限50
注册时间2008-12-31
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
原理图在这里:https://www.yleee.com.cn/thread-16289-1-1.html 
用的32768,太慢了没敢求模求余,还是有点闪。 
程序比较乱,凑合看下吧,哈哈 
 
//32768时钟 
// 
#define uchar unsigned char 
#define uint  unsigned int 
/* 
led 
  a_ 
f|  |b 
 |g_| 
e|  |c 
 |__| 
  d .h 
*/ 
const uchar table[]={ 0x3f,0x0a,0x57,0x4f,0x6a,0x6d,0x7d,0x0b,0x7f,0x6f,0X00}; 
const uchar table2[]={ 0xBf,0x8a,0xD7,0xCf,0xEa,0xEd,0xFd,0x8b,0xFf,0xEf,0X00}; 
//带点 
uchar delay1,time_miao,miaobz; 
uchar ID; 
uint gjbz; 
bit shibz,dpbz,xsbz; 
bit rb4bz,rb5bz,rb6bz,rb3bz; //off-on,set,up,down. 
void disp(uchar num1,uchar num2,uchar num3,uchar num4); 
void delay(uint x) 
{ 
uchar a; 
for(a=x;a>0;a--); 
} 
void init() 
{ 
    //配置模拟/数字IO口(手册P178) 
    ANSEL=0B00001010;  //AN1   AN3,4 
    TRISA=0B00001010;  //AN1    端口A 配置0为输出,1为3态 
    TRISD=0B00000000;   //设置端口D   为输出 
    PORTD=0B00000000;   //端口D  输出0 
    TRISB=0B01111000;  //B3-B6 键盘 设置为输入 
    PORTB=0B01111001;   //B3-B6键盘设置高电平,位码b0设置为高电平 
    TRISC=0B00000000;   //C6-C7 位码1,2 
    PORTC=0B11000000;   //位码1,2设置为高电平 
 
    TRISE=0B00000000; 
    PORTE=0B00000000;   //位码1,2设置为高电平 
//ADCON0=0B10100101;        // 
//ADCON0=0B10100101;        // 
//VCFG1_bit=1; 
//delay(10);               //稳定ADC电源 
//ADCON1=0B00010000; 
//RA3_bit=1;               //使能基准电压 
} 
//=================================== 
void timr0int() 
{ 
     GIE_bit=1;                  //开启全局中断 
    // OSCCON=0X03;              //开启内部上拉,预分频比1/16 
     OPTION_REG=0B00000011;     //开启内部上拉,预分频比1/16 
     T0IF_bit=0;                //清中断标志 
     T0IE_bit=1;                //允许TMR0中断 
} 
//======================================= 
//KEY 
//======================================= 
void key() 
{ 
///////off_on 
if(rb4bz==0) 
{ 
if(RB4_bit==0) //off_on 
  { 
  RC5_bit=1;//ON_BUZZ 
  rb4bz=1; 
  xsbz=~xsbz; 
  RC5_bit=0;//OFF_BUZZ 
  } 
 } 
else if(RB4_bit==1)  rb4bz=0; 
/////////set//////// 
if(rb5bz==0) 
{ 
  if(RB5_bit==0) 
  { rb5bz=1; 
     RC5_bit=1;//ON_BUZZ 
     T0IE_bit=0;                //禁止TMR0中断 
     ID++; 
     RA4_bit=0;   //LED_ON 
     time_miao=0; 
     RC5_bit=0;//OFF_BUZZ 
     if(ID==3)   
     {ID=0; 
     RA4_bit=1;  //LED_OFF 
     T0IE_bit=1;                //允许TMR0中断 
     } 
  } 
} 
else if(RB5_bit==1)   rb5bz=0; 
}//end_key 
//======================================= 
void disp(uchar num1,uchar num2,uchar num3,uchar num4) 
{ 
PORTD=table[num1];//显示第一个数码管 
RC6_bit=0;delay(0); 
RC6_bit=1;PORTD=0x00;//0B00000000; 
if(dpbz==0) PORTD=table[num2];//显示第二个数码管PORTD=table[num2]|0X80 
else if  (dpbz==1) PORTD=table2[num2];//显示第二个数码管 
RE2_bit=0;delay(0);RE2_bit=1;PORTD=0x00;//0B00000000; 
//RC0_bit=0;delay(0);RC0_bit=1;PORTD=0x00;//0B00000000; 
PORTD=table[num3];//显示第三个数码管 
RB0_bit=0;delay(0); 
RB0_bit=1;PORTD=0x00;//0B00000000; 
PORTD=table[num4];//显示第四个数码管 
RC7_bit=0;delay(0); 
RC7_bit=1;PORTD=0x00;//0B00000000; 
} 
void main() 
{ 
signed char ge,shi,bai,qian; 
init(); 
timr0int(); 
RC5_bit=1;//ON_BUZZ 
RC4_bit=1;//关TL431 
RA4_bit=1;  //LED_OFF 
        qian=1; 
        bai=2; 
        shi=0; 
        ge=0; 
        shibz=0; 
        dpbz=0; 
        xsbz=0; 
        rb4bz=0; 
        rb5bz=0; 
        rb6bz=0; 
        rb3bz=0; 
        ID=0; 
        gjbz=0; 
        RB2_bit=0;          //off_ldo 
        miaobz=0; 
    RC5_bit=0;//OFF_BUZZ 
while(1) 
{ 
key(); 
if(time_miao==60)//1分到  60一分 
{time_miao=0; 
ge++;                //加分个位 
if(ge==10)        //进位 
{ 
ge=0;                //清个位 
shi++;                //加十位 
if(shi==6)         //一小时到 
{shi=0;shibz=1;}        //shibz标志,再去算小时, 
} 
} 
if(shibz==1)        //一小时到 
{bai++;                //加小时个位 
shibz=0;        //清小时标志 
if(bai==10)//十小时到 
             {qian++;        //加小时十位 
             bai=0;                //清小时个位 
             } 
if((bai==4)&(qian==2)) {qian=0;bai=0;};        //清小时十位 
} 
if(xsbz==0)   
{disp(qian,bai,shi,ge); 
 gjbz++; 
 if(gjbz==5000)      //大约30秒自动关机 
 {xsbz=1; gjbz=0;} 
} 
else if(xsbz==1)  PORTD=0xff;   //关显示 
//=================================== 
if(ID==1) 
{////////////up/////////// RB6 
if(rb6bz==0) 
{if(RB6_bit==0) 
  {rb6bz=1; 
  bai++;//jia xiao shi 
  if(bai==10)//十小时到 
             {qian++;        //加小时十位 
             bai=0;                //清小时个位 
             } 
if((bai==4)&(qian==2))      //==24=0 
   {qian=0;      //清小时十位 
   bai=0; 
   } 
  } 
} 
else if(RB6_bit==1)  rb6bz=0; 
if(rb3bz==0)    //  DOWN_RB3 
{if(RB3_bit==0) 
  {rb3bz=1; 
  bai--;//jian xiao shi 
    if((bai<0)&(qian>0))// 
    {qian--;        // 
    bai=9;          // 
     } 
     if((qian==0)&(bai<0)) 
     {qian=2;        // 
     bai=3;          // 
    } 
  } 
} 
else if(RB3_bit==1)  rb3bz=0; 
} 
if(ID==2) 
{if(rb6bz==0)  //up 
   {  if(RB6_bit==0) 
     { 
     rb6bz=1; 
     ge++;    //jia _ge 
     if(ge==10)        //进位 
      { 
      ge=0;                //清个位 
      shi++;                //加十位 
      if(shi==6)   shi=0; 
      } 
     } 
  } 
  if(RB6_bit==1)  rb6bz=0; 
if(rb3bz==0)      //down 
   {  if(RB3_bit==0) 
     { 
     uchar gebz; 
     rb3bz=1; 
     ge--;      //jian_ge 
     gebz=ge+1; 
     if(gebz==0)        //进位 
      { 
      ge=9;                //清个位 
      shi--;                //加十位 
      if(shi<0)   shi=5; 
      } 
     } 
   } 
else if(RB3_bit==1)  rb3bz=0; 
} 
}//while 
}//main end 
void interrupt() 
{ 
if(T0IE_bit && T0IF_bit) 
{ 
T0IF_bit=0;      //清除中断标志位 
//CLRWDT();      // 
if(miaobz==0) dpbz=0; 
miaobz++; 
//RC4_bit=~RC4_bit; 
if(miaobz==2) 
{time_miao++; 
dpbz=1; 
miaobz=0;} 
} 
} |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |