打印

请C语言高手讲解一下这个程序

[复制链接]
2907|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大家好!哈哈,这段时间一直在学习51单片机,在学习的过程中遇到了不少的麻烦。下面有个问题是关于程序的,我的C语言没有学好,解决不了。这是一个按键实验。可不可以讲解一下这个unsigned char scan_key()函数的具体功能,是如何实现的呢?

/*******************************************************************************
*           按键控制程序                                                                                         *
*  连接方法:JP10(P2) 与 JP12 (LED灯)连接,                                                              *
*            JP11(P0) 与 JP5(按键接口)连接                                 *
*         开始点亮P1LED                                                                 *
*         按P01 LED向左移一位                                                  *
*         按P00 LED向右移一位                                                        *
*         连续按动按钮LED会不停的左移或右移                                                                                   *
*******************************************************************************/
#include <reg51.h>
#include <intrins.h>
unsigned char scan_key();
void proc_key(unsigned char key_v);
void delayms(unsigned char ms);
sbit        K1 = P0^0;        //对应按钮K1
sbit        K2 = P0^1;        //对应按钮K2
main()
{
        unsigned char key_s,key_v;
        key_v = 0x03;
        P2 = 0xfe;
        while(1)
        {
                key_s = scan_key();
                if(key_s != key_v)
                {
                        delayms(10);
                        key_s = scan_key();
                        if(key_s != key_v)
                        {       
                                key_v = key_s;
                                proc_key(key_v);                                       
                        }
                }
        }       
}
unsigned char scan_key()
{
        unsigned char key_s;
        key_s = 0x00;                                                                           
        key_s |= K2;                     
        key_s <<= 1;
        key_s |= K1;
        return key_s;               
}
void proc_key(unsigned char key_v)
{
        if((key_v & 0x01) == 0)
        {
                P2 = _cror_(P2,1);
        }
        else if((key_v & 0x02) == 0)
        {
                P2 = _crol_(P2, 1);
        }
}
void delayms(unsigned char ms)                // 延时子程序
{                                               
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}

相关帖子

沙发
y651503148| | 2013-5-2 11:01 | 只看该作者
key_s=key_s | K2;    K2不按为1,按下为0    key_s左移一位  key_s=key_s | K1;   返回key_s值。

假设没有键按下,key_s=key_s | 1  =  0x01;左移一位 = 0x02  ;key_s=0x02 | 1 = 0x03;
K2按下,   0x00  - 0x00 -  0x01
K1按下,   0x01  - 0x02 -  0x02

使用特权

评论回复
板凳
我就是我自己|  楼主 | 2013-5-2 14:54 | 只看该作者
y651503148 发表于 2013-5-2 11:01
key_s=key_s | K2;    K2不按为1,按下为0    key_s左移一位  key_s=key_s | K1;   返回key_s值。

假设没 ...

谢谢!

使用特权

评论回复
地板
sunplusedu2012a| | 2013-5-2 17:46 | 只看该作者
,路过一下,群里高手如云哦

使用特权

评论回复
5
tangtvc| | 2013-5-2 21:51 | 只看该作者
支持一下

使用特权

评论回复
6
chenxianning| | 2013-5-3 09:01 | 只看该作者
可不可以改為:Key_s|=P0,請高手指正

使用特权

评论回复
7
xg_qing| | 2013-5-3 11:50 | 只看该作者
一看就是新手写的,效率太低了。
高效的键扫程序应当采用中断+定时器+状态机的方式实现。
最低限度也应当是定时器+状态机。

使用特权

评论回复
8
江枫渔火| | 2013-5-3 12:28 | 只看该作者
就是楼上的人们说的那样。

使用特权

评论回复
9
leehomleixi| | 2013-5-3 12:39 | 只看该作者

使用特权

评论回复
10
mcgong| | 2013-5-3 13:20 | 只看该作者
初学者努力实践诚可贵:lol

使用特权

评论回复
11
liub_2014| | 2013-5-4 00:17 | 只看该作者
可以再改改, 而且按键只改变一次,不同的键才有效果

使用特权

评论回复
12
liub_2014| | 2013-5-4 00:19 | 只看该作者
不能连续的左移或右移

使用特权

评论回复
13
liub_2014| | 2013-5-4 00:19 | 只看该作者
key_v = key_s;
应不要

使用特权

评论回复
14
wjsinian| | 2013-5-6 00:48 | 只看该作者
来学习咯,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

18

帖子

0

粉丝