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

📄 clock.c

📁 PIC单片机C语言程序设计实例精粹
💻 C
字号:
#include "clock.c"

void init()
{
	OPTION=0b00000111 ; 
	TMR0=56;    				//设置200次机器周期溢出
	INTCON =0b10100000 ; 		// 使能定时器中断
	TRISD=0;    
	lcd_init();
	time_count = 0;
	curr_menu = normol_run;
	curr_cl_hour = 0;
	curr_cl_min = 0;
	curr_cl_sec = 0;
	curr_al_hour = 0;
	curr_al_min = 0;
	curr_al_sec = 0;
	temp_cl_hour = 0;
	temp_cl_min = 0;
	temp_cl_sec = 0;
	temp_al_hour = 0;
	temp_al_min = 0;
	temp_al_sec = 0;
}

void lcd_init()
{
	delayMs(300);		//最好延时300ms以上
	lcd_write(0x429,12);			//专用初始化命令
	lcd_write(0x418,12);			//内部RC振荡器
	lcd_write(0x401,12);			//开启振荡器
	lcd_write(0x403,12);			//开显示器
}

void interrupt ISR(void)
{
	…        //保护现场、屏蔽中断(根据实际工程修改)
		if(time_out>0)
			time_out--;
		time_count++;
		if((INTCON&0b00000100)!=0)
		{	
			INTCON=INTCON&0b11111011; 
			TMR0=0;
			PORTD++; }	
}
…      //恢复现场、使能中断(根据实际工程修改)
}

void count_time()
{
	if(time_count == 5000)
	{
		time_count = 0;
		curr_cl_sec++;
	}
	if(curr_cl_sec == 60)
	{
		curr_cl_sec = 0;
		curr_cl_min++;
	}
	if(curr_cl_min == 60)
	{
		curr_cl_min = 0;
		curr_cl_hour++;
	}
	if(curr_cl_hour == 24)
	{
		curr_cl_sec = 0;
	}
	if( (curr_cl_hour == curr_al_hour)
		&& (curr_cl_min == curr_al_min)
		&&( curr_cl_sec == curr_al_sec)
	{
		bell();		//蜂鸣器响起
	}
	if(time_out<=0)
	{
		curr_menu = normal_run;
		time_out = 0;
	}
	else if(time_out%800==0)
	{
		flag_flash = ~flag_flash;		//每0.8秒闪烁一次
	}
}

void lcd_write(int dat,int length)
{
	int temp,i;
	nCS;
	for(i=0;i=length;i++)
	{
		temp = dat<<i;
		nWR;
		if( length = 12)
		{
			if( temp & 0x800 ==0x800)
				DATA = 1;
			else	
				DATA =0;
		}
		if( length = 13)
		{
			if( temp & 0x1000 ==0x1000)
				DATA = 1;
			else	
				DATA =0;
		}
		WR;
		delayMs(100);
	}
	CS;
	WR
		DATA;
}

void lcd_refresh()
{
	display_front();
	display_hour();
	display_min();
	display_sec();
}

void display_front()
{
	switch( curr_menu )
	{
	case normal_run :
		display_number(13,1,0);			//第一个数码管不显示任何数字
		display_number(13,2,0);			//第二个数码管不显示任何数字
		break;
	case clock_hour :
	case clock_min :
	case clock_sec :
		display_number(10,1,0);			//第一个数码管显示"A"
		display_number(12,2,0);			//第二个数码管显示"L"
		break;
	case alarm_hour :
	case alarm_min :
	case alarm_sec :
		display_number(11,1,0);			//第一个数码管显示"C"
		display_number(12,2,0);			//第二个数码管显示"L"
		break;
	default: break;
	}
}

void display_hour()
{
	if(curr_menu == clock_hour)
	{
		display_number(curr_cl_hour/10,3,0);		
		display_number(curr_cl_hour%10,4,1);	
	}
	if(curr_menu == alarm_hour)
	{
		display_number(curr_al_hour/10,3,0);	
		display_number(curr_al_hour%10,4,1);	
	}
}

void display_min()
{
	if(curr_menu == clock_min)
	{
		display_number(curr_cl_min/10,5,0);		
		display_number(curr_cl_min%10,6,1);	
	}
	if(curr_menu == alarm_min)
	{
		display_number(curr_al_min/10,5,0);	
		display_number(curr_al_min%10,6,1);	
	}
}

void display_sec()
{
	if(curr_menu == clock_sec)
	{
		display_number(curr_cl_sec/10,7,0);		
		display_number(curr_cl_sec%10,8,1);	
	}
	if(curr_menu == alarm_sec)
	{
		display_number(curr_al_sec/10,7,0);	
		display_number(curr_al_sec%10,8,1);	
	}
}

void display_number(int number, int section, int dot)
{
	int temp_dat;
	if(dot ==1)
		show_arry[0]=array[2*number]&0x1;
	temp_dat = 0x1400 + (2*section)<<4 + show_array[0];
	lcd_write(temp_dat, 13);
	temp_dat = 0x1400 + (2*section+1)<<4 + show_array[1];
	lcd_write(temp_dat, 13);
}

int keyboard(void)
{
	int keyvalue,key;
	keyvalue = PORTB;
	keyvalue = keyvalue & 0x0f
		switch(keyvalue)
	{
		case 0x1:
			key = OK;
			break;
		case 0x2:
			key = subtract;
			break;
		case 0x4:
			key = add;
			break;
		case 0x8:
			key = mode;
			break;
		default: break;
	}
	return keyvalue;
}

void key_cmd()
{
	switch key:
	{
	case mode:
		mode_fun();
		time_out = 50000;
		break;
	case add:
		add_fun();
		time_out = 50000;
		break;
	case subtract:
		subtract_fun();
		time_out = 50000;
		break;
	case ok:
		ok_fun();
		time_out = 50000;
		break;
	default:break;
	}
}

void mode_fun()
{
	if(curr_menu<alarm_sec)
		curr_menu++;
	if(curr_menu == alarm_sec)
		curr_menu = normol_run;
}

void add_fun()
{
	switch( curr_menu )
	{
	case clok_hour:
		temp_cl_hour++;
		break;
	case clok_min:
		temp_cl_min++;
		break;
	case clok_sec:
		temp_cl_sec++;
		break;
	case alarm_hour:
		temp_al_hour++;
		break;
	case alarm_min:
		temp_al_min++;
		break;
	case alarm_sec:
		temp_al_sec++;
		break;
	}
}

void subtract_fun()
{
	switch( curr_menu )
	{
	case clok_hour:
		temp_cl_hour--;
		break;
	case clok_min:
		temp_cl_min--;
		break;
	case clok_sec:
		temp_cl_sec--;
		break;
	case alarm_hour:
		temp_al_hour--;
		break;
	case alarm_min:
		temp_al_min--;
		break;
	case alarm_sec:
		temp_al_sec--;
		break;
	}
}

void enter_fun()
{
	if(time_out >= 0)
	{
		curr_cl_hour = temp_cl_hour ;
		curr_cl_min = temp_cl_min ;
		curr_cl_sec = temp_cl_sec ;
		curr_al_hour = temp_al_hour ;
		curr_al_min = temp_al_min ;
		curr_al_sec = temp_al_sec ;
	}
}



void main()
{
	init();
	while(1)
	{
		count_time();
		keyboard();
		key_cmd();
		lcd_refresh();
	}
}

⌨️ 快捷键说明

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