📄 text1.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 + -