找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2349|回复: 7
打印 上一主题 下一主题
收起左侧

看不懂单片机的移位程序

[复制链接]
跳转到指定楼层
楼主
ID:403906 发表于 2018-9-29 15:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#include <intrins.h>

unsigned char scan_key();
void proc_key(unsigned char key_v);
void delayms(unsigned char ms);

sbit        K1 = P3^0;
sbit        K2 = P3^1;
unsigned char scan_key()
{
        unsigned char key_s;
        key_s = 0x00; //key_s=0x00;赋值
        key_s |= K2;     //key_s=key_s|k2
    key_s<<=1;      //key_s =key_s << 1;
        key_s |= K1;   //相当于key_s=key_s|k1
        return key_s;//  返回key_s的值
}
main()
{
        
        unsigned char key_s,key_v;
        key_v = 0x03;//既然key_v = 0x03为啥if(key_s != key_v) 没有按键的时候为假?
        P1 = 0xfe;
        while(1)
        {
                key_s = scan_key();//scan_key()是另一个返回函数
                if(key_s != key_v) //以下的都是不懂请教各位老师
                {
                        delayms(10);
                        key_s = scan_key();//key_s 不等于 key_v时
                        if(key_s != key_v)
                        {        
                                key_v = key_s;//二者相等时        if(key_s != key_v)         为假,key_v位0x03
                                proc_key(key_v);                                       
                        }
                }
        }        
}



void proc_key(unsigned char key_v)
{
        if((key_v & 0x01) == 0)
        {
                P1 = _cror_(P1,1);
        }
        else if((key_v & 0x02) == 0)
        {
                P1 = _crol_(P1, 1);
        }
}

void delayms(unsigned char ms)        
// 延时子程序
{                                                
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}
本人自学请各位老师指教

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:277374 发表于 2018-9-29 19:56 | 只看该作者
key_v是上一次循环采集到的按键值,红色第一行是判断新扫描的键值与 key_v(上次值)不同,则进入if语句内,延时是为了去除按键按下时的抖动,之后再次读取键值(读取的目的是判断按键仍旧在按下状态,防止本次进入是因为干扰),同样再次判断键值;把本次获得的键值赋值给上次的键值,最后一句就是对该按键的处理函数了,具体功能你分析proc_key函数可得到

评分

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

查看全部评分

回复

使用道具 举报

板凳
ID:404160 发表于 2018-9-29 19:59 | 只看该作者
红色一段程序,是延时后,再次读键,如果两次读的键值一致,去处理按下的键。否侧,是键在抖动。
回复

使用道具 举报

地板
ID:404160 发表于 2018-9-29 20:01 | 只看该作者
红色的程序,是防键抖动程序。经延时后,再读一次键值,如果一致,去处理键。否则的键的抖动。
回复

使用道具 举报

5#
ID:261288 发表于 2018-9-29 21:06 | 只看该作者
这段程序是判断按键(K2;K1)是否被按下,key_s的值写为二进制为0000 00K2K1,只要不等于0x03,代表有键被按下,接着延时消抖再判断一次,如为“真”,则key_s(当前值)赋值给key_v,再运行proc_key(key_v)。但 if((key_v & 0x01) == 0)和 else if((key_v & 0x02) == 0)有问题?是否应==1,这样才可解码啊
回复

使用道具 举报

6#
ID:261288 发表于 2018-9-29 22:51 | 只看该作者
上面有错,漏打一句,if((key_v & 0x01) == 0)和 else if((key_v & 0x02) == 0)有问题?是否应==1和==10。
回复

使用道具 举报

7#
ID:405642 发表于 2019-3-24 22:05 来自手机 | 只看该作者
老师们,请问<<=和<<有什么区别啊?
回复

使用道具 举报

8#
ID:213173 发表于 2019-3-25 08:55 | 只看该作者
这个程序如果是用于训练逻辑思维还算能行。如果用于编程就纯属故弄玄虚,画蛇添足。
如此简单的事情为什么要搞得这么复杂?给你逐条注释了,应该能够理解了。
#include <reg51.h>
#include <intrins.h>

unsigned char scan_key();
void proc_key(unsigned char key_v);
void delayms(unsigned char ms);
sbit        K1 = P3^0;
sbit        K2 = P3^1;
unsigned char scan_key()//此函数是为了把两个bit型数据组合成无符号字符型数据。K1、K2默认为1
{                                        //组合后成0000 0011,单独按键后只会发生2种变化:0000 0010 和 0000 0001
        unsigned char key_s;
        key_s = 0x00; //key_s=0x00;赋初值
        key_s |= K2;  //把K2理解为0000 0001 加 0000 0000,key_s=0000 0001
        key_s<<=1;      //key_s 左移1,key_s=0000 0010
        key_s |= K1;   //把K1理解为0000 0001 加 0000 0010,key_s=0000 0011
        return key_s;        //无键按下返回key_s的键值0x03,有键按下键返回的键值0x01或0x02
}
void main()
{       
        unsigned char key_s,key_v;
        key_v = 0x03;
        P1 = 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;//将有效键值赋值于key_v
                                proc_key(key_v);//将key_v作为参数传输给proc_key函数
                        }
                }
        }        
}

void proc_key(unsigned char key_v)
{
        if((key_v & 0x01) == 0)
        {
                P1 = _cror_(P1,1);//循环右移
        }
        else if((key_v & 0x02) == 0)
        {
                P1 = _crol_(P1,1);//循环左移
        }
}

void delayms(unsigned char ms)        
// 延时子程序
{                                                
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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