当前位置:首页 > 芯闻号 > 充电吧
[导读]要求:8个流水灯靠一个按键启动,3种不同的点亮方式。按一下,显示第一种方式,再按一下,切换方式,再一下,再切换。不用中断。----------------不让使用中断,这个要求的比较特殊。虽然没有明确


要求:8个流水灯靠一个按键启动,3种不同的点亮方式。

按一下,显示第一种方式,再按一下,切换方式,再一下,再切换。

不用中断。

----------------

不让使用中断,这个要求的比较特殊。

虽然没有明确要求流水灯的切换时间,但是,延时几百毫秒,也是应该有的。

而对按键的检测,应该是在 10 毫秒左右就检测一次。

那么,只好在延时函数中,进行检测了。

做而论道写的程序如下,该答案已经在今天 18:05 被提问者采纳,

----------------

P3.7 连接按键,P2 外接 LED。


没有使用中断。


#include

#include

sbit key = P3^7;

unsigned  char  kc, kb, kz, mode = 2, aa = 0xff;

void delay10ms(void)

{

    unsigned  int  i, j;

    for (i = 0; i < 60; i++)  for (j = 0; j < 20; j++);//循环约 10ms


    kc = ~key;           //读入按键,按下时 kc=1

    kz = kc ^ kb;        //和上次的相异或

    kb = kc;             //保存本次键值


    if (kz & kb)  {      //如果是刚按下

      mode++;

      mode %= 3;

      if (mode == 0)  aa = 0x7f;   //3种方式

      if (mode == 1)  aa = 0x3f;

      if (mode == 2)  aa = 0x1f;

    }

}


main()

{

    char  i;

    while(1)   {

      for (i = 0; i < 50; i++)  {

        delay10ms();

        if (kz & kb)  break;

      }

      P2 = aa;

      aa = _cror_(aa, 1);

    }

}


本程序给出的三种方式,显得简陋了一些。

试试看吧。


提问者评价:谢谢了。

题目链接:http://zhidao.baidu.com/question/1493910527414282819.html


----------------


上述的程序,可以用下图来仿真:



----------------


后来,觉得上述三种方式,确实太简陋,就又改动了一下。

现在,可以实现四种方式,流水的方向、速度,都是可以变化的。


程序如下:

#include

#include


sbit key = P3^7;


char  kc, kb, kz, mode = 3, aa = 0xff, bb = 50;


void delay10ms(void)

{

    int  i, j;

    for (i = 0; i < 60; i++)  for (j = 0; j < 20; j++);

    kc = ~key;

    kz = kc ^ kb;

    kb = kc;

    if (kz & kb)  {

      mode++;

      mode %= 4;

      if (mode == 0)  {bb = 25; aa = 127;}  //高速

      if (mode == 2)  {bb = 50; aa = 63;}   //低速

    }

}


main()

{

    char  i;

    while(1)   {

      for (i = 0; i < bb; i++)  {

        delay10ms();

        if (kz & kb)  break;

      }

      P2 = aa;

      if (mode % 2)  aa = _cror_(aa, 1);  //右移

      else           aa = _crol_(aa, 1);  //左移

    }

}

----------------

后记:

在本程序中,流水灯和检测按键,都不耽误,互不干扰。

对于按键检测,也包括了消抖、确认释放等环节,不会出现误操作。

虽然没有用到中断,按键的反应,依然很灵敏。

虽然没有用到定时器,各个部分时间段,依然很精确,至少用肉眼是看不出来差别的。

很多人编写延时程序,只是知道延时,却不知道在延时期间,还是可以干很多活的。


如果能学会本程序的编程思路,实现多任务的环境,就不难了。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在单片机的世界里,“字节”(Byte)是一个贯穿始终的核心概念。从存储数据到执行指令,从变量定义到外设通信,字节无处不在。很多初学者在学习单片机时,往往更关注复杂的程序逻辑和外设驱动,却忽略了字节这个基础知识点,导致在后...

关键字: 单片机 字节

在单片机的数字逻辑中,我们通常最关注的是高电平和低电平两种状态,它们构成了二进制数字世界的基础。然而,除了这两种状态之外,还有一种至关重要但常常被忽视的状态——高阻态(High Impedance State)。高阻态就...

关键字: 单片机 高阻态

对于PIC入门者来说,不需要盲目追求高端开发板,一块功能均衡、资料丰富的入门款就能满足需求。比如Microchip官方推出的PIC16F84A开发板,它搭载经典的8位PIC内核,引脚布局清晰,自带LED、按键等基础外设,...

关键字: PIC 单片机

该低功耗器件支持5V运行,在实现高性能的同时,能有效保障系统简洁性与成本效益

关键字: MCU 单片机 工业自动化

CH558T 采用 BASIC-52 系统,并具备蓝牙连接功能。CH558T 的运行频率为 48 MHz,拥有 4KB 的 xRAM,足以满足常规应用需求。

关键字: 单片机 BASIC-52 系统 CH558T

RGB显示屏凭借高分辨率、真彩色显示优势,在工业控制、智能终端、消费电子等领域应用广泛。裸屏RGB显示屏无内置驱动电路,需搭配专用LCD驱动芯片才能与单片机协同工作,其核心作用是将单片机输出的图像数据转换为屏幕可识别的R...

关键字: 显示屏 驱动芯片 单片机

在嵌入式系统开发中,单片机(MCU)作为控制核心,广泛应用于工业自动化、智能家居等领域。然而,当需要控制继电器或电磁阀等大功率负载时,直接连接单片机引脚往往会导致系统故障甚至硬件损坏。

关键字: 单片机 MCU

在嵌入式系统领域,单片机作为核心控制单元,其软硬件结合机制是理解电子设备运行逻辑的关键。

关键字: 单片机 CPU‌

物联网与智能控制蓬勃发展,温度传感器作为感知环境温度变化的关键元件,广泛应用于工业生产、智能家居、医疗设备等众多领域。而单片机凭借其强大的控制能力和灵活的编程特性,成为处理温度传感器数据的理想平台。下面将深入剖析单片机程...

关键字: 单片机 温度传感器

在医疗科技飞速发展的当下,便携式医疗设备以其便捷、高效的特点,逐渐成为人们日常健康管理的重要工具。其中,便携式心率监测仪凭借其实时监测心率、为健康状况提供关键数据的功能,受到了广泛关注。而单片机程序开发作为便携式心率监测...

关键字: 单片机 医疗设备
关闭