自己弄了一个计算机简单的程序,初学,动态数码管只有最后一位显示,能有大佬告诉我出了什么问题吗

m0_54244045 2021-04-02 05:58:01
#include "reg52.h" typedef unsigned char u8; typedef unsigned int u16; u8 Keyvalue; int n=0; int number=0; int mathsign=0; int sign1=0,sign2=0,sign3=0,sign4=0; int num1=0,num2=0;num3=0;num4=0; int show1,show2,show3,show4,show5=16; u8 mark=0; u8 k; int flag=0; reset=0; #define DigDisplay P0 #define Key P1 sbit LSA=P2^2; //动态数码管位选IO口 sbit LSB=P2^3; sbit LSC=P2^4; u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //共阴数码管 数组 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; void delay(u16 i) //延时函数 { while(i--); } void Appear() //动态数码管显示 { if((number<10000)&&(number>1000)) //将计算最终结果个十百千位数取出 { show1=number/1000; show2=number%1000/100; show3=number%100/10; show4=number%10; } if((number<1000)&&(number>100)) { show1=number/100; show2=number%100/10; show3=number%10; show4=16; } if((number<100)&&(number>10)) { show1=number/10; show2=number%10; show3=16; show4=16; //0xf0 } if(number<10) { show1=number; show2=16; show3=16; show4=16; } if(number==0) { show1=16; show2=16; show3=16; show4=16; } for(k=0;k<8;k++) //动态数码管位选循环,达到同时显示目的 { switch(k) { case(0): LSA=0;LSB=0;LSC=0; break;//显示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//显示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//显示第2位 case(3): LSA=1;LSB=1;LSC=0; break;//显示第3位 case(4): LSA=0;LSB=0;LSC=1; break;//显示第4位 case(5): LSA=1;LSB=0;LSC=1; break;//显示第5位 case(6): LSA=0;LSB=1;LSC=1; break;//显示第6位 case(7): LSA=1;LSB=1;LSC=1; break;//显示第7位 } if(k==0) { DigDisplay=smgduan[show1]; delay(100); DigDisplay=0x00; } if(k==1) { DigDisplay=smgduan[show2]; delay(100); DigDisplay=0x00; } if(k==2) { DigDisplay=smgduan[show3]; delay(100); DigDisplay=0x00; } if(k==3) { DigDisplay=smgduan[show4]; delay(100); DigDisplay=0x00; } if(k>3) { DigDisplay=smgduan[show5]; delay(100); DigDisplay=0x00; } } } void Keydown(void) //矩阵按键 { char a=0; Key=0x0f; //检测列电平确认按下的按键 if(Key!=0x0f) { delay(1000); if(Key!=0x0f) { Key=0x0f; switch(Key) { case 0x07:Keyvalue=0;break; case 0x0b:Keyvalue=1;break; case 0x0d:Keyvalue=2;break; case 0x0e:mathsign=1;break; //最后一列为数学运算符 } Key=0xf0; //检测行电平,确认按下按键所在行 if(mathsign==0) { switch(Key) //给按下的数字键一个数 { case 0x70:Keyvalue=Keyvalue;break; // 0 1 2 + case 0xb0:Keyvalue=Keyvalue+3;break; // 3 4 5 - case 0xd0:Keyvalue=Keyvalue+6;break; // 6 7 8 * case 0xe0:Keyvalue=Keyvalue+9;break; // 9 C = / } if(Keyvalue==11) //按下为11的键相当于按下等号,flag标志位置1 { flag=1; } n++; //每按下一个键,n+1,当n为奇数按下数字,偶数按下运算符 } if(Keyvalue==10) //按下10的键相当于按下重置键,reset同样为标志位 { reset=1; } if(mathsign==1) //按下第四列按键时,sign代表各个运算符 { switch(Key) { case 0x70:sign1=1;break; case 0xb0:sign2=1;break; case 0xd0:sign3=1;break; case 0xe0:sign4=1;break; } n++; } } if(n%2==1) //将按下的数字值赋给变量num { switch(n) { case(1): num1=Keyvalue;break; case(3): num2=Keyvalue;break; case(5): num3=Keyvalue;break; case(7): num4=Keyvalue;break; } Keyvalue=0; } } while((a<50)&&(Key!=0xf0)) //按下一段时间自动退出,按下一次只有一个数 { delay(100); a++; } } void InitInt0() //中断允许位打开 { IT0=1; EX0=1; EA=1; } void main() { while(1) { Keydown(); InitInt0(); if(flag==1) //按下等号时显示最终结果 { Appear(); if(reset==1) //重置 { n=0; flag=0; show1=0; show2=0; show3=0; show4=0; num1=0; num2=0; num3=0; num4=0; reset=0; } } } } void Int0() interrupt 0 //外部中断0 { delay(1000); if((sign1==1)&&(n%2==0)) { switch(n) { case 2: number=num1+num2;break; case 4: number=number+num3;break; case 6: number=number+num4;break; } } if((sign2==1)&&(n%2==0)) { switch(n) { case 2: number=num1-num2;break; case 4: number=number-num3;break; case 6: number=number-num4;break; } } if((sign3==1)&&(n%2==0)) { switch(n) { case 2: number=num1*num2;break; case 4: number=number*num3;break; case 6: number=number*num4;break; } } if((sign4==1)&&(n%2==0)) { switch(n) { case 2: number=num1/num2;break; case 4: number=number/num3;break; case 6: number=number/num4;break; } } }
...全文
372 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复 1
m0_54244045 2021-04-02
  • 打赏
  • 举报
回复
引用 1 楼 dceacho的回复:
没仔细看, 但你既然是动态显示的话Appear();要不停的刷才有得显示啊,所以你应该放在if(flag==1)的外面
我到时候试试
m0_54244045 2021-04-02
  • 打赏
  • 举报
回复
引用 1 楼 dceacho的回复:
没仔细看, 但你既然是动态显示的话Appear();要不停的刷才有得显示啊,所以你应该放在if(flag==1)的外面
但是我用了while(1) {}重复执行
dceacho 2021-04-02
  • 打赏
  • 举报
回复
没仔细看, 但你既然是动态显示的话Appear();要不停的刷才有得显示啊,所以你应该放在if(flag==1)的外面

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧