|
关于165那个循环里的或运算 我不太理解,8个独立按键初始为0xff (按下哪个后对应位为低电平),和8个LED灯对应(已经初始化为0x00)。3.0的板子
举例:按下第七个键K7, 此时8个独立按键的数据应该为1011 1111,当SH/LD低电平时并行置入165寄存器的数据是1011111(疑惑1:这个按键的数据1011 1111是不是进入了indata这个变量?) ,
假设INT_data=1 开始进入循环左移第一位后 indata由1011 1111变成0111 1110 等待上升沿移至串口输出最高位1 (这个移位没问题)
然后或运算(indata|=INT_data;)后 indata=1111 1111,第一 次循环结束第二次移位对象就是1111 1111的最高位了不是原本按键数据的次高位0?(疑惑2)
没有描述清楚的地方 请各位不吝赐教
#include "reg51.h"
#include "intrins.h"
typedef unsigned char u8;
#define GPIO_LED P0 //宏定义p0口控制8个LED
sbit SH_LD=P1^6; //用p1.6控制置入SH/LD管脚 已经接好
sbit INT_data=P1^7; //用p1.7控制Qh管脚 数据通过P1.7脚移进单片机内处理 只需和74HC165的QH短接
sbit CLK=P3^6; //用p3.6控制时序 已经接好
u8 Read74HC165() //有返回值的u8类型函数
{
u8 indata=0; //数据清零
u8 i;
SH_LD=0; //低电平置入才有效 将8个独立按键的实时数据置入寄存器中
(疑惑1:这个按键的数据1011 1111是不是进入了indata这个变量?)
_nop_(); //延时一个机器周期
SH_LD=1; //锁存刚才的数据 将寄存器功能由置入变成移位 高电平移位功能才有效
_nop_(); //延时一个机器周期
for(i=0;i<8;i++)
{
indata=indata<<1; //数据左移一位 保证每一位轮流为最高位
CLK=0; //CLK低电平
_nop_(); //延时一个机器周期
indata|=INT_data; //或运算 (疑惑2:最主要不理解的地方)
CLK=1; //CLK高电平 产生了上升沿(↑有效) 数据会从高位开始产生移位
}
return indata;
}
void main()
{
u8 HC165; //用于保存函数的返回值
GPIO_LED=0; //初始化LED 使LED全部熄灭 (默认上拉电阻高电平 亮)
while(1)
{
HC165=Read74HC165(); //获得从独立按键处的按键信息数据 无按键按下时 独立按键处为0xff
if(HC165!=0xff)
{
GPIO_LED=~HC165; //取反 点击哪个 哪个亮,否则点击哪个 哪个熄灭
}
}
}
|
|