高手看看这个程序红色的地方给解释一下
时间: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);
}
}
获取按键值,同时数码管显示出来
为什么要取反呢?没搞明白
为什么要取反,能不能具体说明啊
可能同你实验板用的数码管是共阴还是共阳有关吧!
能不能具体给说明啊
数码管的管脚次序有关
能不能具体给说啊,我是新手
其实是为了是输出的信号电平更稳定,以前在一本书上看到过!
同意!
