找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机独立按键程序按键后数字显示不了?

[复制链接]
跳转到指定楼层
楼主
ID:656213 发表于 2020-11-24 00:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jiahz2019 于 2020-11-25 11:52 编辑

实验 : 8个独立按键,在数码上显示对应按键的8个数字。帮我看一下,有什么问题,按键后数字显示不了

/*****************************************************************************
           独立按键,数码管显示,0--8
                   P0口控制数码管,P1口按键
*****************************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //共阳数码管段码

void delay(uint ms)
{
        uint i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}
void main(viod)
{
        uchar key;
        P0=0xff;
        P1=0xff;
        while(1)
        {
                if(P1!=0xff)                                //等待按键被按下
                {
                        delay(200);
                        if(P1!=0xff)
                        {
                                key=P1;
                                switch(key)
                                {
                                        case 0xfe: P0=led_code[1]; break;
                                        case 0xfd: P0=led_code[2]; break;
                                        case 0xfb: P0=led_code[3]; break;
                                        case 0xf7: P0=led_code[4]; break;
                                        case 0xef: P0=led_code[5]; break;
                                        case 0xdf: P0=led_code[6]; break;
                                        case 0xbf: P0=led_code[7]; break;
                                        case 0x7f: P0=led_code[8]; break;
                                }
                        }
                }
        }
}



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

使用道具 举报

沙发
ID:716656 发表于 2020-11-24 07:59 来自手机 | 只看该作者
好像按键这没啥问题,,是不是数码管程序有问题,delay200,是不有点长,再加个松手检测
回复

使用道具 举报

板凳
ID:213173 发表于 2020-11-24 08:11 | 只看该作者
楼主对比一下就知道问题所在
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //共阳数码管段码

void delay(uint ms)
{
        uint i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}
void main(void)
{
        uchar key;
        P0=led_code[key];
        P1=0xff;
        while(1)
        {
                if(P1!=0xff)      //等待按键被按下
                {
                        delay(20);
                        if(P1!=0xff)
                        {       
                                switch(P1)
                                {
                                        case 0xfe: key=1; break;
                                        case 0xfd: key=2; break;
                                        case 0xfb: key=3; break;
                                        case 0xf7: key=4; break;
                                        case 0xef: key=5; break;
                                        case 0xdf: key=6; break;
                                        case 0xbf: key=7; break;
                                        case 0x7f: key=8; break;
                                }
                                P0=led_code[key];
                                while(P1!=0xff);
                        }
                }
        }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:848156 发表于 2020-11-24 08:42 | 只看该作者
延时太长了,需要长时间按着才行,delay(200);改程delay(20);之类的
回复

使用道具 举报

5#
ID:848156 发表于 2020-11-24 08:43 | 只看该作者
延时太长了,
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //共阳数码管段码

void delay(uint ms)
{
        uint i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}
void main(void)
{
        uchar key;
        P0=led_code[key];
        P1=0xff;
        while(1)
        {
                if(P1!=0xff)      //等待按键被按下
                {
                        delay(20);
                        if(P1!=0xff)
                        {      
                                switch(P1)
                                {
                                        case 0xfe: key=1; break;
                                        case 0xfd: key=2; break;
                                        case 0xfb: key=3; break;
                                        case 0xf7: key=4; break;
                                        case 0xef: key=5; break;
                                        case 0xdf: key=6; break;
                                        case 0xbf: key=7; break;
                                        case 0x7f: key=8; break;
                                }
                                P0=led_code[key];
                                while(P1!=0xff);
                        }
                }
        }
}
回复

使用道具 举报

6#
ID:158375 发表于 2020-11-24 11:41 | 只看该作者
程序结构问题:应该在定时中断里面查按键,这样CPU才能做其他工作。
回复

使用道具 举报

7#
ID:656213 发表于 2020-11-25 11:50 | 只看该作者
压着我头发啦 发表于 2020-11-24 07:59
好像按键这没啥问题,,是不是数码管程序有问题,delay200,是不有点长,再加个松手检测

没有问题么,好的,我再检查看,谢谢!
回复

使用道具 举报

8#
ID:656213 发表于 2020-11-27 00:56 | 只看该作者
首先,谢谢楼上各位的解答,这两天没得空,今天晚上终于有时间验证一下了,
按照wulin大师的,我直接复制过去是OK的, 但是我对比着不同点做修改,愣是还不行,我逐句的对比,标点
符号都不放过,最后我修改的还是不行,难道是我书写的问题?这问题出在哪呢?你们再帮我看看,
下面是我修改过的:
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
uchar led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //共阳数码管段码

void delay(uint ms)
{
        uint i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}
void main(viod)
{
        uchar key;
        P0=led_code[key];
        P1=0xff;
        while(1)
        {
                if(P1!=0xff)                                //等待按键被按下
                {
                        delay(20);
                        if(P1!=0xff)
                        {
                                switch(P1)
                                {
                                        case 0xfe: key=1; break;
                                        case 0xfd: key=2; break;
                                        case 0xfb: key=3; break;
                                        case 0xf7: key=4; break;
                                        case 0xef: key=5; break;
                                        case 0xdf: key=6; break;
                                        case 0xbf: key=7; break;
                                        case 0x7f: key=8; break;
                                }
                                                                P0=led_code[key];
                                                                while(P1!=0xff);
                        }
                }
        }
}
回复

使用道具 举报

9#
ID:213173 发表于 2020-11-27 06:00 | 只看该作者
jiahz2019 发表于 2020-11-27 00:56
首先,谢谢楼上各位的解答,这两天没得空,今天晚上终于有时间验证一下了,
按照wulin大师的,我直接复制 ...

从开始你就写错关键字void main(viod),正确写法:void main(void)或void main()。
回复

使用道具 举报

10#
ID:656213 发表于 2020-11-27 10:45 | 只看该作者
wulin 发表于 2020-11-27 06:00
从开始你就写错关键字void main(viod),正确写法:void main(void)或void main()。

, 谢谢指点啊,呵呵,看来我还是有点马虎
回复

使用道具 举报

11#
ID:656213 发表于 2020-11-27 20:02 | 只看该作者
还有个问题想请教一下, 就是这句之后,      if(P1!=0xff)      //等待按键被按下,  如果一直没有按按键,程序是不是一直就等在这里,不往下走了?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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