找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2648|回复: 11
打印 上一主题 下一主题
收起左侧

我这个思路对吗?单片机一键切换多功能系统设计

[复制链接]
跳转到指定楼层
楼主
完成一键切换多功能系统设计1 个按键 K,由 P3.0 控制,8 个 LED发光二极管,由 P1 口控制。(1)系统上电时 8 个 LED 全灭(2)第一次按下开关 K 的时候,8 个LED 全亮;第二次按下开关 K 的时候,高四位 LED亮;第三次按下开关 K 的时候,交叉亮灭;第四次按下开关 K 的时候,低四位 LED亮。再按开关 K 的时候,又从第一次开始。

单片机源程序如下:
#include <reg51.h>
void delay(unsigned char i)
{
        unsigned char j,k;
        for(k=0;k<i;k++)
        for(j=0;j<255;j++);
}
void lsd1()
{
        P1=0xff;
        }
        void lsd2()
        {
P1=0x00;
                }
void lsd3()
{
P1=0x01;
}
        void main()
        {
                unsigned char key_count,l;
                P3=0xff;
                for(l=0;l<5;l++)
                        key_count=l
                while(1)
                {
                        if(key_count=0)lsd1();
                                if(key_count=1)lsd2();
                                if(key_count=2)lsd3();
                                if(key_count=3)0x0f;
                                if(key_count=4)0xf0;
                        }
        }
请问我这个思路对吗,不对在哪里
刚刚学习单片机,不太会写

捕获.PNG (79.44 KB, 下载次数: 119)

捕获.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2021-10-4 18:10 | 只看该作者
              while(1)
                {
                        if(key_count=0)lsd1();
                                if(key_count=1)lsd2();
                                if(key_count=2)lsd3();
                                if(key_count=3)0x0f;
                                if(key_count=4)0xf0;
                        }

这是,你这个程序的核心部分, 虽然,你里面很多 if, 看似这个程序会有变化,但是你这个程序没有任何中断。所以,key_count 永远不会发生改变, 在进入while(1) 的时候,就决定了,这个程序会永远在某一个分支里面无休止的循环。
回复

使用道具 举报

板凳
ID:969664 发表于 2021-10-5 10:51 | 只看该作者
188610329 发表于 2021-10-4 18:10
while(1)
                {
                        if(key_count=0)lsd1();

那应该怎么改呀
回复

使用道具 举报

地板
ID:883031 发表于 2021-10-5 16:49 | 只看该作者
加个按键计数器是对的,但是你程序中没有相应的计数程序,
回复

使用道具 举报

5#
ID:624769 发表于 2021-10-5 17:24 | 只看该作者

你要么,在 while(1)  里面增加一个 判断 按键  赋值 Key_count 的代码。

要么,做一个中断程序,用来根据按键修改Key_count
回复

使用道具 举报

6#
ID:624769 发表于 2021-10-5 19:10 | 只看该作者

最后,在补充一下, 你的 if 判断语句, 判断是否相等,应该是双等号,==  而不是单等号。
回复

使用道具 举报

7#
ID:123289 发表于 2021-10-6 11:33 | 只看该作者
1、做两个计数器X和Y,每按一次X+1。
2、显示程序:当X<>Y时,对LED进行显示切换,显示的原则:根据X/4的余数(0、1、2、3)进行,你想法中的4种显示。显示切换后,让Y=X。
完了,就这么简单。
回复

使用道具 举报

8#
ID:130230 发表于 2021-10-8 15:11 | 只看该作者
用状态机来写这种多状态的程序很适合。
回复

使用道具 举报

9#
ID:743654 发表于 2021-10-9 08:51 | 只看该作者
四种情况分别设置标志位,通过标志位判断是哪种情况,你的按键定义和判断在哪,没看到,P3.0为串口接收端,最好不要用来接按键
回复

使用道具 举报

10#
ID:831736 发表于 2021-10-11 16:11 | 只看该作者
给你一个按键按一次加1的程序,然后你自己去想吧。
if(k1==0)//按键按下
while(1)
  {
  xianshi();//把正常显示的程序写在这里
  if(k1==1)
   {
   _++;//判断按键的数值加1
   break;
   }
  }
这样就可以按一次加一次了
回复

使用道具 举报

11#
ID:836515 发表于 2021-10-11 16:14 | 只看该作者
一giao我里giao 发表于 2021-10-11 16:11
给你一个按键按一次加1的程序,然后你自己去想吧。
if(k1==0)//按键按下
while(1)

你错了,是这样
if(k1==0)//按键按下
{
while(1)
  {
  xianshi();//把正常显示的程序写在这里
  if(k1==1)
   {
   _++;//判断按键的数值加1
   break;
   }
  }
}
回复

使用道具 举报

12#
ID:967988 发表于 2021-10-11 16:21 | 只看该作者
整体思路是对的,这程序有点乱,还是要规范下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表