找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机按键控制数码管倒计时程序错误

[复制链接]
跳转到指定楼层
#
100黑币
请教大神。实现利用按键K1控制数码管DS6显示9~0的倒计时,按键每按下一次,数字减一。只显示0,请大神帮我指指错误,下面是我的代码:
#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit K1  = P2^4;

unsigned char code LedChar[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

void delay();
void main()
{
bit keybuf = 1; //按键值暂存,临时保存按键的扫描值
bit backup = 1; //按键值备份,保存前一次的扫描值
unsigned char cnt = 0; //按键计数,记录按键按下的次数
unsigned  int  j;

ENLED = 0; //选择数码管 DS6进行显示
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 0;
ADDR0 = 1;
P2 = 0xF7; //P2.3 置 0,即 KeyOut1 输出低电平
P0 = LedChar[j]; //显示值

while (1)
{
keybuf = j; //把当前扫描值暂存
if (keybuf != backup) //当前值与前次值不相等说明此时按键有动作
{
delay(); //延时大约 10ms
if (keybuf == j) //判断扫描值有没有发生改变,即按键抖动
{
if (backup == 0) //如果前次值为 0,则说明当前是弹起动作
{
cnt++; //按键次数+1
  j--;
if (cnt >= 9)
{ //只用 1 个数码管显示,所以加到 10 就清零重新开始
cnt = 0;
j   = 9;
}
P0 = LedChar[j]; //计数值显示到数码管上
}
backup = keybuf; //更新备份为当前值,以备进行下次比较
}
}
} }
/* 软件延时函数,延时约 10ms */
void delay()
{
unsigned int i = 1000;
while (i--);
}


仿真结果.png (53.53 KB, 下载次数: 31)

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

使用道具 举报

5#
ID:415088 发表于 2020-5-28 19:30 | 只看该作者
你按键状态没有做判断,怎么区分按键是否按下
回复

使用道具 举报

地板
ID:704483 发表于 2020-5-28 13:53 | 只看该作者
大长虫 发表于 2020-5-28 09:19
没看懂啥意思看,详细的描述下

就是想让数码管受按键控制进行倒计时,但是我写的代码只能在仿真中显示0
回复

使用道具 举报

板凳
ID:763141 发表于 2020-5-28 10:04 | 只看该作者
没看到主循环中检测K1状态的代码
回复

使用道具 举报

沙发
ID:763141 发表于 2020-5-28 10:02 | 只看该作者
主循环内有读取按键值的部分吗,怎么没看到读K1状态的
回复

使用道具 举报

楼主
ID:682488 发表于 2020-5-28 09:19 | 只看该作者
没看懂啥意思看,详细的描述下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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