单片机c语言程序

好心人帮小弟看看下面这段程序什么意思,最好能注释一下。小弟没积分,帮帮忙,谢谢!
#include<reg51.h>
#define uchar unsigned char
sbit dp=P1^4;
sbit sh=P1^5;
void delay(unsigned int t);
uchar Getkey(void);
void Disp(uchar n);
uchar Disptab[10]={0x11,0x7d,0x23,0x29,0x4d,0x89,0x81,0x3d,0x1,0x9};
main()
{ uchar key;
char Vol1=0x00,Vol2=0x00;
Disp(Disptab[Vol2]);
Disp(Disptab[Vol1]-1);
P0=0x00;
while(1)
{ key=Getkey();
switch(key)
{ case 0x01:break;
case 0x02:break;
case 0x04:if(Vol1==0&&Vol2==0)break;
Vol2--;
if(Vol2<0)
{ Vol2=9;Vol1--; }
Disp(Disptab[Vol2]);
Disp(Disptab[Vol1]-1);
P0=4.3*(Vol1*10+Vol2);
break;
case 0x08:if(Vol1==9&&Vol2==9)break;
Vol2++;
if(Vol2==10)
{ Vol2=0x00;Vol1++; }
Disp(Disptab[Vol2]);
Disp(Disptab[Vol1]-1);
P0=4.3*(Vol1*10+Vol2);
break;
default:break; } } }
uchar Getkey(void)
{uchar key;
P1|=0x0f;
if(!(~(P1|0xf0))) return 0x00;
delay(0x20);
if(!(~(P1|0xf0))) return 0x00;
key=~(P1|0xf0);
while(~(P1|0xf0));
return key; }
void delay(unsigned int t)
{ while(--t); }
void Disp(uchar n)
{ uchar i;
for(i=0;i<8;i++){
sh=0;
if(0x80&n){
dp=1; }
else
{ dp=0; }
sh=1;
n=(n<<1)+1; } }
各位帮帮忙吧!等小弟有了积分再给你补上,谢谢!QQ:489647502

这个非常有那度,估计是要在某种硬件上显示什么,没有硬件电路太难了,一切都得靠猜,分析如下,当然很大一部分是和硬件相关掉,如果你有硬件电路,我还可以继续帮你分析
#include<reg51.h>
#define uchar unsigned char
sbit dp=P1^4;
sbit sh=P1^5;
void delay(unsigned int t);
uchar Getkey(void);
void Disp(uchar n);

uchar Disptab[10]={0x11,0x7d,0x23,0x29,0x4d,0x89,0x81,0x3d,0x1,0x9};
/*
0x11 0001 0001
0x7d 0111 1101
0x23 0010 0011
0x29 0010 1001
0x4d 0100 1101
0x89 1000 1001
0x81 1000 0001
0x3d 0011 1011
0x01 0000 0001
0x09 0000 1001
*/

main()
{
uchar key;
char Vol1=0x00,Vol2=0x00;
Disp(Disptab[Vol2]); //disp(0x11)
Disp(Disptab[Vol1]-1);//disp(0x10)
P0=0x00;
while(1)
{
key=Getkey();
/*case 0x04,与case 0x08交替执行第一次只能执行case 0x08
case 0x04,不再执行时Vol1=0,Vol2=0
case 0x08,不再执行时Vol1=9,Vol2=9
*/
switch(key)
{
case 0x01: //按下的键为P1.0不处理
break;
case 0x02: //按下的键为P1.1不处理
break;
case 0x04: //按下的键为P1.2
if(Vol1==0&&Vol2==0) // 起始时Vol1、Vol2都为0,按下P1.2时不处理
break;
Vol2--;
if(Vol2<0)
{
Vol2=9;
Vol1--; //
}
Disp(Disptab[Vol2]); //Vol2=9,8,7,6,5,4,3,2,1,0
Disp(Disptab[Vol1]-1);//Vol1=9,8,7,6,5,4,3,2,1,Vol2变化十次Vol1变化一次
P0=4.3*(Vol1*10+Vol2);//Vol1*10+Vol2从99减到0,乘以4.3我不知道干什么用的
//当然这都是在理想状态下,就是在这个过成中没有按键按下
break;
case 0x08:
if(Vol1==9&&Vol2==9)
break;
Vol2++;
if(Vol2==10)
{
Vol2=0x00;
Vol1++;
}
Disp(Disptab[Vol2]); //Vol2=0,1,2,3,4,5,6,7,8,9
Disp(Disptab[Vol1]-1);//Vol1=0,1,2,3,4,5,6,7,8,9
P0=4.3*(Vol1*10+Vol2); //Vol1*10+Vol2从0加到99,乘以4.3我不知道干什么用的
//同上
break;
default:
break;
}
}
}
//检测按键
uchar Getkey(void)
{
uchar key;
P1|=0x0f;//准备检测P1 0000 1111
if(!(~(P1|0xf0)))//检测低四位是否有某一位被置1
return 0x00;
delay(0x20); //可能是用于消抖,如果不懂的话百度一下
if(!(~(P1|0xf0)))//再次检测是否有按键被按下
return 0x00;
//记录按键的位置
key=~(P1|0xf0); //P1|0xf0 1111 xxxx ~(P1|0xf0) 0000 xxxx(xxxx中正常的话应该只有一位唯1,因为在检测前已将低四位置1
while(~(P1|0xf0));//松手检测
return key;
}

//延时
void delay(unsigned int t)
{
while(--t);
}

//执行过后dp先后显示的为是~n 设n=0001 1000 则dp第一次是1,然后是1然后。。。结束时dp: 1110 1110
void Disp(uchar n)
{
uchar i;
for(i=0;i<8;i++)
{
sh=0; //P1.5
if(0x80&n) // x000 0000 检测n是否为负
{
dp=1; //P1.4
}
else
{
dp=0; //P1.4
}
sh=1; //P1.5
n=(n<<1)+1;
}
}
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

大家正在搜

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网