YangHY 发表于 2025-12-28 11:51:56

注意取反:

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 */


};

YangHY 发表于 2025-12-28 11:53:24

编译连接下载,在虚拟桌面就看到效果:

YangHY 发表于 2025-12-28 11:55:26

二、虚拟数码管:

功能1:在数码管上显示字符串

YangHY 发表于 2025-12-28 11:58:25

功能2和功能3功能4


YangHY 发表于 2025-12-28 12:05:42

任务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;
        }       
       
}

YangHY 发表于 2025-12-28 12:18:43

怎样体现出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

YangHY 发表于 2025-12-28 12:40:16

这个功能2 选择比较丰富,我们选10进制:

YangHY 发表于 2025-12-28 12:45:18

2个16位数,组合成一个32位数
KEY_Count = KEY1_COUNT *10000 + KEY2_COUNT;//2个次数整合为1个方便显示

SEG7_ShowLong((long) KEY_Count ,10);

记得上面的新函数要声明一下,才能调用:



YangHY 发表于 2025-12-28 12:47:13

调用的地方还是在task.c

500ms一次

YangHY 发表于 2025-12-28 13:07:36

下载后,LED是OK的

但是数码管只是显示0

有问题:

页: 30 31 32 33 34 35 36 37 38 39 [40] 41 42 43 44 45 46 47 48 49
查看完整版本: 第一课 序言《AI8051U的特点》