?? 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 + -