找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2533|回复: 3
收起左侧

用数码管加按键做时钟按键功能一直有问题

[复制链接]
ID:84348 发表于 2015-7-12 11:43 | 显示全部楼层 |阅读模式
问题是按键按下后没用或者乱加数,初学单片机两周,还请高手指教。
改了两天,实在看不出是为什么。#include<reg52.h>
#include<intrins.h>//中断函数库
#define uchar unsigned char
#define uint unsigned int
sbit key_s=P1^1;
sbit key_m=P1^2;
sbit key_h=P1^3;
sbit start=P1^4;//四个按键
sbit bell=P3^6;//蜂鸣器
uchar temp,aa,num,i,x,y,z,restar,sec,min,hour,TCNT;
uchar duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//段码
uchar wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//六个位
uchar buffer[6];//显示缓冲区,格式H1-H2-m1-m2-s1-s2

void delay(unsigned int us)
{
        while(us--);
}
//动态扫描显示
void scandisp()
{
        unsigned char i,value;
        for(i=0;i<6;i++)
        {
                P2=0xc0;//消影,1100 0000
                value=duan[buffer[i]];
                P0=value;
                P2=wei[i];
                delay(100);
        }
}       
//计算时分秒高低位数据并缓存
void display()
{
        scandisp();
        buffer[0]=hour/10;
        buffer[1]=hour%10;
        buffer[2]=min/10;
        buffer[3]=min%10;
        buffer[4]=sec/10;
        buffer[5]=sec%10;//时高,时低,分高,分低,秒高,秒低
}
//按键检测及加法
void keyadd()
{
        display();
        P2=0xc0;//1100 0000
        restar=0;
        if(key_s==0)
        {
                delay(100);
                if(key_s==0)
                {
                        sec++;
                        if(sec==60)
                        {
                                sec=0;
                        }
                key_s=1;
                while(sec==0)
                display();
                }
        }
        if(key_m==0)
        {
                delay(100);//避开抖动时期
                if(key_m==0)
                {
                        min++;       
                        if(min==60)
                        {
                                min=0;
                        }
                 key_m=1;
                while(min==0)
                display();               
                }
        }
        if(key_h==0)
        {
                delay(100);
                if(key_h==0)
                {
                        hour++;
                        if(hour==24)
                        {
                                hour=0;
                        }
                        key_h=1;
                while(hour==0)
                display();
                }
        }
        if(start==0)
        {
                delay(100);
                if(start==1)
                {
                        restar=1;
                }
        }
}
void main()
{
        P2=0xc0;//每个数码管都选通
        P0=0x3f;//都显示0
        key_s=1;
        key_m=1;
        key_h=1;
        start=1;//按键初始化

        /*计时开始被按下才进入计时状态*/
        while(1)
        {
                if(start==0)break;
        }
        /*中断设置*/
                hour=0;
                min=0;
                sec=0;
                TCNT=0;
                TMOD=0x01;
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                IE=0x82;
                TR0=1;
                while(1)
                {
                        keyadd();
                        if(restar==1)
                        break;
                }
}

void Timer0(void) interrupt 1 //中断服务程序 1为中断号,由优先级决定

{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;//重新赋值
        TCNT++;
                if(TCNT==20)
                        {
                                sec++;
                                TCNT=0;
                        if(sec==60)
                        {
                                min++;
                                sec=0;
                                if(min==60)
                                {
                                        hour++;
                                        min=0;
                                        if(hour==24)
                                        {
                                                hour=0;
                                                min=0;
                                                sec=0;
                                                TCNT=0;
                                        }
                                }
                        }
                        }       
}


回复

使用道具 举报

ID:85422 发表于 2015-7-12 18:01 | 显示全部楼层
没仔细看,不过可以尝试一下把按键消抖延时改为10毫秒看看...

评分

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

查看全部评分

回复

使用道具 举报

ID:85702 发表于 2015-7-14 22:11 | 显示全部楼层
遇到过这样的。一般是按键消抖延时太短。可以改长点。试下。

评分

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

查看全部评分

回复

使用道具 举报

ID:82476 发表于 2015-7-14 22:28 | 显示全部楼层
如楼上所说,你的按键消抖延时太短了,你的延时只有delay(100);即使100*1us左右;按键一般都是机械触点的,也就是抖动过程一般持续5~10ms;还有

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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