标题:
求解释一下这个单片机按键扫描过程的程序
[打印本页]
作者:
a89588038
时间:
2018-10-12 14:29
标题:
求解释一下这个单片机按键扫描过程的程序
微信图片_20180928193012.png
(79.58 KB, 下载次数: 69)
下载附件
2018-10-12 14:27 上传
这个程序看了两天了,还是看不是很明白,看的脑瓜疼。所以来求助大家。
现在最弄不明白的是这些按位与和或的做用到底是什么啊?
PORTC |= KEYSCAN_OUTH; PORTC &= KeyOut_Table[pt];
顺便也解释一下红色字体的。
#include "Global.h"
/*********************************************************************************************************/
s_Key Key;
#define SC_LINE 2 //inpu
#define SC_ROW 2 //outpu
#define KEYPRESS_RELEASE (
(PORTC&0x06) ^ 0x06)
// PC2,1 as input TURE:按键中 FALSE:按键释放
#define KEYSCAN_OUTH _0000_1000 //PC3 output high
const unsigned char KeyOut_Table[SC_ROW] = {0xFF,0xF7,}; //GND PC3
/*********************************************************************************************************/
void KeyScan_Process(void)//按键扫描过程
{
unsigned char pt;//,keytemp;
unsigned char ReadState;
for(pt = 0;pt < SC_ROW;pt++)
{
PORTC |= KEYSCAN_OUTH;
PORTC &= KeyOut_Table[pt];
ReadState = KEYPRESS_RELEASE;
if (ReadState)
{
Key.value = NO_PRESS;
switch(ReadState)
{
case 0x02:
Key.value = SC_LINE*pt + 1; break;
case 0x04:
Key.value = SC_LINE*pt + 2; break;
default:break;
}
break;
}
}
PORTC &= ~KEYSCAN_OUTH;//used P15(output "L")
/****************************************************
//for longkey press
/***************************************************/
ReadState = KEYPRESS_RELEASE; // 不按 短按 长按
Key.Trg = ReadState & (ReadState ^ Key.Cont); // 0 1 0
Key.Cont = ReadState; // 0 1 1
if (Key.Trg)
{
Key.Count = 0;
Key.Trg_flag = 1;
Key.state = SHORT_PRESS;
}
}
作者:
jinsheng7533967
时间:
2018-12-4 12:21
PORTC |= KEYSCAN_OUTH; 从字面意思也很明白的说了PORTC=全输出高电平,原理图一看就明白了,全高电平就是没有按键按下,不管是独立按键还是矩阵按键,算作是一个预处理(有按键按下的统统释放)
PORTC &= KeyOut_Table[pt]不就是PORTC =PORTC & KeyOut_Table[pt],如果你现在的PORTC是0xff,你KeyOut_Table[pt]的取值是0x01,那结果就还是0X01,如果你PORTC是0x00,那结果就是0x00;说白了就是PORTC的值取决与你现在PORTC的值与KeyOut_Table[pt]中值相与的结果
((PORTC&0x06) ^ 0x06) 其实是一种简写方式,其实是这样子的:
PORTC = PORTC & 0x06;
PORTC = PORTC ^ 0x06; 你这还是简单的,还有这样子(((PORTC&0x06) ^ 0x06))|
~(PORTC(1<<6))
后面的就没什么好讲的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1