#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int
uchar key;
void delay(unsigned int cnt)
{
while(--cnt);
}
void paomadeng()
{
uint j=1;
P1=0xfe; //给初始化值 换算成二进制是1111 1110
while(j)
{
delay(30000);//延时程序
P1<<=1; //左移一位 该语句等效于 P1=P1<<1
P1|=0x01; //最后一位补1,该语句等效于 P1=P1|0x01 符号"|"表示"或"
if(P1==0x7f) //检测是否移到最左端?"=="表示检测符号2端的值是否相等
{
delay(30000);
P1=0xfe; //重新赋值
}
//j+=1;
if(key!=0x7e)
j=0;
else j=1;
}
}
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}
void main()
{
// P2=0x00; //1数码管亮 按相应的按键,会显示按键上的字符
while(1)
{
key=keyscan(); //调用键盘扫描,
switch(key)
{
case 0x7e:paomadeng();break;//0 按下相应的键显示相对应的码值
case 0x7d:P1=0xfd;break;//1
case 0x7b:P1=0xfb;break;//2
case 0x77:P1=0xf7;break;//3
case 0xbe:P1=0xef;break;//4
case 0xbd:P1=0xdf;break;//5
case 0xbb:P1=0xbf;break;//6
case 0xb7:P1=0x7f;break;//7
// case 0xde:P1=0x7f;break;//8
// case 0xdd:P0=dofly[9];break;//9
// case 0xdb:P0=dofly[10];break;//a
// case 0xd7:P0=dofly[11];break;//b
// case 0xee:P0=dofly[12];break;//c
// case 0xed:P0=dofly[13];break;//d
// case 0xeb:P0=dofly[14];break;//e
// case 0xe7:P0=dofly[15];break;//f
}
}
}
我想通过if (key!=0x7e) j=0; else j=1;跳出while循环,结果跳不出来,这是什么原因呢?我该怎么改呢?我的目的是当key=0x7e时执行跑马灯程序,当case等于其他时执行其他程序
#define uchar unsigned char
#define uint unsigned int
uchar key;
void delay(unsigned int cnt)
{
while(--cnt);
}
void paomadeng()
{
uint j=1;
P1=0xfe; //给初始化值 换算成二进制是1111 1110
while(j)
{
delay(30000);//延时程序
P1<<=1; //左移一位 该语句等效于 P1=P1<<1
P1|=0x01; //最后一位补1,该语句等效于 P1=P1|0x01 符号"|"表示"或"
if(P1==0x7f) //检测是否移到最左端?"=="表示检测符号2端的值是否相等
{
delay(30000);
P1=0xfe; //重新赋值
}
//j+=1;
if(key!=0x7e)
j=0;
else j=1;
}
}
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值中间变量
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}
void main()
{
// P2=0x00; //1数码管亮 按相应的按键,会显示按键上的字符
while(1)
{
key=keyscan(); //调用键盘扫描,
switch(key)
{
case 0x7e:paomadeng();break;//0 按下相应的键显示相对应的码值
case 0x7d:P1=0xfd;break;//1
case 0x7b:P1=0xfb;break;//2
case 0x77:P1=0xf7;break;//3
case 0xbe:P1=0xef;break;//4
case 0xbd:P1=0xdf;break;//5
case 0xbb:P1=0xbf;break;//6
case 0xb7:P1=0x7f;break;//7
// case 0xde:P1=0x7f;break;//8
// case 0xdd:P0=dofly[9];break;//9
// case 0xdb:P0=dofly[10];break;//a
// case 0xd7:P0=dofly[11];break;//b
// case 0xee:P0=dofly[12];break;//c
// case 0xed:P0=dofly[13];break;//d
// case 0xeb:P0=dofly[14];break;//e
// case 0xe7:P0=dofly[15];break;//f
}
}
}
我想通过if (key!=0x7e) j=0; else j=1;跳出while循环,结果跳不出来,这是什么原因呢?我该怎么改呢?我的目的是当key=0x7e时执行跑马灯程序,当case等于其他时执行其他程序