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

[复制链接]
 楼主| 我就是我自己 发表于 2013-5-2 09:30 | 显示全部楼层 |阅读模式
大家好!哈哈,这段时间一直在学习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 | 显示全部楼层
,路过一下,群里高手如云哦
tangtvc 发表于 2013-5-2 21:51 | 显示全部楼层
支持一下
chenxianning 发表于 2013-5-3 09:01 | 显示全部楼层
可不可以改為:Key_s|=P0,請高手指正
xg_qing 发表于 2013-5-3 11:50 | 显示全部楼层
一看就是新手写的,效率太低了。
高效的键扫程序应当采用中断+定时器+状态机的方式实现。
最低限度也应当是定时器+状态机。
江枫渔火 发表于 2013-5-3 12:28 | 显示全部楼层
就是楼上的人们说的那样。
leehomleixi 发表于 2013-5-3 12:39 | 显示全部楼层
mcgong 发表于 2013-5-3 13:20 | 显示全部楼层
初学者努力实践诚可贵:lol
liub_2014 发表于 2013-5-4 00:17 | 显示全部楼层
可以再改改, 而且按键只改变一次,不同的键才有效果
liub_2014 发表于 2013-5-4 00:19 | 显示全部楼层
不能连续的左移或右移
liub_2014 发表于 2013-5-4 00:19 | 显示全部楼层
key_v = key_s;
应不要
wjsinian 发表于 2013-5-6 00:48 | 显示全部楼层
来学习咯,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部