1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
| #include "at89x52.h" /\*\*74hc595引脚定义\*\*/ sbit SHCP =P0^1; // 移位寄存器的时钟输入 sbit STCP =P0^2 ; // 存储寄存器的时钟输入 sbit DS =P0^0; //按键定义 sbit key_stop = P1^0; sbit key_star = P1^1; sbit key_fen = P1^2; sbit key_shi = P1^3; code unsigned char SegTab[17]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};//共阴数码管段码表 code unsigned char BitTab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; data unsigned char DBuf[8]={0x00}; unsigned char miao=12,fen=26,shi=8; //秒、分、时高位低位 unsigned char miao_L, miao_H, fen_L, fen_H, shi_L, shi_H; void keyscan(); //按键函数 void key\_delay(int xms); //按键延时函数 x ms void DelayXms(unsigned char ms){unsigned int dly; while(ms--) {dly = 100; while(dly--){;} } } void Driver595 (unsigned char dat) { unsigned char i; for(i=0;i<8;i++) {SHCP=0; if(dat & 0x80)DS=1; else DS=0; SHCP=1; dat <<=1;} } void Display(unsigned char\* ptr){ unsigned char i; STCP=0; for(i = 0;i < 8;i++) {Driver595(BitTab[i]); Driver595(ptr[i]); STCP=1;DelayXms(2); STCP=0;}} void update(unsigned char \*dst,unsigned char shi,unsigned char fen,unsigned char miao) { \*dst++ = SegTab[shi/10]; \*dst++ = SegTab[shi%10]; \*dst++ = 0x40; \*dst++ = SegTab[fen/10]; \*dst++ = SegTab[fen%10]; \*dst++ = 0x40; \*dst++ = SegTab[miao/10]; \*dst++ = SegTab[miao%10]; } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* 函 数 名 : TimerInit \* 函数功能 : 定时器0初始化 \* 参数 :无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void TimerInit() { TMOD|=0X01; //选择为定时器0模式,工作方式1,仅用TR0打开启动。 TH0=0X3c; //给定时器赋初值,定时50ms 3CB0 TL0=0Xb0; //0X3CB0的十进制是15536 从15536计数到65536计数50000次 即50000us=50ms ET0=1; //打开定时器0中断允许 EA=1; //打开总中断 TR0=1; //打开定时器
} /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* 函 数 名 : Timer0() \* 函数功能 : 定时器0中断函数 \* 参数 :无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void Timer0() interrupt 1 { unsigned char i; TL0 =(65536-50000)%256;//50ms预装载值 TH0 =(65536-50000)/256; i++; if(i==20)//20个50毫秒即一秒 { i=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60)//定时一小时自动清零 { fen=0; shi++; if(shi==24) { shi=0; fen =0; miao = 0; } } } miao_L = miao%10; miao_H = miao/10;
fen_L = fen%10; fen_H = fen/10;
shi_L = shi%10; shi_H = shi/10; } // display(); }
void main(void) { TimerInit();
while(1){ update(DBuf,shi,fen,miao); Display(DBuf); keyscan(); //按键函数 } }
void keyscan(){ //按键函数
if(key_stop == 0){ key\_delay(10); if(key_stop == 0){ EA = 0; //关总中断,即停止 while(!key_stop); } }//key\_stop if(key_star == 0){ key\_delay(10); if(key_star == 0){ EA = 1; //开总中断 while(!key_star); } }//key\_star if(key_fen == 0){ key\_delay(10); if(key_fen == 0){ fen++; while(!key_fen); } }//key\_fen++ if(key_shi == 0){ key\_delay(10); if(key_shi == 0){ shi++; while(!key_shi); } }//key\_shi++ } void key\_delay(int xms){ //按键延时函数 x ms unsigned int i, j; for(i=0; i<xms; ++i) for(j=0; j<110; ++j) ; }//key\_delay
|