程序1:
#include<reg51.h>
#define GPIO_DIG P0 //定义字形接口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4; //74LS138定义字位
unsigned char code DIG_NUM[8]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
};//字形库
void main()
{
unsigned char i,j;
while(1) //为什么这个while循环一定要加,不然显示不正常,具体现象为最高位的所有数码管都微亮,而且显示出7的亮度 很大。其他位值数码管显示正确数字,但亮度为微亮,
{
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break;
case 1:LSA=1;LSB=0;LSC=0;break;
case 2:LSA=0;LSB=1;LSC=0;break;
case 3:LSA=1;LSB=1;LSC=0;break;
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
GPIO_DIG=DIG_NUM;
j=100; //扫描间隔
while(j--);
GPIO_DIG=0x00; //消隐
}
}
}
程序2:
#include<reg51.h>
#define GPIO_DIG P0 //定义字形接口
#define GPIO_KEY P1 //定义4x4矩阵按键接口
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4; //74LS138定义字位
unsigned char keystate; //按键是否按下判断值
unsigned char keyvalue; //按键值
unsigned char DIG_DATA[8]; //字形临时数据
unsigned char code DIG_NUM[17]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00
}; //字形库
void delay10ms(); //延时10ms
void keydown(); //按键判断
void DIG_display(); //显示
void delay10ms() //延时子程序10ms
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void keydown() //按键判断子程序
{
unsigned int n=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
delay10ms();
if(GPIO_KEY!=0x0f)
{
keystate=1;
GPIO_KEY=0x0f;
switch(GPIO_KEY)
{
case 0x07:keyvalue=0;break;
case 0x0b:keyvalue=1;break;
case 0x0d:keyvalue=2;break;
case 0x0e:keyvalue=3;break;
default:keyvalue=17;
}
GPIO_KEY=0xf0;
switch(GPIO_KEY)
{
case 0x70:keyvalue=keyvalue;break;
case 0xb0:keyvalue=keyvalue+4;break;
case 0xd0:keyvalue=keyvalue+8;break;
case 0xe0:keyvalue=keyvalue+12;break;
default:keyvalue=17;
}
while((n<1000)&&(GPIO_KEY!=0xf0))
{
delay10ms();
n++;
}
n=0;
}
}
}
void DIG_display() //显示子程序
{
unsigned char i,j;
// while(1) //为什么这里不用while???
// {
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break;
case 1:LSA=1;LSB=0;LSC=0;break;
case 2:LSA=0;LSB=1;LSC=0;break;
case 3:LSA=1;LSB=1;LSC=0;break;
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
// default: i=17;break;
}
GPIO_DIG=DIG_DATA;
j=100;
while(j--);
GPIO_DIG=0x00;
}
}
//}
void main()
{
keystate=0;
while(1)
{
keydown();
if(keystate==1) //左移
{
DIG_DATA[7]=DIG_DATA[6];
DIG_DATA[6]=DIG_DATA[5];
DIG_DATA[5]=DIG_DATA[4];
DIG_DATA[4]=DIG_DATA[3];
DIG_DATA[3]=DIG_DATA[2];
DIG_DATA[2]=DIG_DATA[1];
DIG_DATA[1]=DIG_DATA[0];
DIG_DATA[0]=DIG_NUM[keyvalue];
keystate=0;
}
DIG_display();
}
}
两个程序,程序1是8个数码管从低位到高位,依次显示0到7;程序2是显示按键的值,并且之前按下的值会左移。
问题是程序1显示的程序需要加while才能显示正常,而程序2里面显示子程序不能加while,否则不显示,有大神能解释一下疑惑么?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>