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

📄 kk.c

📁 实现红绿灯的设置和及时设置的转换
💻 C
字号:
#include<kk.h>

uchar min=0;
uchar sec=0;
uchar flag_return=0;
bit light_red_green=0;
bit light_yellow=0;

uint sec_counter=0;

void main (void) {	
	while(1){
		//min=0;
		//sec=0;
		//P0=0;
		//P2=0x80;
		init_device();
		/*P1=0xff;//查询按键,选择功能,keyA为分秒计时,keyA为交通灯
		if(keyA==0){
		 	delayMs(1);
			if(keyA==0){
			 	while(!keyA);
				min=0;
				sec=0;
				display_DCB();				
			}
		}		
		if(keyB==0){
		 	delayMs(1);
			if(keyB==0){
			 	while(!keyB);
				min=0;
				sec=0;
				display2();
			}
		} */
		key_scan();
	}

}
void init_device(void)
{
  		min=0;
		sec=0;
		P0=0;
		P2=0x80;

}

void key_scan(void)
{
 		P1=0xff;//查询按键,选择功能,keyA为分秒计时,keyA为交通灯
		if(keyA==0){
		 	delayMs(1);
			if(keyA==0){
			 	while(!keyA);
				min=0;
				sec=0;
				display_DCB();				
			}
		}		
		if(keyB==0){
		 	delayMs(1);
			if(keyB==0){
			 	while(!keyB);
				min=0;
				sec=0;
				display2();
			}
		}

}

void display_DCB (void) {
	//此处启动定时器
	StartTimer0();
	while(1){
		if(flag_return==1) {flag_return=0;break;}//是否返回选择
	 	//P0=0x1f&(0xf0|(min/10));
		//P0=0x2f&(0xf0|(min%10));
		//P0=0x4f&(0xf0|(sec/10));
		//P0=0x8f&(0xf0|(sec%10));
		P0 = 0x10|(min/10);
		P0 = 0x20|(min%10);
		P0 = 0x40|(sec/10);
		P0 = 0x80|(sec%10);
		P1=0xff;//查询按键,keyC停止,keyD返回选择
		if(keyC==0){ //按下keyC停止
		 	delayMs(1);
			if(keyC==0){
					while(!keyC);
					TR0=0;
					while(1){
						P0=0x1f&(0xf0|(min/10));
						P0=0x2f&(0xf0|(min%10));
						P0=0x4f&(0xf0|(sec/10));
						P0=0x8f&(0xf0|(sec%10));
						P1=0xff;//查询按键,keyC启动,keyD返回选择	
						if(keyC==0) {
						 	delayMs(1);
							if(keyC==0) {
							 	while(!keyC);
								TR0=1;
								break;
							}
						}
						if(keyD==0) {
						 	delayMs(1);
							if(keyD==0) {
							 	while(!keyD);
								flag_return=1;
								break;
							}
						}
					}
			}
		}
			
		if(keyD==0){
		 	delayMs(1);
			if(keyD==0){
			 	while(!keyD);
				flag_return=1;
			}
		}
	}
}

void display2(void) {
	StartTimer1();
	P2=0x91;//绿灯亮
	while(1){
		if(flag_return==1) {flag_return=0;break;}//是否返回选择
		P0=0x1f&(0xf0|((25-sec)/10));P0=0x1f&(0xf0|((25-sec)/10));
		P0=0x1f&(0xf0|((25-sec)/10));P0=0x1f&(0xf0|((25-sec)/10));
		P0=0x2f&(0xf0|((25-sec)%10));delayUs(1);
	 	P0=0x4f&(0xf0|((25-sec)/10));delayUs(1);
		P0=0x8f&(0xf0|((25-sec)%10));				
		P1=0xff;//查询按键,keyC停止,keyD返回选择
		if(keyC==0){ //按下keyC停止
		 	delayMs(1);
			if(keyC==0){
					while(!keyC);
					TR1=0;
					while(1){
						P0=0x1f&(0xf0|((25-sec)/10));P0=0x1f&(0xf0|((25-sec)/10));
						P0=0x1f&(0xf0|((25-sec)/10));P0=0x1f&(0xf0|((25-sec)/10));
						P0=0x2f&(0xf0|((25-sec)%10));delayUs(1);
					 	P0=0x4f&(0xf0|((25-sec)/10));delayUs(1);
						P0=0x8f&(0xf0|((25-sec)%10));
						P1=0xff;//查询按键,keyC启动,keyD返回选择	
						if(keyC==0) {
						 	delayMs(1);
							if(keyC==0) {
							 	while(!keyC);
								TR1=1;
								break;
							}
						}
						if(keyD==0) {
						 	delayMs(1);
							if(keyD==0) {
							 	while(!keyD);
								flag_return=1;
								break;
							}
						}
					}
			}
		}
			
		if(keyD==0){
		 	delayMs(1);
			if(keyD==0){
			 	while(!keyD);
				flag_return=1;
			}
		}
	}
}

void StartTimer0(void)
{
	TMOD=0x01;
	TH0=0xd8;
	TL0=0xf0; //10ms计数;
	EA=1;
	ET0=1;
	TR0=1;
	TR1=0;
	sec_counter=0;
}

void timer0() interrupt 1
{
 	TH0=0xd1;
	TL0=0xf0;
	sec_counter++;
	if(sec_counter==100) {	//定时1s到时
	 	sec_counter=0;
		sec++;
		if(sec==60){
		 	sec=0;
			min++;
			if(min==60) {min=0;}
		}
	}	
}

void StartTimer1(void)
{
	TMOD=0x10;
	TH1=0xd8;
	TL1=0xf0; //10ms计数;
	EA=1;
	ET1=1;
	TR1=1;
	TR0=0;
	sec_counter=0;
}

void timer1() interrupt 3
{
 	TH1=0xd8;
	TL1=0xf0;
	sec_counter++;
	if(sec_counter==100) {	//定时1s到时,秒加一
	 	sec_counter=0;
		sec++;
		if(sec==25){
			sec=0;
			light_red_green=~light_red_green;//30秒后,红绿灯交换
			if(light_red_green==0)P2=0x91;
			if(light_red_green==1)P2=0x8a;
		}
	}
	if(sec_counter%5==0&&sec>=20) {
		light_yellow=~light_yellow;//绿灯变红灯时黄灯闪10秒
		//if(light_red_green==0&&light_yellow==0)P2=0x90;
		//if(light_red_green==0&&light_yellow==1)P2=0x94;
		//if(light_red_green==1&&light_yellow==0)P2=0x82;
		//if(light_red_green==1&&light_yellow==1)P2=0xa2;
		if(light_red_green==0&&light_yellow==0)P2 = 0x91;
		if(light_red_green==0&&light_yellow==1)P2 = 0xb5;
		if(light_red_green==1&&light_yellow==0)P2 = 0x8a;
		if(light_red_green==1&&light_yellow==1)P2 = 0xae;
	}	
}

void delayMs(uchar ms) {
	uchar i;
 	while(ms--){ for(i=0;i<250;i++){;}};
}
void delayUs(uchar ms) {
	uchar i;
 	while(ms--){ for(i=0;i<1;i++){;}};
}

⌨️ 快捷键说明

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