四位数码管时钟源代码

来源:本站
导读:目前正在解读《四位数码管时钟源代码》的相关信息,《四位数码管时钟源代码》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《四位数码管时钟源代码》的详细说明。
简介:这里给大家分享一个四位数码管时钟源代码。

 /******************************************************************************************/#include  //STC头文件/******************************************************************************************///"程序开发调试设置项"#define DY_LI9 //设置LED显示的亮度(值域:1~9)#define DY_DELAY12 //设置每一个点显示的时间长度(1~20)/******************************************************************************************/sbitDY_LED1_H1=P3 ^ 5; //设置LED点阵屏连接的I/O口sbitDY_LED1_H2=P3 ^ 4; //设置LED点阵屏连接的I/O口sbitDY_LED1_H3=P3 ^ 3; //设置LED点阵屏连接的I/O口sbitDY_LED1_H4=P3 ^ 2; //设置LED点阵屏连接的I/O口sbitDY_LED1_L1=P1 ^ 1; //设置LED点阵屏连接的I/O口sbitDY_LED1_L2=P1 ^ 4; //设置LED点阵屏连接的I/O口sbitDY_LED1_L3=P1 ^ 6; //设置LED点阵屏连接的I/O口sbitDY_LED1_L4=P1 ^ 5; //设置LED点阵屏连接的I/O口sbitDY_LED1_L5=P1 ^ 0; //设置LED点阵屏连接的I/O口sbitDY_LED1_L6=P1 ^ 2; //设置LED点阵屏连接的I/O口sbitDY_LED1_L7=P1 ^ 3; //设置LED点阵屏连接的I/O口sbitDY_LED1_L8=P1 ^ 7; //设置LED点阵屏连接的I/O口  冒号sbit key1 = P3^1;sbit key2 = P3^7;data unsigned char key_v = 0;    // 存储键值   data unsigned char key_t = 0;    // 按键扫描中临时存储键值   data unsigned char MENU  = 0;    //sbitDY_BEEP=P2 ^ 2; //扬声器//sbitDY_KEY1=P0 ^ 2; //按键1(M键)(连接在P1.3和P0.2,读P0.2为低时表示有按键动作)//sbitDY_KEY2=P3 ^ 0; //按键2(+键)(连接在P4.6和P3.0,读P3.0为低时表示有按键动作)//sbitDY_KEY3=P3 ^ 6; //按键3(-键)(连接在P2.4和P3.6,读P3.6为低时表示有按键动作)#define DY_P1M0SET0x00 //设置I/O口工作方式//00000000(左到右,高到低位)#define DY_P1M1SET0x00 //设置I/O口工作方式//00101000 #define DY_P3M0SET0x00 //设置I/O口工作方式//00000000#define DY_P3M1SET0x3c //设置I/O口工作方式//10010100 0111 1101data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS,ty;//设置日、月、年、周、时、分、秒和温度存放区data unsigned char cou  = 0;     // 软计数器,对10ms时基信号累加到1s data unsigned char bn;//扫描映射全局变量data unsigned char KEY_BIT = 0;//按键值data unsigned char DY_PWM;//显示亮度data unsigned char DY_PWM2;//显示暂存unsigned char code disdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //无小数点数码管段码表(0~9) };//0x3f 00111111  0x06 00000110  0x56 01011011  0x4f 01001111  0x66 01100110  0x6d 01101101//0x7d 01111101  0x07 00000111  0x7f 01111111  0x6f 01101111/******************************************************************************************/void delay (unsigned int a){ // 用于点扫描的延时unsigned int i;while( --a != 0){for(i = 0; i < DY_DELAY; i++);    // DY_DELAY值为12}      }/******************************************************************************************/void delay1ms (unsigned int a){ // 1ms延时程序(12MHz 10倍于51单片机速度时)unsigned int i;while( --a != 0){for(i = 0; i < 600; i++); }      }/******************************************************************************************/void dis_off (void){   DY_LED1_L1=1; //灭灯   DY_LED1_L2=1; //   DY_LED1_L3=1; //   DY_LED1_L4=1; //   DY_LED1_L5=1; //   DY_LED1_L6=1; //   DY_LED1_L7=1; //   DY_LED1_H1=0; //   DY_LED1_H2=0; //   DY_LED1_H3=0;    DY_LED1_H4=0; //P1 = ~DY_P1M1SET; //关所有显示//P3 = ~DY_P3M1SET;delay(10-DY_PWM); }/******************************************************************************************/void displayHH1 (unsigned char d){ //第1列横向显示程序unsigned char i;i = d & 0x01;   //按位与  0x01-0000 0001if(i == 0x01){DY_LED1_H1 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;  //0x02-0000 0010if(i == 0x02){DY_LED1_H1 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04; //0x04-0000 0100if(i == 0x04){DY_LED1_H1 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;  //0x08-0000 1000if(i == 0x08){DY_LED1_H1 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10; //0x10-0001 0000if(i == 0x10){DY_LED1_H1 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;  //0x20-0010 0000if(i == 0x20){DY_LED1_H1 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;  //0x40-0100 0000if(i == 0x40){DY_LED1_H1 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();} /******************************************************************************************/void displayHH2 (unsigned char d){ //第2列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H2 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H2 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H2 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H2 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H2 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H2 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H2 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();} /******************************************************************************************/void displayHH3 (unsigned char d){ //第3列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H3 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H3 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H3 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H3 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H3 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H3 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H3 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();} /******************************************************************************************/void displayHH4 (unsigned char d){ //第4列横向显示程序unsigned char i;i = d & 0x01;if(i == 0x01){DY_LED1_H4 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();i = d & 0x02;if(i == 0x02){DY_LED1_H4 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();i = d & 0x04;if(i == 0x04){DY_LED1_H4 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();i = d & 0x08;if(i == 0x08){DY_LED1_H4 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();i = d & 0x10;if(i == 0x10){DY_LED1_H4 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();i = d & 0x20;if(i == 0x20){DY_LED1_H4 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();i = d & 0x40;if(i == 0x40){DY_LED1_H4 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();} /******************************************************************************************//******************************************************************************************/void diplay_data (unsigned char l,unsigned char d){switch (l){//显示的列位置case 1://displayHH1(d); //将显示数据送入break;//case 2://displayHH2(d); //将显示数据送入break;//case 3://displayHH3(d); //将显示数据送入break;//case 4://displayHH4(d); //将显示数据送入break;//}}/******************************************************************************************/void init (void){ //上电初始化P1M0 = DY_P1M0SET;P1M1 = DY_P1M1SET;P3M0 = DY_P3M0SET; //1100 0011P3M1 = 0xff;//DY_P3M1SET;////dis_off(); DY_PWM = DY_LI;////TMOD = 0x11;         // 定时/计数器0,1工作于方式1       TH0 = 0x3c;          // 预置产生50ms时基信号       TL0 = 0xb0;       EA = 1;              // 开总中断       ET0 = 1;             // 定时/计数器0允许中断       TR0 = 1;             // 开闭定时/计数器0   //////TIME_DD = 18; //时间在首次使用的值,之后会在EEPROM自动记录上一天的值//TIME_MO= 5; //初始时间:2009年5月18日周一,20时13分40秒//TIME_YY = 9;//TIME_WW = 1;//TIME_HH= 22;//TIME_MM = 13;//TIME_SS = 40;}/******************************************************************************************//******************************************************************************************/void main (void){ //主程序 init();while (1){   unsigned char a,b;    if(MENU == 0){     diplay_data (4,disdata[TIME_HH/10]);        if(key1 == 0 && key2 == 1){          delay1ms (100);//去抖          if(key1 == 0 && key2 == 1){               MENU = 1;               }            } if(key2 == 0&& key1 == 1){        delay1ms (100);//去抖            if(key2 == 0&& key1 == 1){             a = TIME_HH/10;    b = TIME_HH%10;    a++;    if(a > 2){a = 0;      }    TIME_HH = a*10 + b;                  }               }      while(key1 == 0 || key2 == 0){ }         }  if(MENU == 1){     diplay_data (3,disdata[TIME_HH%10]);        if(key1 == 0 && key2 == 1){          delay1ms (100);//去抖          if(key1 == 0 && key2 == 1){               MENU= 2;               }            } if(key2 == 0&& key1 == 1){        delay1ms (100);//去抖            if(key2 == 0&& key1 == 1){             a = TIME_HH/10;    b = TIME_HH%10;        b++;       if(b > 9){     b = 0;         }        if(a > 1){   if(b > 3){b = 0;              }                }            TIME_HH = a*10 + b;                  }                                    }      while(key1 == 0 || key2 == 0){ }         } if(MENU == 2){     diplay_data (2,disdata[TIME_MM/10]+0x80);        if(key1 == 0 && key2 == 1){          delay1ms (100);//去抖          if(key1 == 0 && key2 == 1){               MENU = 3;               }            } if(key2 == 0&& key1 == 1){        delay1ms (100);//去抖            if(key2 == 0&& key1 == 1){             a = TIME_MM/10;        b = TIME_MM%10;        a++;        if(a > 5){        a = 0;            }             TIME_MM = a*10 + b;                  }                  }        while(key2 == 0 || key1 == 0){ }   }if(MENU == 3){     diplay_data (1,disdata[TIME_MM%10]+0x80);        if(key1 == 0 && key2 == 1){          delay1ms (100);//去抖          if(key1 == 0 && key2 == 1){               MENU = 4;               }            } if(key2 == 0&& key1 == 1){        delay1ms (100);//去抖            if(key2 == 0&& key1 == 1){             a = TIME_MM/10;       b = TIME_MM%10;b++;if(b > 9){b = 0;}TIME_MM = a*10 + b;TIME_SS = 0;//调时完成后把秒清0}}while(key1 == 0 || key2 == 0){ }}         if(MENU == 4){     while (1){diplay_data (4,disdata[TIME_HH/10]);diplay_data (3,disdata[TIME_HH%10]);diplay_data (2,disdata[TIME_MM/10]+0x80);diplay_data (1,disdata[TIME_MM%10]+0x80);if(TIME_SS%2 == 0){   DY_LED1_L8 = 0;delay(10);DY_LED1_L8 = 1;}  //  }    }}}/******************************************************************************************/void tiem0(void) interrupt 1{   // T/C0中断服务程序(产生50ms时基信号)       cou++;                      // 软计数器加1       if(cou > 19){                 // 计数值到100(1s)           cou = 0;               // 软计数器清零           TIME_SS++;                 // 秒计数器加1(进位10ms*100=1s)           if(TIME_SS > 59){          // 秒计数值到60                          TIME_SS = 0;           // 秒计数器清零               TIME_MM++;             // 分计数器加1(进位60s=1m)              if(TIME_MM > 59){      // 分计数到60                   TIME_MM = 0;       // 分计数器清零                   TIME_HH++;         // 时计数器加1(进位60m=1h)                   if(TIME_HH > 23){  // 时计数到23                       TIME_HH = 0;   // 时计数器清零}              }           }       }       TH0 = 0x3c;                // 重置定时常数       TL0 = 0xb0;   }/*************************************************************PxM0    PxM100        双向标准  1       0        推挽输出0       1        高阻态输出1       1        开漏按位与& 1 1 1 0  1 0 1 0  1 0 1 0  0 0 1 11 0 1 0  0 0 1 0  0和任何数按位与&的结果都为0e.g.  假设d为0  即 0x3f-0011 1111     i== d & 0x80  & 0 0 1 1  1 1 1 1                     1 0 0 0  0 0 0 0                    0 0 0 0  0 0 0 0If ( I == 0x80){     按位与之后    结果符合则扫描                   结果不符合则不扫描,退出  /*************************************************************/

提醒:《四位数码管时钟源代码》最后刷新时间 2024-03-14 01:02:41,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《四位数码管时钟源代码》该内容的真实性请自行鉴别。