⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dy1clock_v1.01.c

📁 《爱上单片机》配书光盘(书本的制作作品所要的程序)
💻 C
字号:
/**************************************************************************  
* 标题: 一位数码时钟 
* 作者: 杜洋  
* 日期: 2009.4.26  
* 软件: Keil C51  
* 芯片: STC12C2052  
* 说明: 用一位数码LED管显示时钟
* 日志: 
20090426 首次完成,代码有一些笨重,不过基本的显示和调时功能已经实现。
20090428 修改了一些BUG,主要是显示样式和操作方面的。
   
**************************************************************************/  
  
#include <reg51.h>   
#include <intrins.h>   
#define uchar unsigned char   

sbit leda1 = P1 ^ 4;//
sbit leda2 = P1 ^ 3;//
sbit ledb1 = P1 ^ 1;//
sbit ledb2 = P1 ^ 0;//
sbit ledc1 = P3 ^ 5;//
sbit ledc2 = P3 ^ 4;//
sbit ledd1 = P3 ^ 2;//
sbit ledd2 = P3 ^ 3;//
sbit lede1 = P3 ^ 0;//
sbit lede2 = P3 ^ 1;//
sbit ledf1 = P1 ^ 6;//
sbit ledf2 = P1 ^ 7;// 
sbit ledg1 = P1 ^ 5;// 
sbit ledg2 = P1 ^ 2;//

sbit key1 = P1 ^ 4;//
sbit key2 = P1 ^ 3;//
 
uchar data sec = 0;      // 秒计数器(00s-59s)   
uchar data min = 1;      // 分计数器(00m-59m)   
uchar data hou = 2;      // 时计数器)00h-23h)   
  
uchar data cou  = 0;     // 软计数器,对10ms时基信号累加到1s   
  
uchar data key_v = 0;    // 存储键值   
uchar data key_t = 0;    // 按键扫描中临时存储键值   

uchar data MENU  = 0;     //  
uchar data SP_DIS  = 100;     //  

#define SP2 1300  //数字之间的停留时间
#define SP3 10000  //一个循环显示结束后的间隔时间
#define SP4 2000  //分隔点的显示时间
  
/**********************************************************************************************/	

void tiem0(void) interrupt 1   // T/C0中断服务程序(产生10ms时基信号)   
{   
    cou++;                     // 软计数器加1   
    if(cou > 99)             // 计数值到100(1s)   
    {   
        cou = 0;               // 软计数器清零   
        sec++;                 // 秒计数器加1(进位10ms*100=1s)   
        if(sec > 59)          // 秒计数值到60   
        {   
            sec = 0;           // 秒计数器清零   
            min++;             // 分计数器加1(进位60s=1m)   
            if(min > 59)      // 分计数到60   
            {   
                min = 0;       // 分计数器清零   
                hou++;         // 时计数器加1(进位60m=1h)   
                if(hou > 23)  // 时计数到23   
                    hou = 0;   // 时计数器清零   
            }   
        }   
    }   
    TH0 = 0xd8;                // 重置定时常数   
    TL0 = 0xf0;   
}   
/**********************************************************************************************/	
void delay_ms(unsigned int a){//-延时函数 1MS/次	
	unsigned char i;
	while( --a != 0){		
		for(i = 0; i < 125; i++);  //一个 ; 表示空语句,CPU空转。
	}   				   //i 从0加到125,CPU大概就耗时1毫秒
}

void delay_P1(void){       //     
	delay_ms(SP_DIS); 
}
void delay_P2(void){       //
	delay_ms(SP2); 
}
/**********************************************************************************************/	

void displayN(void){       //     
	ledc2=1;delay_P1();ledd2=1;delay_P1();
	ledc1=1;delay_P1();ledd1=1;delay_P1();
	lede2=1;delay_P1();ledg2=1;delay_P1();
	lede1=1;delay_P1();ledg1=1;delay_P1();
	ledb2=1;delay_P1();
	ledb1=1;delay_P1();ledf2=1;delay_P1();
	leda2=1;delay_P1();ledf1=1;delay_P1();
	leda1=1; 
}
void displayN2(void){       //     
	ledc2=1;ledd2=1;
	ledc1=1;ledd1=1;
	lede2=1;ledg2=1;
	lede1=1;ledg1=1;
	ledb2=1;ledb1=1;ledf2=1;
	leda2=1;ledf1=1;leda1=1; 
}

void display1(void){       //笔画1     
	ledb1=0;delay_P1();ledb2=0;delay_P1();
	ledc1=0;delay_P1();ledc2=0;delay_P1();
	leda1=1;leda2=1;
	ledd1=1;ledd2=1;
	lede1=1;lede2=1;
	ledf1=1;ledf2=1;
	ledg1=1;ledg2=1;  
}
void display2(void){       //       
	leda1=0;delay_P1();leda2=0;delay_P1();
	ledb1=0;delay_P1();ledb2=0;delay_P1();
	ledg2=0;delay_P1();ledg1=0;delay_P1();  
	lede1=0;delay_P1();lede2=0;delay_P1();
	ledd1=0;delay_P1();ledd2=0;delay_P1();
	ledc1=1;ledc2=1;
	ledf1=1;ledf2=1;
}
void display3(void){       //       
	leda1=0;delay_P1();leda2=0;delay_P1();
	ledb1=0;delay_P1();ledb2=0;delay_P1();
	ledg1=0;delay_P1();ledg2=0;delay_P1();  
	ledc1=0;delay_P1();ledc2=0;delay_P1();
	ledd2=0;delay_P1();ledd1=0;delay_P1();
	lede1=1;lede2=1;
	ledf1=1;ledf2=1;
}
void display4(void){       //       
	ledf1=0;delay_P1();ledf2=0;delay_P1();
	ledg1=0;delay_P1();ledg2=0;delay_P1();  
	ledb1=0;delay_P1();ledb2=0;delay_P1();
	ledc1=0;delay_P1();ledc2=0;delay_P1();
	leda1=1;leda2=1;
	ledd1=1;ledd2=1;
	lede1=1;lede2=1;
}
void display5(void){       //       
	leda2=0;delay_P1();leda1=0;delay_P1();
	ledf1=0;delay_P1();ledf2=0;delay_P1();
	ledg1=0;delay_P1();ledg2=0;delay_P1();  
	ledc1=0;delay_P1();ledc2=0;delay_P1();
	ledd2=0;delay_P1();ledd1=0;delay_P1();
	ledb1=1;ledb2=1;
	lede1=1;lede2=1;
}
void display6(void){       //       
	leda2=0;delay_P1();leda1=0;delay_P1();
	ledf1=0;delay_P1();ledf2=0;delay_P1();
	lede1=0;delay_P1();lede2=0;delay_P1();
	ledd1=0;delay_P1();ledd2=0;delay_P1();
	ledc2=0;delay_P1();ledc1=0;delay_P1();
	ledg2=0;delay_P1();ledg1=0;delay_P1();  
	ledb1=1;ledb2=1;
}
void display7(void){       //       
	leda1=0;delay_P1();leda2=0;delay_P1();
	ledb1=0;delay_P1();ledb2=0;delay_P1();
	ledc1=0;delay_P1();ledc2=0;delay_P1();
	ledd1=1;ledd2=1;
	lede1=1;lede2=1;
	ledf1=1;ledf2=1;
	ledg1=1;ledg2=1;  
}
void display8(void){       //       
	ledb2=0;delay_P1();ledb1=0;delay_P1();
	leda2=0;delay_P1();leda1=0;delay_P1();
	ledf1=0;delay_P1();ledf2=0;delay_P1();
	ledg1=0;delay_P1();ledg2=0;delay_P1();  
	ledc1=0;delay_P1();ledc2=0;delay_P1();
	ledd2=0;delay_P1();ledd1=0;delay_P1();
	lede2=0;delay_P1();lede1=0;delay_P1();
}
void display9(void){       //       
	ledb2=0;delay_P1();ledb1=0;delay_P1();
	leda2=0;delay_P1();leda1=0;delay_P1();
	ledf1=0;delay_P1();ledf2=0;delay_P1();
	ledg1=0;delay_P1();ledg2=0;delay_P1();  
	ledc1=0;delay_P1();ledc2=0;delay_P1();
	ledd2=0;delay_P1();ledd1=0;delay_P1();
	lede1=1;lede2=1;
}
void display0(void){       //       
	ledf1=0;delay_P1();ledf2=0;delay_P1();
	lede1=0;delay_P1();lede2=0;delay_P1();
	ledd1=0;delay_P1();ledd2=0;delay_P1();
	ledc2=0;delay_P1();ledc1=0;delay_P1();
	ledb2=0;delay_P1();ledb1=0;delay_P1();
	leda2=0;delay_P1();leda1=0;delay_P1();
	ledg1=1;ledg2=1;  
}
/**********************************************************************************************/	

void turn(uchar i){
			switch (i){//		
				case 1://			
					display1();		
					break;//		
				case 2://			
					display2();		
					break;//		
				case 3://			
					display3();		
					break;//		
				case 4://			
					display4();		
					break;//		
				case 5://			
					display5();		
					break;//		
				case 6://			
					display6();		
					break;//		
				case 7://			
					display7();		
					break;//		
				case 8://			
					display8();		
					break;//		
				case 9://			
					display9();		
					break;//		
				case 0://			
					display0();		
					break;//		
			}
}
/**********************************************************************************************/	
  
void main(void){   
    TMOD = 0x11;         // 定时/计数器0,1工作于方式1   
    TH0 = 0xd8;          // 预置定时常数55536(d8f0),产生10ms时基信号   
    TL0 = 0xf0;   
    EA = 1;              // 开总中断   
    ET0 = 1;             // 定时/计数器0允许中断   
    TR0 = 1;             // 开闭定时/计数器0   
while(1){

unsigned char a,b;

if(MENU == 0){	         
	 SP_DIS = 150;
     turn(hou/10);
	 delay_P2();
	 displayN();
	 delay_P2();
	 turn(hou%10);
	 delay_P2();
	 displayN();
	 delay_P2();
	 ledb2 = 0; ledc2 = 0;
	 delay_ms(SP4);
	 ledb2 = 1; ledc2 = 1;
	 delay_P2();
     turn(min/10);
	 delay_P2();
	 displayN();
	 delay_P2();
	 turn(min%10);
	 delay_P2();
	 displayN();

	 if(key1 == 0 && key2 == 1){			
		delay_ms(200);//去抖
		if(key1 == 0 && key2 == 1){
			MENU = 1;
			while(key1 == 0 || key2 == 0){ ledg1 = 0;ledg2 = 0; }
		}
	}else{
		delay_ms(SP3);
	}     
}
/**********************************************************************************************/	

if(MENU == 1){
	SP_DIS = 1;
	turn(hou/10);
	displayN2();
	if(key1 == 0 && key2 == 1){	
		delay_ms(200);//去抖
		if(key1 == 0 && key2 == 1){
			MENU = 2;
		}
	}
	if(key2 == 0 && key1 == 1){	
		delay_ms(200);//去抖
		if(key2 == 0 && key1 == 1){
			a = hou/10;
			b = hou%10;
			a++;
			if(a > 2){
				a = 0;
			}
			hou = a*10 + b;
		}
	}
	while(key1 == 0 || key2 == 0){ }
}
/**********************************************************************************************/	

if(MENU == 2){
	turn(hou%10);
	displayN2();
	if(key1 == 0 && key2 == 1){	
		delay_ms(200);//去抖
		if(key1 == 0 && key2 == 1){
			MENU = 3;
		}
	}
	if(key2 == 0 && key1 == 1){	
		delay_ms(200);//去抖
		if(key2 == 0 && key1 == 1){
			a = hou/10;
			b = hou%10;
			b++;
			if(b > 9){
				b = 0;
			}
			if(a > 1){
				if(b > 3){
					b = 0;
				}
			}
			hou = a*10 + b;
		}
	}
	while(key1 == 0 || key2 == 0){ }
}   
/**********************************************************************************************/	

if(MENU == 3){
	turn(min/10);
	displayN2();
	if(key1 == 0 && key2 == 1){	
		delay_ms(200);//去抖
		if(key1 == 0 && key2 == 1){
			MENU = 4;
		}
	}
	if(key2 == 0 && key1 == 1){	
		delay_ms(200);//去抖
		if(key2 == 0 && key1 == 1){
			a = min/10;
			b = min%10;
			a++;
			if(a > 5){
				a = 0;
			}
			min = a*10 + b;
		}
	}
	while(key1 == 0 || key2 == 0){ }
}   
/**********************************************************************************************/	

if(MENU == 4){
	turn(min%10);
	displayN2();
	if(key1 == 0 && key2 == 1){	
		delay_ms(200);//去抖
		if(key1 == 0 && key2 == 1){
			MENU = 0;
		}
	}
	if(key2 == 0 && key1 == 1){	
		delay_ms(200);//去抖
		if(key2 == 0 && key1 == 1){
			a = min/10;
			b = min%10;
			b++;
			if(b > 9){
				b = 0;
			}
			min = a*10 + b;
			sec = 0;//调时完成后把秒清0
		}
	}
	while(key1 == 0 || key2 == 0){ }
}
}      
}   
/**********************************************************************************************	 
* 杜洋工作室 DoYoung Studio
* 与电子爱好者同行 www.DoYoung.net
/**********************************************************************************************/
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -