钻石会员
主题
回帖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;}
}
} |
评分
-
查看全部评分
|