用STC89C51单片机键盘输入任意一个8位的数字,然后在两个数码管(加起来)上显示出来,C语言程序怎么写? 5

我是新手,还不会编程,要求键盘输入数字在数码管上显示8个数字,比如显示12045781,... 我是新手,还不会编程,要求键盘输入数字在数码管上显示8个数字,比如显示1204 5781, 展开
 我来答
zhxiufan
2013-06-09 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38385
国家科技进步奖

向TA提问 私信TA
展开全部

#include<reg51.h>
#define uchar unsigned char;
uchar LED1,LED2,LED3,LED4;
uchar keyval,calflag,s_dat,d_dat;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
unsigned int number,r_dat;

void delay(unsigned int a)
{
 unsigned int i,j;
 for(i=0;i<a;i++)
  for(j=0;j<1000;j++);
}
void dealdat()
{
 switch(calflag)
 {
 case 0:
  r_dat=s_dat+d_dat;
  break;
 case 1:
  r_dat=s_dat-d_dat;
  break;
 case 2:
  r_dat=s_dat*d_dat;
  break;
 case 3:
  r_dat=s_dat/d_dat;
  break;
 default:break;
 }
 LED1=(r_dat/1000)%10;
 LED2=(r_dat/100)%10;
 LED3=(r_dat/10)%10;
 LED4=r_dat%10;
}
uchar kbscan(void)
{
 unsigned char sccode,recode;
 P3=0x0f;  //发0扫描,列线输入
 if ((P3 & 0x0f) != 0x0f)  //有键按下
 {
  delay(20);   //延时去抖动
  if ((P3&0x0f)!= 0x0f)
  {
   sccode = 0xef;    //逐行扫描初值
   while((sccode&0x01)!=0)
   {
       P3=sccode;
    if((P3&0x0f)!=0x0f)
    {
        recode=(P3&0x0f)|0xf0;
     return((~sccode)+(~recode));
     }
          else
    sccode=(sccode<<1)|0x01;
   }
  }
 }
 return 0;  //无键按下,返回0
}

void getkey(void)
{
 unsigned char key;
 key=kbscan();
 if(key==0){keyval=0xff;return;}
  switch(key)
  {
  case 0x11:keyval=7;break;
  case 0x12:keyval=4;break;
  case 0x14:keyval=1;break;
  case 0x18:keyval=10;break;
  case 0x21:keyval=8;break;
  case 0x22:keyval=5;break;
  case 0x24:keyval=2;break;
  case 0x28:keyval=0;break;
  case 0x41:keyval=9;break;
  case 0x42:keyval=6;break;
  case 0x44:keyval=3;break;
  case 0x48:keyval=11;break;
  case 0x81:keyval=12;break;
  case 0x82:keyval=13;break;
  case 0x84:keyval=14;break;
  case 0x88:keyval=15;break;
  default:keyval=0xff;break;
  }
}

void t0isr() interrupt 1
{
 TH0=0xf4;
 TL0=0x48;
 switch(number)
 {
 case 0:P2=0x04;P0=distab[LED1];break;
 case 1:P2=0x08;P0=distab[LED2];break;
 case 2:P2=0x01;P0=distab[LED3];break;
 case 3:P2=0x02;P0=distab[LED4];break;
 default:break;
 }
 number++;
 if(number>3)number=0;
}
main()
{
 TMOD = 0x01;
 number = 0;
 TH0=0xf4;
 TL0=0x48;
 TR0=1;
 ET0=1;
 EA=1;
 LED1=0;
 LED2=0;
 LED3=0;
 LED4=0;
 while(1)
 {
 getkey();
 switch(keyval)
 {
 case 0:
 case 1:
 case 2:
 case 3:
 case 4:
 case 5:
 case 6:
 case 7:
 case 8:
 case 9:
  LED3=LED4;
  LED4=keyval;
  LED1=0;
  LED2=0;
  break;
 case 10:break; //"ON"
 case 11: //"="
  d_dat=LED3*10+LED4;
  dealdat();
  break;
 case 12: //"/"
  calflag=3;
  s_dat=LED3*10+LED4;
  LED3=0;
  LED4=0;
  break;
 case 13: //"*"
  calflag=2;
  s_dat=LED3*10+LED4;
  LED3=0;
  LED4=0;
  break;
 case 14: //"-"
  calflag=1;
  s_dat=LED3*10+LED4;
  LED3=0;
  LED4=0;
  break;
 case 15: //"+"
  calflag=0;
  s_dat=LED3*10+LED4;
  LED3=0;
  LED4=0;
  break;
 default:break;
 }
 }
}

追问

键盘输入,在2个4位7段数码管上同时显示所需的8个数字,你发的图只能显示4个数字。我们的单片机是这样的

Cindere鞡
推荐于2017-12-16 · TA获得超过7254个赞
知道大有可为答主
回答量:1148
采纳率:84%
帮助的人:515万
展开全部
给你点思路,自己写出来的程序才有意义。如果只有两个数码管的话,那么最大值也只有99,那么输入的两个数最大也只能一个49一个50,这样的话还是很简单的,建立带返回值的键盘函数和显示函数,将键盘函数返回的值第一个乘以10加上第二个,第三个乘以10加上第四个,就组成两个输入的数值,当然你可以加上判断函数是否大于50或49,然后这两个输入数相加送显,再分解为两个数,一个十位一个个位,利用查表法在数码管中显示,就达到了要求。
不懂的可以随时回复我。
希望我的回答能帮助到你。
追问
我用的是STC89C51单片机,键盘输入,在2个4位7段数码管上同时显示所需的8个数字,
我是新手,还不会编程,能否给我一个完整程序我参考看看,谢谢!
追答
你问得也太不清楚了,2个4位数码管,说清楚多好。程序我可以给你,今晚吧,现在有事。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
叉烧包005
2013-06-09 · 超过14用户采纳过TA的回答
知道答主
回答量:158
采纳率:0%
帮助的人:53.2万
展开全部
键盘输入?
通过串口链接的么?你的数码管应该是两段 8组吧。
首先8位数拆分为前四位,后四位。然后再一位一位的显示。还是需要自己写,这样掌握比较快。
追问
通过RS232串口转USB接口,数码管有两块,每一块可以显示4个数字的那种
但是我是新手,还不会编程,想要一个这样的程序代码参考看看
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式