注意取反:
P10_STATE = !P10_STATE;//!取反就是真和假之间
LED40_SetPort(2,~P2_STATE); //点亮P20端口,这个是点亮虚拟的,~是按位取反
实际是500ms取反一次,知道为什么吗?
是因为周期性调度函数:
static TASK_COMPONENTS Task_Comps[]=
{
//状态计数周期函数
// {0, 300, 300, LED0_Blink}, /* task 1 Period: 300ms */
// {0, 600, 600, LED1_Blink}, /* task 1 Period: 600ms */
// {0, 900, 900, LED2_Blink}, /* task 1 Period: 600ms */
{0, 10, 10, KEY_Task}, /* task 1 Period: 600ms */
{0, 500, 500, TASK_1}, /* task 1 Period: 500ms */
{0, 500, 500, TASK_2}, /* task 1 Period: 500ms */
// {0, 10, 10, TASK_3}, /* task 1 Period: 500ms */
};
编译连接下载,在虚拟桌面就看到效果:
二、虚拟数码管:
功能1:在数码管上显示字符串
功能2和功能3功能4
任务2:左边数码管显示P32按下次数,
右边数码管显示P33按下次数
每10ms检测按键:
先看按键函数:
u16 KEY1_COUNT = 0; //P32按钮计数
u16 KEY2_COUNT = 0; //P33按钮计数
void KEY_Task(void)
{
// ------------P32按钮计数------------
if( P32 == 0 )
{
Key_Vol++;
if( Key_Vol==5 )
{
KEY1_COUNT++;
}
}
else
{
Key_Vol = 0;
}
// ------------P33按钮计数------------
if( P33 == 0 )
{
Key_Vol_2++;
if( Key_Vol_2==5 )
{
KEY2_COUNT++;
}
}
else
{
Key_Vol_2 = 0;
}
}
怎样体现出P32P33按键按下的次数?
void TASK_2( void )
{
KEY_Count = KEY1_COUNT *100 + KEY2_COUNT;//2个次数整合为1个方便显示
//一超出65534就乱了,根源应该是计数器溢出中断?
//65536代表的是一个16位计数器的最大值。这个计数器
//由高8位(TH0)和低8位(TL0)组成,可以存储2^16=65536个
//数。当计数器从65536开始计数时,经过一段时间后会溢出并产生中断。
//printf("按键按下次数\xfd:%d 次 \r\n",(signed long)KEY_Count);
// KEY_Count = 88888888;
SEG7_ShowLong((long) KEY_Count ,10);
//SEG7_ShowFloat(KEY_Count);
}
我实际运行发现KEY_Count不能超过65534
这个功能2 选择比较丰富,我们选10进制:
2个16位数,组合成一个32位数
KEY_Count = KEY1_COUNT *10000 + KEY2_COUNT;//2个次数整合为1个方便显示
SEG7_ShowLong((long) KEY_Count ,10);
记得上面的新函数要声明一下,才能调用:
调用的地方还是在task.c
500ms一次
下载后,LED是OK的
但是数码管只是显示0
有问题: