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

📄 text1.c

📁 一个应用了RTX 51 TINY的工程
💻 C
字号:
/*------------------------------------------------------------------------
本实例使用12MHZ晶振,采用at89x5x系列单片机,故时间片为10ms
另附proteus仿真工程
制作者:周乾伟
2008年3月31日编写完成
email:huntstart@163.com
-------------------------------------------------------------------------*/
#include <rtx51tny.h>
#include <at89x51.h>
#include <lcd.h>
const seven_seg[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,
					 0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳0123456789,后十位带点。
unsigned char i=0,j=0,hour=0,minute=0,sec=0,t,a=0;
unsigned int count=0;
unsigned char key_v1[17]={'i','l','o','v','\0'};
unsigned char key_v2[17]={'i','l','o','v','\0'};

bit b=1,signal_p1=0;
void job0 (void) _task_ 0
{
	init_LCD();
	os_create_task(1);//键盘扫描任务
	os_create_task(2);//键值显示任务
	os_create_task(3);//计时任务
	os_create_task(4);//时间显示任务
	os_create_task(5);
	os_delete_task(0);//任务0相当于一个父进程,它的任务是创建子进程,完成使命后就可以取消了,免得暂用cpu资源
}
void job1 (void) _task_ 1
{
	while(1)
	{//每一个任务都必须是一个死循环
		if(b==1) 
			os_send_signal (4);//当无按键动作时,发送信号量给任务4,半秒刷时,有动作发生后,若连续10s无动作,返回刷时状态
		else if(a>100) 
		{
			os_send_signal (4);
			a=0;
			b=1;
		}
		i=scan(key_v1);//启动按键扫描
	
		if(i==100) //如果返回i!=100说明有按键,发送信号量给任务2
		{
			if(VS_key_V(key_v1,key_v2)==0)//如果于前次按键不一样,怎显示
			{
				StrToStr( key_v1, key_v2);

				os_send_signal (2);
				b=0;
				
				
			//	os_wait(K_TMO,1,0);
				
			}
			else a++;
		}
		if((a==15)&&(i==100))
		{
			count++;
			a=0;
		}
		if(i!=100) a++;
		os_wait(K_TMO,10,0);//修改tick,可以改变扫描频率
	}
}
void job2 (void) _task_ 2
{
	
	while(1)
	{	
		os_wait1(K_SIG);//等待信号量,若信号量没到,则任务2处于挂起状态
		clear_LCD();
		//clear_LCD();

		gotoxy(1,0);
		display_LCD_string(key_v1);
		//StrToStr( key_v1, key_v2);
	//	gotoxy(1,0);
		//display_LCD_string(key_v2);
		
		a=0;
		count=0;	
		os_clear_signal (2);//释放信号量
	//	os_wait(K_TMO,1000,0);
	}
}
void job3 (void) _task_ 3
{
	while(1)
	{	
		sec++;//计秒
		if(sec==60){minute++;sec=0;}
		if(minute==60){hour++;minute=0;}
		os_wait(K_IVL,100,0);//等待时间片中断,没100个时间片发生一次中断,也就是1s钟,任务3运行一次
	}
}
void job4 (void) _task_ 4
{
	
	while(1)
	{
		
		
		os_wait1(K_SIG);//等待信号量
		//os_wait(K_TMO+K_SIG,50,0);
		if(signal_p1!=0)	os_wait(K_TMO,1,0); 
		signal_p1=1;
		P2|=0x0f;
		clear_LCD();
		t=hour/10+48;		
		gotoxy(1,4);
		write_LCD_data(t);
		t=hour%10+48;
		write_LCD_data(t);
		write_LCD_data(':');
		t=minute/10+48;		
		write_LCD_data(t);
		t=minute%10+48;
		write_LCD_data(t);
		write_LCD_data(':');
		t=sec/10+48;		
		write_LCD_data(t);
		t=sec%10+48;
		write_LCD_data(t);
		gotoxy(1,0);
		signal_p1=0;
		os_wait(K_TMO,50,0);
		os_clear_signal(4);//释放信号量
	}
	
}
void job5 (void) _task_ 5
{
	while(1)
	{
		//os_wait(K_TMO,5,0);
		
		if(signal_p1!=0)	os_wait(K_TMO,1,0); 
		signal_p1=1;
		P2|=0x0f;
		P1=seven_seg[count%10];
		P2&=0xfe;
		delay100us(24);
		P2|=0x0f;
		P1=seven_seg[(count/10)%10];
		P2&=0xfd;
		delay100us(24);
		P2|=0x0f;
		P1=seven_seg[(count/100)%10];
		P2&=0xfb;
		delay100us(24);
		P2|=0x0f;
		P1=seven_seg[(count/1000)%10];
		P2&=0xf7;
		delay100us(24);
	//	up++;
		if(count>=10000) count=0;
		P2|=0x0f;
		signal_p1=0;
		os_wait(K_TMO,1,0);
	}
}

⌨️ 快捷键说明

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