标题:
看不懂单片机的移位程序
[打印本页]
作者:
ddsj900l
时间:
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++);
}
}
本人自学请各位老师指教
作者:
hbnpmw
时间:
2018-9-29 19:56
key_v是上一次循环采集到的按键值,红色第一行是判断新扫描的键值与 key_v(上次值)不同,则进入if语句内,延时是为了去除按键按下时的抖动,之后再次读取键值(读取的目的是判断按键仍旧在按下状态,防止本次进入是因为干扰),同样再次判断键值;把本次获得的键值赋值给上次的键值,最后一句就是对该按键的处理函数了,具体功能你分析proc_key函数可得到
作者:
飞云居士
时间:
2018-9-29 19:59
红色一段程序,是延时后,再次读键,如果两次读的键值一致,去处理按下的键。否侧,是键在抖动。
作者:
飞云居士
时间:
2018-9-29 20:01
红色的程序,是防键抖动程序。经延时后,再读一次键值,如果一致,去处理键。否则的键的抖动。
作者:
冰纯
时间:
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,这样才可解码啊
作者:
冰纯
时间:
2018-9-29 22:51
上面有错,漏打一句,if((key_v & 0x01) == 0)和 else if((key_v & 0x02) == 0)有问题?是否应==1和==10。
作者:
低奢内
时间:
2019-3-24 22:05
老师们,请问<<=和<<有什么区别啊?
作者:
wulin
时间:
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++);
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1