单片机菜鸟求高人指点 矩阵键盘 数码管,怎么实现:按1显示1,再按2显示12,这样子。。

如题所述

#include<reg52.h>

unsigned char key_num,count=0,k;

unsigned long sum=0;

unsigned char code str[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};

void scan();

void disp_led(unsigned long int dat);

void delay(unsigned int dly);

void main()

{for(k=0;k<=7;k++)

 {SBUF=str[10];

  while(TI==0);

  TI=0;

 }

 while(1)

  {scan();

   count=key_num;

   sum=sum*10+count;

   scan();

   while(key_num!=16)

   scan();

   disp_led(sum);

   delay(1);

   scan();

   while(key_num==16)

   scan();

  }

}

void disp_led(unsigned long int dat)

{

 unsigned char num[8];

 if((dat>=0)&&(dat<=9))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=10;

  num[5]=10;

  num[6]=10;

  num[7]=dat;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=10)&&(dat<=99))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=10;

  num[5]=10;

  num[6]=dat/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=100)&&(dat<=999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=10;

  num[5]=dat/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=1000)&&(dat<=9999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=10;

  num[4]=dat/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=10000)&&(dat<=99999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=10;

  num[3]=dat/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=100000)&&(dat<=999999))

 {

  num[0]=10;

  num[1]=10;

  num[2]=dat/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=1000000)&&(dat<=9999999))

 {

  num[0]=10;

  num[1]=dat/1000000;

  num[2]=dat%1000000/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if((dat>=10000000)&&(dat<=99999999))

 {

  num[0]=dat/10000000;

  num[1]=dat%10000000/1000000;

  num[2]=dat%1000000/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

 if(dat>=100000000)

 {

  dat=dat%100000000;

  num[0]=dat/10000000;

  num[1]=dat%10000000/1000000;

  num[2]=dat%1000000/100000;

  num[3]=dat%100000/10000;

  num[4]=dat%10000/1000;

  num[5]=dat%1000/100;

  num[6]=dat%100/10;

  num[7]=dat%10;

  for(k=0;k<=7;k++)

    {SBUF=str[num[7-k]]; 

     while(TI==0);

  TI=0;

   }

 }

}

void delay(unsigned int dly)

{int i,j;

 for(i=0;i<100;i++)

 for(j=0;j<dly;j++);

}

void scan()

{unsigned char readkey,x_temp,y_temp;

 P2=0x0f;

 x_temp=P2&0x0f;

 P2=0xf0;

 y_temp=P2&0xf0;

 readkey=x_temp|y_temp;

 switch(readkey)

   {case 0x7e:key_num=0; break;

   case 0x7d:key_num=1; break;

 case 0x7b:key_num=2; break;

 case 0x77:key_num=3; break;

 case 0xbe:key_num=4; break;

 case 0xbd:key_num=5; break;

 case 0xbb:key_num=6; break;

 case 0xb7:key_num=7; break;

 case 0xde:key_num=8; break;

 case 0xdd:key_num=9; break;

 case 0xff:key_num=16;

   }

}

图中是led连接的电路,矩阵按键接的是P2口。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-03
迷糊。
第2个回答  2011-05-03
看程序,真正明白数码管的现实原理,弄清楚位选和段码后不难。

...数码管,怎么实现:按1显示1,再按2显示12,这样子。。
unsigned char code str[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};void scan();void disp_led(unsigned long int dat);void delay(unsigned int dly);void main(){for(k=0;k<=7;k++){SBUF=str[10];while(TI==0);TI=0;} while(1){scan();count=key...

...键盘按一个键,显示那一个键的数值,但我这个单片机通上电数码管都不 ...
jlsmg[5]=jlsmg[4];jlsmg[4]=jlsmg[3];jlsmg[3]=jlsmg[2];jlsmg[2]=jlsmg[1];jlsmg[1]=table[jl];keystate=0;jl++;\/\/} display();再添加适当的延时,以便人能观察出显示的变化效果。

单片机 按键控制8位数码管显示问题
display=weima_table[i]; \/\/数码管需要显示的位 weima_latch=1; \/\/锁存器(位码)打开 weima_latch=0; \/\/锁存器(位码)关闭 display=cunchudisplay[i]; \/\/数码管需要显示的段 duanma_latch=1; \/\/锁存器(段码)打开 duanma_latch=0; \/\/锁存器(段码)关闭 Delay(100);} 判断归零...

矩阵键盘在数码管上显示1-16的平方,只显示个位
while(1) { aa1 = fanhui();display(bai, shi, ge); \/\/用显示,当延时,消抖.aa2 = fanhui(); \/\/再读.if (aa1 == aa2) aa = aa1; \/\/两者相等,确认到aa ---如果不相等呢?aa = ?i = aa * aa;bai = i \/ 100;shi = (i % 100) \/ 10;ge = i % 10;dis...

单片机原理及应用张刚毅数码管显示4乘4矩阵键盘键号按下时,显示对应的...
P3=0xff;return (16);} \/ 判键是否按下子函数 \/ void keydown(){ P3=0x0f;if((P3&0x0f)!=0x0f){ keyscan();P0=disp_code[key];beep();} } \/ 主函数 \/ main(){ P0 = 0xbf;P2 = 0x7f; \/\/数码管显示"-"P3 = 0xff;while(1){ keydown();} } ...

关于51单片机的一个小程序,为什么我的数码管不能显示 0 1 2 3 ...
temp = temp&0xf0;这一句过后temp的低四位必定为0,swtch后面的语句都进不了。

一个关于51单片机矩阵键盘的问题。我现在已经能实现矩阵键盘的检测,我 ...
case 0xd0: num=1;break;case 0xb0: num=2;break;case 0x70: num=3;break;} while(temp!=0xf0) \/\/松手检测 { temp=P1;temp=temp&0xf0;display(); \/\/调用显示 } } } P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){ delay(10);while(temp!=0xf0){ temp=P1;temp...

51单片机4*4矩阵键盘求平方问题
是你转换成显示码错了吧,数码管的显示可不是你直接送数就行的,得把256分成三个数,第一个显示2第二个显示5第三个显示6,每个数码管最大显示到9。你的程序第三个为16,这样大于9了,你得分成1和6这样才行。

proteus仿真4x4矩阵键盘中断方式扫描数码管显示
在Proteus仿真中,实现4x4矩阵键盘中断方式扫描并控制数码管显示,主要步骤包括:1. **硬件连接**:将4x4矩阵键盘的行线连接到单片机的某个I\/O口(如P1.0~P1.3),列线连接到另一个I\/O口(如P1.4~P1.7)。数码管的段选线连接到单片机的另一个I\/O口(如P0),用于显示按键对应的字符。2...

想用3*3的矩阵键盘实现每按一个建,LED数码管上面显示对应的数字~1~9
=的优先级高,所以你就得不到答案,加各括号,把与运算的优先级提上去就好了 试试看!~你的if条件判断都存在这个问题呢!~比如说 if(P1&0xf1!=0xf1)应该改为 if((P1&0xf1)!=0xf1)如果还不行就还有其他的问题 我看到你这里有点问题就告诉你,程序我没有全部看完 ...

相似回答