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

📄 4_bit_digital_clock.c

📁 《爱上单片机》配书光盘
💻 C
字号:
	   /*********************************************************************************************/

#include <STC12C2052AD.H> //STC头文件

/**********************************************************************************************/
//“程序开发调试设置项”
#define DY_LI			9	 //设置LED显示的亮度(值域:1~9)
#define DY_DELAY		12 	//设置每一个点显示的时间长度(1~20)
/**********************************************************************************************/
sbit	DY_LED1_H1	=P3 ^ 0; //设置LED点阵屏连接的I/O口
sbit	DY_LED1_H2	=P3 ^ 1; //设置LED点阵屏连接的I/O口
sbit	DY_LED1_H3	=P3 ^ 2; //设置LED点阵屏连接的I/O口
sbit	DY_LED1_H4	=P3 ^ 3; //设置LED点阵屏连接的I/O口

sbit	DY_LED1_L1	=P1 ^ 0; //设置LED点阵屏连接的I/O口
sbit	DY_LED1_L2	=P1 ^ 1; //设置LED点阵屏连接的I/O口
sbit	DY_LED1_L3	=P1 ^ 2; //设置LED点阵屏连接的I/O口
sbit	DY_LED1_L4	=P1 ^ 3; //设置LED点阵屏连接的I/O口
sbit	DY_LED1_L5	=P1 ^ 4; //设置LED点阵屏连接的I/O口
sbit	DY_LED1_L6	=P1 ^ 5; //设置LED点阵屏连接的I/O口
sbit	DY_LED1_L7	=P1 ^ 6; //设置LED点阵屏连接的I/O口
sbit	DY_LED1_L8	=P1 ^ 7; //设置LED点阵屏连接的I/O口

//sbit	DY_BEEP		=P2 ^ 2; //扬声器
//sbit	DY_KEY1		=P0 ^ 2; //按键1(M键)(连接在P1.3和P0.2,读P0.2为低时表示有按键动作)
//sbit	DY_KEY2		=P3 ^ 0; //按键2(+键)(连接在P4.6和P3.0,读P3.0为低时表示有按键动作)
//sbit	DY_KEY3		=P3 ^ 6; //按键3(-键)(连接在P2.4和P3.6,读P3.6为低时表示有按键动作)

#define DY_P1M0SET		0x00 //设置I/O口工作方式//00000000(左到右,高到低位)
#define DY_P1M1SET		0x00 //设置I/O口工作方式//00101000
#define DY_P3M0SET		0x00 //设置I/O口工作方式//00000000
#define DY_P3M1SET		0xff //设置I/O口工作方式//10010100
data 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) 
};
/*********************************************************************************************/
void delay (unsigned int a){ // 用于点扫描的延时
	unsigned int i;
	while( --a != 0){
		for(i = 0; i < DY_DELAY; i++); 
	}   				   
}
/*********************************************************************************************/
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){
	P1 = ~DY_P1M1SET; //关所有显示
	P3 = ~DY_P3M1SET;
	delay(10-DY_PWM); 
}
/*********************************************************************************************/
void displayHH1 (unsigned char d){ //第1列横向显示程序
	unsigned char i;
	i = d & 0x01;
	if(i == 0x01){
		DY_LED1_H1 = 1;DY_LED1_L1 = 0;}delay(DY_PWM);dis_off();
	i = d & 0x02;
	if(i == 0x02){
		DY_LED1_H1 = 1;DY_LED1_L2 = 0;}delay(DY_PWM);dis_off();
	i = d & 0x04;
	if(i == 0x04){
		DY_LED1_H1 = 1;DY_LED1_L3 = 0;}delay(DY_PWM);dis_off();
	i = d & 0x08;
	if(i == 0x08){
		DY_LED1_H1 = 1;DY_LED1_L4 = 0;}delay(DY_PWM);dis_off();
	i = d & 0x10;
	if(i == 0x10){
		DY_LED1_H1 = 1;DY_LED1_L5 = 0;}delay(DY_PWM);dis_off();
	i = d & 0x20;
	if(i == 0x20){
		DY_LED1_H1 = 1;DY_LED1_L6 = 0;}delay(DY_PWM);dis_off();
	i = d & 0x40;
	if(i == 0x40){
		DY_LED1_H1 = 1;DY_LED1_L7 = 0;}delay(DY_PWM);dis_off();
	i = d & 0x80;
	if(i == 0x80){
		DY_LED1_H1 = 1;DY_LED1_L8 = 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();
	i = d & 0x80;
	if(i == 0x80){
		DY_LED1_H2 = 1;DY_LED1_L8 = 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();
	i = d & 0x80;
	if(i == 0x80){
		DY_LED1_H3 = 1;DY_LED1_L8 = 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();
	i = d & 0x80;
	if(i == 0x80){
		DY_LED1_H4 = 1;DY_LED1_L8 = 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;
	P3M1 = 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){
				diplay_data (1,disdata[TIME_MM/10]);
				diplay_data (2,disdata[TIME_MM%10]);
				diplay_data (3,disdata[TIME_SS/10]+0x80);
				diplay_data (4,disdata[TIME_SS%10]+0x80);

	}
}
/**********************************************************************************************/	
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;   
}
/**********************************************************************************************/	
/*************************************************************
* 杜洋工作室 DoYoung Studio
* 与电子爱好者同行 www.DoYoung.net
/*************************************************************/

⌨️ 快捷键说明

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