搜索
bottom↓
回复: 16

求助!看了《从单片机初学者迈向单片机工程师》后遇到.....

[复制链接]

出0入0汤圆

发表于 2012-5-28 09:09:54 | 显示全部楼层 |阅读模式
本帖最后由 tangaoo 于 2012-5-28 09:16 编辑

***********************************************************题目要求********************************************************************
用按键和数码管以及单片机定时器实现一
个简易的可以调整的时钟,要求如下:
8位数码管显示,显示格式如下
时-分-秒
XX-XX-XX
要求:系统有四个按键,功能分别是调整,加,减,确定。在按下调整键时候,显示时的
两位数码管以1 Hz 频率闪烁。如果再次按下调整键,则分开闪烁,依次循环,直到按下确
定键,恢复正常的显示。在数码管闪烁的时候,按下加或者减键可以调整相应的显示内容。
按键支持短按,和长按,即短按时,修改的内容每次增加一或者减小一,长按时候以一定速
率连续增加或者减少。

***********************************************************我遇到的问题******************************************************************
这是文档上提到的小题目,我的键盘驱动是按文档上上面的想法写着。但是遇到了问题。因为我要一个键位调整键(如KEY1),KEY1每按一下这计数器(Count++)一下。
那么我判断 if KEY1 = 1 是调整秒钟 时间停止走动
           if KEY1 = 2 是调整分钟
           if KEY1 = 3 是调整时钟
           if KEY1 = 4 时恢复
但是我遇到的问题就是按文档上的思路写的驱动无法保证每次键按下时,不能保证Count每次只加1,只能用while(!KEY);, 阻止程序才能保证每次只加1, 但这是这篇文章提到的禁忌。请问大家还有什么其他的办法,或者更好的键盘驱动程序的思路吗???
谢谢了!!!

*****************************************************************************************************************************************
把这个文档也上传了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-5-29 09:52:14 | 显示全部楼层
为什么没有人回答呢?难道意思表达的不清楚?还是

出0入0汤圆

发表于 2012-5-29 09:55:10 | 显示全部楼层
不要在按下去时就+1,在确定按下又抬起时+1

出0入0汤圆

 楼主| 发表于 2012-5-29 10:04:56 | 显示全部楼层
startwar0418 发表于 2012-5-29 09:55
不要在按下去时就+1,在确定按下又抬起时+1

/* 按键返回值状态 */
#define    KEY_PRESS       0x80           //按下
#define    KEY_LONG        0x40           //长按
#define    KEY_CONTINUE    0x20           //连按
#define    KEY_RELEASE     0x10           //释放

键盘有这四个状态是吧? 我试过无论是在那个状态下,都不能保证每次count++只加一次???

出0入0汤圆

发表于 2012-5-29 10:27:08 | 显示全部楼层
设置标志位,当第一次按下的时候标志位1,只有当按键弹起的时候标志才为0

那么判断这个标志,如果为0  表示第一次按下,执行功能,如果为1 表示之前已经处理过了,不处理。

出0入0汤圆

发表于 2012-5-29 10:28:21 来自手机 | 显示全部楼层
按键是20毫秒查询一次

出0入0汤圆

发表于 2012-5-29 10:30:39 | 显示全部楼层
比如说按键值 是 1,没按下时是 0
每次都记录上一次判断的按键值
判断 上一次有按键值是 1 并且当前值是0 则+1

出0入0汤圆

 楼主| 发表于 2012-5-29 10:59:25 | 显示全部楼层
Etual 发表于 2012-5-29 10:27
设置标志位,当第一次按下的时候标志位1,只有当按键弹起的时候标志才为0

那么判断这个标志,如果为0  表 ...

那么再请教一下,这个标志位该加在什么地方呢?
1 如果加在键盘驱动程序 case里面 那么刚在主函数里不能实现步进加1的原因就是在20ms扫描一次的情况下 在按下的时候有多次扫描到键盘按下
它也就会多次使标志位置1 这样还是没有起到效果。

出0入0汤圆

发表于 2012-5-29 11:07:27 | 显示全部楼层
void key_scan(void)
{
        uchar key;
       
        key = read_key_port();
       
        if (key == 0) {
                // key up
                bit_key_on = 0;
                return;
        }

        if (bit_key_on) {
                return;
        }

        bit_key_on = 1;

        do_key_func();
}

出0入0汤圆

 楼主| 发表于 2012-5-29 11:10:01 | 显示全部楼层
startwar0418 发表于 2012-5-29 10:30
比如说按键值 是 1,没按下时是 0
每次都记录上一次判断的按键值
判断 上一次有按键值是 1 并且当前值是0  ...

您的意思就是说要有两个标志位?能稍微讲具体一点吗 谢谢了

出0入0汤圆

发表于 2012-5-29 12:07:00 | 显示全部楼层
9L的方法就很好啊
我说的方法可能有问题,就是长按时那个数字一直不会加,只能等到抬起按键时才加,而且我说的方法似乎要笨些。
我改成按键按下时+1
uchar key,lastkey;
fun()
{
    key=read_key();
    if((key!=0)&&(lastkey==0))
    {
        //根据按键key的值做你要做的事
    }
    lastkey=key;
}

出0入0汤圆

发表于 2012-5-29 12:09:30 | 显示全部楼层
tangaoo 发表于 2012-5-29 11:10
您的意思就是说要有两个标志位?能稍微讲具体一点吗 谢谢了

sbit key = P1^0;

bit a0,a1;

a1=a0;
a0=key;
if( (a0 != a1) && (a0==0) ) //下降沿检测
{  
    ……
}




出0入0汤圆

 楼主| 发表于 2012-5-30 00:08:52 来自手机 | 显示全部楼层
Etual 发表于 2012-5-29 11:07  void key_scan(void)  {  uchar key;

这个方法相当不错,长见识了,谢谢您!能把return用的这么好!

出0入0汤圆

 楼主| 发表于 2012-5-30 00:10:56 来自手机 | 显示全部楼层
startwar0418 发表于 2012-5-29 12:07  9L的方法就很好啊  我说的方法可能有问题,就是长按时那个数字一直不会加,只能等到抬起按键时才加,而且我 ...

谢谢您,我就是安您的思路完成的!

出0入0汤圆

 楼主| 发表于 2012-5-30 09:03:06 | 显示全部楼层
在各位思想的知道下问题已经解决了。我是这样做的,在第一个状态INIT_STATE中加上标志位。然后在主函数中判断,当这个标志位有效了而且PRESS_STATE状态发生了,count++。
这样就是使得只有是从INIT状态进入PRESS状态的情况count才加1。
避免了不断扫描到PRESS使count不断加1的情况。
再次谢谢楼上的各位了!

出0入0汤圆

发表于 2012-5-30 20:51:29 | 显示全部楼层
值得去探讨

出0入0汤圆

发表于 2012-6-20 15:02:31 | 显示全部楼层
study!!学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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