if(num!=0xff)这个语句有什么作用?为什么要判断键值不等于0xff,我屏蔽这语句时,1就显示乱码,为什么?

#include<reg52.h>

#include<intrins.h>
sbit RS = P2^4; //定义端口
sbit RW = P2^5;
sbit EN = P2^6;
unsigned char code dofly_code[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{

while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
bit LCD_Check_Busy(void)
{
P0= 0xFF;
RS=0;
RW=1;
EN=0;
_nop_();
EN=1;
return (bit)(P0& 0x80);
}

void LCD_Write_Com(unsigned char com)
{
while(LCD_Check_Busy()); //忙则等待
RS=0;
RW=0;
EN=1;
P0= com;
_nop_();
EN=0;
}
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙则等待
RS=1;
RW=0;
EN=1;
P0= Data;
_nop_();
EN=0;
}
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
void LCD_Init(void)
{
LCD_Write_Com(0x38); /*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*显示关闭*/
LCD_Write_Com(0x01); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C); /*显示开及光标设置*/
}
unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值中间变量
P3=0xf0; //行线输出全为0
cord_h=P3&0xf0; //读入列线值
if(cord_h!=0xf0) //先检测有无按键按下
{
DelayMs(10); //去抖
if((P3&0x0f)!=0xf0)
{
cord_h=P3&0xf0; //读入列线值
P3=cord_h|0x0f; //输出当前列线值
cord_l=P3&0x0f; //读入行线值
while((P3&0x0f)!=0x0f);//等待松开并输出
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}
unsigned char KeyPro(void)
{
switch(KeyScan())
{
case 0xee:return 0;break;//0 按下相应的键显示相对应的码值
case 0xde:return 1;break;//1
case 0xbe:return 2;break;//2
case 0x7e:return 3;break;//3
case 0xed:return 4;break;//4
case 0xdd:return 5;break;//5
case 0xbd:return 6;break;//6
case 0x7d:return 7;break;//7
case 0xeb:return 8;break;//8
case 0xdb:return 9;break;//9
case 0xbb:return 10;break;//a
case 0x7b:return 11;break;//b
case 0xe7:return 12;break;//c
case 0xd7:return 13;break;//d
case 0xb7:return 14;break;//e
case 0x77:return 15;break;//f
default:return 0xff;break;
}
}
void main(void)
{
unsigned char i,num;
LCD_Init();
while (1)
{
num=KeyPro();

if(num!=0xff)
{
if(i==0)
LCD_Clear();//清屏

LCD_Write_Char(13+i,1,dofly_code[num]);//依次显示输入字符
i++;
if (i==2) i=0;
}

表示有按键按下
看keypro中的default:return 0xff;break;
温馨提示:答案为网友推荐,仅供参考
相似回答