微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 高手看看这个程序红色的地方给解释一下

高手看看这个程序红色的地方给解释一下

时间:10-02 整理:3721RD 点击:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dual=P2^6;  
sbit weal=P2^7;
uchar code DSY_CODE[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar Pre_KeyNo=16,KeyNo=16;
void delayms(uint xms)   
{
uint i,j;
for(i=xms;i>0;i--)        //i=xms即延时约xms毫秒
  for(j=110;j>0;j--);
}
void Keys_Scan()
{
uchar Tmp;
P3=0x0f; //高4位置0,放入4行
delayms(1);
Tmp=P3^0x0f;//按键后0f变成0000XXXX,X中一个为0,3个仍为1,通过异或把3个1变为0,唯一的0变为1
switch(Tmp) //判断按键发生于0~3列的哪一列
{
  case 1: KeyNo=0;break;
  case 2: KeyNo=1;break;
  case 4: KeyNo=2;break;
  case 8: KeyNo=3;break;
  default:KeyNo=16; //无键按下
}
P3=0xf0;   //低4位置0,放入4列
delayms(1);
Tmp=P3>>4^0x0f;//按键后f0变成XXXX0000,X中有1个为0,三个仍为1;高4位转移到低4位并异或得到改变的值
switch(Tmp) //对0~3行分别附加起始值0,4,8,12
{
  case 1: KeyNo+=0;break;
  case 2: KeyNo+=4;break;
  case 4: KeyNo+=8;break;
  case 8: KeyNo+=12;
}
}
void main()
{
    dual=1;
P0=0xc0;
dual=0;
while(1)
{
     weal=1 ;
  P3=0xf0;
  if(P3!=0xf0)
  Keys_Scan();  //获取键序号
  if(Pre_KeyNo!=KeyNo)
  {
   P0=~DSY_CODE[KeyNo];
   weal=0;
   Pre_KeyNo=KeyNo;
  }
  delayms(100);
}
}




获取按键值,同时数码管显示出来

为什么要取反呢?没搞明白

为什么要取反,能不能具体说明啊

可能同你实验板用的数码管是共阴还是共阳有关吧!

能不能具体给说明啊

数码管的管脚次序有关

能不能具体给说啊,我是新手

其实是为了是输出的信号电平更稳定,以前在一本书上看到过!

同意!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top