登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] [求助]啊,哪个同学帮我看为什么按键控制不了启停

[复制链接]
发表于 2019-1-26 11:15:34 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 用按键和数码管制作一个简易特别简易的秒表
学习安排: 昨天下午写完,但是找不出来毛病,想了一晚上了,还是发现不了,所以,求助一下
开始时间: 2019-01-25
结束时间: 2019-01-26
本帖最后由 林雨 于 2019-1-26 11:23 编辑

我编写了一个按键和数码管同时使用的一个小的秒表,按键用的是k4按键,只用这一个按键控制秒表的启动和暂停。但是一打开发现秒表数值只往上加,按键无法发挥作用,我反复看了代码还是没有发现有什么问题啊,哪位有空的同学帮我看一下吧,非常感谢。这是前边声明以及定义变量的部分:

[mw_shl_code=applescript,true]#include <
STC12C5A60S2.H

>

sbit  A0=P2^0;                    
sbit  A1=P2^1;
sbit  A2=P2^2;
sbit  ENLED=P1^1;

sbit Key = P2^3;//我们使用k4按键作为秒表的暂停和启动按键
sbit KeyOut = P2^7;//我们使用k4按键作为秒表的暂停和启动按键


unsigned char code LedChar[]={
        0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
        0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
};//这是数码管的真值表

unsigned char LedBuff []={
        0xff,0xff,0xff,0xff,0xff,0xff
};//数码管显示缓冲区

unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned int Dis_Value = 0;//这一个值就是要显示在数码管上的值每10毫秒加一,也就是说这个秒表的分辨率是10毫秒
bit Running_Flag = 1;//这是秒表的运行标志,如果这个值为一那么表示秒表要正常运行,如果这个值是0秒暂停
bit Key_BackUp = 1;//这是按键状态的备份值。
bit Key_Back =1;//这是按键扫描传回来的值,如果船回来以表示按键式弹起,如果传回来为零,表示按键按下,这个值与之前备份的那个值进行比较,如果不相等则可以判定有动作[/mw_shl_code]
这是主函数部分主函数主要用来控制秒表的启停,通过控制一个秒表运行标志位来实现:
[mw_shl_code=applescript,true]void main ()
{
        
        ENLED = 0;//首先要使能数码管。
        KeyOut = 0;//让这个引脚输出低电平。
        EA = 1;//打开总中断。
        TMOD = 0x01;//配置计时模式。
        TH0 = 0xea;//配置定时器零的高位初始值。
        TL0 = 0x6a;//配置定时器零的低位初始值。
        ET0 = 1;//打开定时器中断。
        TR0 = 1;//打开定时器零。

        
//        Configure_Timer_0 (1);
        
        while (1)
        {
                if (Key_BackUp != Key_Back)//时刻检测按键状态,判断传回来的按键状态是否与备份的状态相同,如果不相同则进行下一步判断。
                {
                        if (Key_BackUp == 0)//如果备份值为0,说明是弹起。
                        {
                                if (Running_Flag)//判断运行标志是否为真,如果在运行状态则让运行状态变为零,停止往上加数。
                                    Running_Flag = 0;
                                else
                    Running_Flag = 1;//否则运行标志为假,则让运行状态标志变为真,继续往上加数                                
                                       
                        }
                        Key_BackUp = Key_Back;//更新备份的按键状态。
                }
                        
        }
               
}[/mw_shl_code]
接下来是数码管显示函数:
[mw_shl_code=applescript,true]void Solo_Led_Display (unsigned int shu)//这是数码管显示相关的函数,每两毫秒调用一次,每调用一次,刷新一次。
{
        
        static unsigned char i = 0;
        
        LedBuff[5] = LedChar[shu%10];
        LedBuff[4] = LedChar[shu/10%10];
        LedBuff[3] = LedChar[shu/100%10];
        LedBuff[2] = LedChar[shu/1000%10];
        LedBuff[1] = LedChar[shu/10000%10];
        LedBuff[0] = LedChar[shu/100000%10];
        

        
        P0 = 0xff;
        P2 = (P2 & 0xf8) | i;//这一个语句虽然简单,但是可以实现位选操作,显示函数是没有问题的。
        P0 = LedBuff;
        //这主要是金沙滩上那个数码管扫描改进程序。
        
        
        if (i<5)
                i++;
        else
                i = 0;

}[/mw_shl_code]
下面是按键检测函数:
[mw_shl_code=applescript,true]void Key_Check ()//这是判断案件状态相关的函数,每两毫秒调用一次。
{
        static unsigned char KeyBuff = 0xff;//定义判断按键状态所需用的缓冲值。
        
        KeyBuff = (KeyBuff<<1) |Key;//每一次调用都将缓冲值左移一位,然后与见进行按位或操作
        if (KeyBuff == 0x00)//操作8次之后自动来判断这个缓冲值的各种情况,比如这种情况,说明按键按下。
        {Key_Back = 0;}//这种情况下传回去的按键值为零,说明按键按下。
        else if (KeyBuff == 0xff)//这是另外一种情况,说明按键弹起。
        {Key_Back = 1;}//这种情况传回去的案件之为1,说明按键弹起。
        else {}//别的状态说明按键处于不稳定状态,不进行任何操作。
        
        
[/mw_shl_code]

下面是中断函数:
[mw_shl_code=applescript,true]void Interrupt_Timer_0 () interrupt 1
{
        static unsigned char cent = 0;//这是为了计时十毫秒用的值,每次进入中断也就是说每两毫秒他会加一加到5之后就是10毫秒。
        TH0 = 0xea;//这是为了定时两毫秒给定时器零的高位赋的值。
        TL0 = 0x6a;//这是为了定时两毫秒给定时器零的低位赋的值。
        
        Key_Check ();//每次进入中段都检测按键状态。检测8次一共耗费16毫秒。
        Solo_Led_Display (Dis_Value);//这是数码管显示的函数,每一次进入中断,也就是说每两毫秒调用一次进行数码管刷新。
        
        cent++;//每次进入中断,这个值都自加一次,自加5次之后变成10毫秒。
        
        if(cent >= 5)//如果达到十毫秒
        {
                if(Running_Flag)//进行运行状态标志判断,那个值为真的话就进行加1操作,否则不进行任何操作。
                {Dis_Value = Dis_Value++;}
               
                cent = 0;//清零
        }
        
}[/mw_shl_code]

LED_Disiplay.rar

29.33 KB, 下载次数: 598

好懒~~不想说~~~
发表于 2019-1-26 18:02:02 | 显示全部楼层
应该是P2口你38译码器要用按键也要用造成了冲突
好懒~~不想说~~~
 楼主| 发表于 2019-1-26 18:13:24 | 显示全部楼层
风尘仆仆 发表于 2019-1-26 18:02
应该是P2口你38译码器要用按键也要用造成了冲突

138译码器用P0,P1,P2,这三个引脚,但是我按键用的是P2.3口,并且我只用一个按键,
好懒~~不想说~~~
发表于 2019-1-26 21:25:55 | 显示全部楼层
那就不清楚,我再看看
好懒~~不想说~~~
发表于 2019-2-17 23:12:25 | 显示全部楼层
程序可能存在逻辑错误。除了在以下,即主函数[size=18.018px]处发现有操作[size=18.018px]Running_Flag的行为,其他地方均为检测Running_Flag的值


[mw_shl_code=applescript,true]                        if (Key_BackUp == 0)//如果备份值为0,说明是弹起。
                        {
                                if (Running_Flag)//判断运行标志是否为真,如果在运行状态则让运行状态变为零,停止往上加数。
                                    Running_Flag = 0;
                                else
                    Running_Flag = 1;//否则运行标志为假,则让运行状态标志变为真,继续往上加数                                
                                         
                        }[/mw_shl_code]


而此处代码我认为存在逻辑错误,故无法暂停


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

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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