📄 clock.c
字号:
#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>
#define uchar unsigned char
#define unit unsigned int
#define ulong unsigned long
#define xtal 8
#define fosc 8000000 //晶振8MHZ
#define baud 9600 //波特率
#define d10 PORTD&=~0X40
#define d11 PORTD|=0X40
#define d20 PORTD&=~0X80
#define d21 PORTD|=0X80
#define d30 PORTB&=~0X20
#define d31 PORTB|=0X20
#define d40 PORTC&=~0X02
#define d41 PORTC|=0X02
#define d50 PORTC&=~0X04
#define d51 PORTC|=0X04
#define d60 PORTD&=~0X10
#define d61 PORTD|=0X10
#define d70 PORTD&=~0X08
#define d71 PORTD|=0X08
#define d80 PORTB&=~0X10
#define d81 PORTB|=0X10
#define a10 PORTB&=~0X04
#define a11 PORTB|=0X04
#define a20 PORTB&=~0X08
#define a21 PORTB|=0X08
#define a30 PORTC&=~0X01
#define a31 PORTC|=0X01
#define a40 PORTC&=~0X08
#define a41 PORTC|=0X08
#define out0 PORTD&=~0X02
#define out1 PORTD|=0X02
#define be0 PORTB&=~0X40
#define be1 PORTB|=0X80
#define Set ((PINC&0X10)==0x10) //key
#define Add ((PINC&0X20)==0x20)
#define Sub ((PINC&0X40)==0x40)
#define Store ((PINC&0X80)==0x80)
uchar n,ORDER,j;
uchar shu[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar tm[4]={1,2,3,4};
uchar t,i,j,m,s,m1,s1,min,h;
uchar shu1[12]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff};
uchar mm[2]={0xbf,0xbf};
uchar date[9]={1};
unit dat;
uchar lock,dp,ready,start,win=1;
void DAT(uchar x)
{
if((x&0x01)==0x01) d11;else d10;
if((x&0x02)==0x02) d21;else d20;
if((x&0x04)==0x04) d31;else d30;
if((x&0x08)==0x08) d41;else d40;
if((x&0x10)==0x10) d51;else d50;
if((x&0x20)==0x20) d61;else d60;
if((x&0x40)==0x40) d71;else d70;
if((x&0x80)==0x80) d81;else d80;
}
/* 微秒级延时程序 */
void del(int time)
{
do
{
time--;
}
while (time>1);
}
/* 毫秒级延时程序 */
void delay_1ms(void)
{ unsigned int i1;
for(i1=1;i1<(unsigned int)(xtal*143-2);i1++)
;
}
void A(void) ///*********
{
a11;DAT(shu[tm[0]]);del(240);a10;DAT(0xff);del(5);WDR();
a21;DAT(shu[tm[1]]);del(240);a20;DAT(0xff);del(5);WDR();
a31;DAT(shu[tm[2]]);del(240);a30;DAT(0xff);del(5);WDR();
a41;DAT(shu[tm[3]]);del(240);a40;DAT(0xff);del(5);WDR();
}
//TIMER1 initialize - prescale:256
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 2Hz
// actual value: 2.000Hz (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop timer
TCNT1H = 0xF8; //set count value
TCNT1L = 0x5F;
OCR1AH = 0x3D; //set compare value
OCR1AL = 0x09;
OCR1BH = 0x3D; //set compare value
OCR1BL = 0x09;
TCCR1A = 0x00;
TCCR1B = 0x04; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:6
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
t++;
dp=~dp;
if(t==120)
{
t=0;
min++;s=0;if(min==60) {min=0; h++; if(h>12) {h=1;} }
EEPROM_WRITE(0x810,h);
EEPROM_WRITE(0x811,min);
}
TCNT1H = 0xF8; //set count value
TCNT1L = 0x5F;
MCUCR|=0x20;
}
void port_init(void)
{
PORTB = 0x30;
DDRB = 0x3C;
PORTC = 0x06; //m103 output only
DDRC = 0x0F;
PORTD = 0xD8;
DDRD = 0xD8;
}
//Watchdog initialize
// prescale: 512K
void watchdog_init(void)
{
WDR(); //this prevents a timout on enabling
WDTCR = 0x0E; //WATCHDOG ENABLED - dont forget to issue WDRs
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
watchdog_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x82;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void delay(unsigned int n)
{
unsigned int i2=0;
while(i2<n)
{delay_1ms();
i2++;
}
}
void a(void) ///*********///
{
WDR();
if((PIND&0X40)==0)
{
PORTB=shu[11];
MCUCR|=0x20;
}
else
{
tm[3]=h/10; tm[2]=h%10; tm[1]=min/10; tm[0]=min%10;
if(h<10) tm[3]=11;
a11;DAT(shu[tm[0]]);del(240);a10;DAT(0xff);del(5);WDR();
a21;DAT(shu[tm[1]]);del(240);a20;DAT(0xff);del(5);WDR();
if(dp==0) {a31;DAT(shu[tm[2]]);del(240);a30;DAT(0xff);del(5);WDR();}
else {a31;DAT(shu1[tm[2]]);del(240);a30;DAT(0xff);del(5);WDR();}
a41;DAT(shu[tm[3]]);del(240);a40;DAT(0xff);del(5);WDR();
}
}
void main()
{
init_devices();
EEPROM_READ(0x810,h);
EEPROM_READ(0x811,min);
if((h==0xFF)|(min==0xFF))
{
h=0;min=0;
EEPROM_WRITE(0x810,h);
EEPROM_WRITE(0x811,min);
}
while(1)
{
a();
/*
if((PIND&0X01)==0) //调表 min++
{
for(j=0;j<6;j++) a();
if((PIND&0X01)==0)
{
min++;
if(min>59)
{
min=0;
h++;
if(h>12) h=1;
}
EEPROM_WRITE(0x810,h);
EEPROM_WRITE(0x811,min);
for(j=0;j<20;j++) a();
}
}
if((PIND&0X02)==0) //调表 MIN--
{
for(j=0;j<6;j++) a();
if((PIND&0X02)==0)
{
h++;
if(h>12) h=1;
}
EEPROM_WRITE(0x810,h);
EEPROM_WRITE(0x811,min);
for(j=0;j<20;j++) a();
}
if(((PIND&0X02)|(PIND&0X01))==0)
{
for(j=0;j<20;j++) a();
if(((PIND&0X02)|(PIND&0X01))==0)
{
h=0;min=0;
EEPROM_WRITE(0x810,h);
EEPROM_WRITE(0x811,min);
}
for(j=0;j<50;j++) a();
}
/*
if((PIND&0X40)==0) //调表 MIN--
{
for(j=0;j<10;j++) a();
while((PIND&0X40)==0)
{
CLI();
a();
}
SEI();
}
*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -