# include "stc15.h"
# define FOSC 11059200L
# define T1MS ( 65536 - FOSC/ 12 / 1000 ) typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32; # define LY 1
# define CY 2
# define AY 3
# define UY 4 # define ledon 1
# define ledoff 0
sbit beep= P0^ 6 ;
sbit jdq= P0^ 4 ;
u8 u8led= 0x00 ; u8 code t_display[ ] = {
0x3F , 0x06 , 0x5B , 0x4F , 0x66 , 0x6D , 0x7D , 0x07 , 0x7F , 0x6F , 0x77 , 0x7C , 0x39 , 0x5E , 0x79 , 0x71 ,
0x00 , 0x40 , 0x76 , 0x1E , 0x70 , 0x38 , 0x37 , 0x5C , 0x73 , 0x3E , 0x78 , 0x3d , 0x67 , 0x50 , 0x37 , 0x6e , 0xBF , 0x86 , 0xDB , 0xCF , 0xE6 , 0xED , 0xFD , 0x87 , 0xFF , 0xEF , 0x46 } ;
u8 code T_COM[ ] = { 0x80 , 0x40 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 } ; u8 LED8[ 8 ] ;
u8 display_index;
bit B_1ms;
void hc573 ( u8 x) ;
u8 bit1 ( u8 x, u8 i) ;
u8 bit0 ( u8 x, u8 i) ;
u8 bitT ( u8 x, u8 i) ;
u8 bitR ( u8 x, u8 i) ; void LEDdisp ( void ) ;
void LEDsta ( u8 pos, u8 sta) ; void delay1ms ( int nms) ; long s4time= 0 ;
u8 s4timeflag= 0 ;
u8 s4key= 0 ;
u8 s4timeflag2= 0 ;
u16 s4time2= 0 ;
u8 s4cnt= 0 ;
void main ( )
{ long a= 0 ; hc573 ( UY) ; beep= 0 ; hc573 ( 0 ) ; hc573 ( 0 ) ; u8led= 0x00 ; P0= ~ u8led; hc573 ( LY) ; hc573 ( 0 ) ; AUXR &= 0xdf ; TMOD = 0x00 ; TL1 = T1MS; TH1 = T1MS >> 8 ; TR1 = 1 ; ET1 = 1 ; EA = 1 ; while ( 1 ) { if ( P30== 0 ) { delay1ms ( 10 ) ; if ( P30== 0 ) { s4key= 1 ; s4timeflag= 1 ; if ( s4cnt== 0 ) { s4cnt= 1 ; s4time2= 0 ; s4timeflag2= 1 ; } else if ( s4cnt== 1 ) { if ( s4time2< 250 ) { s4cnt= 2 ; } } while ( P30== 0 ) { if ( s4time> 1000 ) { s4cnt= 0 ; s4time2= 0 ; s4timeflag2= 0 ; s4key = 2 ; delay1ms ( 200 ) ; a= a+ 1 ; if ( a> 9999999 ) a= 0 ; LED8[ 7 ] = 10 ; LED8[ 6 ] = a/ 1000000 ; LED8[ 5 ] = ( a % 1000000 ) / 100000 ; LED8[ 4 ] = ( a % 100000 ) / 10000 ; LED8[ 3 ] = ( a % 10000 ) / 1000 ; LED8[ 2 ] = ( a % 1000 ) / 100 ; LED8[ 1 ] = ( a % 100 ) / 10 ; LED8[ 0 ] = ( a % 10 ) / 1 ; } } s4timeflag= 0 ; s4time= 0 ; } } if ( s4key== 1 ) { if ( s4cnt== 2 ) { s4key= 0 ; s4cnt= 0 ; a= a+ 10 ; LED8[ 7 ] = 12 ; LED8[ 6 ] = a/ 1000000 ; LED8[ 5 ] = ( a % 1000000 ) / 100000 ; LED8[ 4 ] = ( a % 100000 ) / 10000 ; LED8[ 3 ] = ( a % 10000 ) / 1000 ; LED8[ 2 ] = ( a % 1000 ) / 100 ; LED8[ 1 ] = ( a % 100 ) / 10 ; LED8[ 0 ] = ( a % 10 ) / 1 ; } else if ( s4cnt== 1 && s4time2> 200 ) { s4key= 0 ; s4cnt= 0 ; s4time2= 0 ; s4timeflag2= 0 ; a= a+ 1 ; LED8[ 7 ] = 11 ; LED8[ 6 ] = a/ 1000000 ; LED8[ 5 ] = ( a % 1000000 ) / 100000 ; LED8[ 4 ] = ( a % 100000 ) / 10000 ; LED8[ 3 ] = ( a % 10000 ) / 1000 ; LED8[ 2 ] = ( a % 1000 ) / 100 ; LED8[ 1 ] = ( a % 100 ) / 10 ; LED8[ 0 ] = ( a % 10 ) / 1 ; } } else if ( P31== 0 ) { delay1ms ( 10 ) ; if ( P31== 0 ) { u8led= bitT ( u8led, 1 ) ; LEDdisp ( ) ; LED8[ 0 ] = 2 ; while ( P31== 0 ) ; } } else if ( P32== 0 ) { delay1ms ( 10 ) ; if ( P32== 0 ) { u8led= bitT ( u8led, 2 ) ; LEDdisp ( ) ; LED8[ 0 ] = 3 ; while ( P32== 0 ) ; } } else if ( P33== 0 ) { delay1ms ( 10 ) ; if ( P33== 0 ) { u8led= bitT ( u8led, 3 ) ; LEDdisp ( ) ; LED8[ 0 ] = 4 ; while ( P33== 0 ) ; } } }
}
void hc573 ( u8 x)
{ if ( x== 0 ) P2= P2& 0x1F ; else if ( x== LY) P2= P2& 0x1F | 0x80 ; else if ( x== CY) P2= P2& 0x1F | 0xC0 ; else if ( x== AY) P2= P2& 0x1F | 0xe0 ; else if ( x== UY) P2= P2& 0x1F | 0xa0 ;
}
u8 bit1 ( u8 x, u8 i)
{ u8 a; a= ( 0x01 << i) | x; return a;
}
u8 bit0 ( u8 x, u8 i)
{ u8 a; a= ( ~ ( 0x01 << i) ) & x; return a;
}
u8 bitT ( u8 x, u8 i)
{ u8 a; a= x^ ( 1 << i) ; return a;
}
u8 bitR ( u8 x, u8 i)
{ u8 a; a= ( x>> i) & 0x01 ; return a;
}
void LEDsta ( u8 pos, u8 sta)
{ if ( sta== ledon) { u8led = bit1 ( u8led, pos) ; } else if ( sta== ledoff) { u8led = bit0 ( u8led, pos) ; }
}
void LEDdisp ( void )
{ hc573 ( 0 ) ; P0= ~ u8led; hc573 ( LY) ; hc573 ( LY) ; hc573 ( 0 ) ;
}
void delay1ms ( int nms)
{ unsigned char i, j; for ( ; nms> 0 ; nms-- ) { i = 11 ; j = 190 ; do { while ( -- j) ; } while ( -- i) ; }
}
void DisplayScan ( void )
{ hc573 ( 0 ) ; P0= T_COM[ display_index] ; hc573 ( CY) ; hc573 ( CY) ; hc573 ( 0 ) ; hc573 ( 0 ) ; P0= ~ t_display[ LED8[ display_index] ] ; hc573 ( AY) ; hc573 ( AY) ; hc573 ( 0 ) ; if ( ++ display_index >= 8 ) display_index = 0 ;
}
void tm1_isr ( ) interrupt 3
{ if ( s4timeflag== 1 ) { s4time++ ; if ( s4time== 100000 ) s4time= 1000 ; } if ( s4timeflag2== 1 ) { s4time2++ ; if ( s4time2> 1000 ) { s4timeflag2= 0 ; s4time2= 0 ; } } DisplayScan ( ) ; B_1ms = 1 ;
}