各位好: 刚巧早日看到这标题, 我也是初学单片机, 见这题目, 我按照原同学思路及要求修改如下, 多谢指正 #include <reg52.h> #include <intrins.h> #define SMG_duan P0 //定义数码管段码 为 P0端口 #define SMG_wei P2 //定义数码管位码 为 P2端口 sbit key1 = P3^0; //定义 key1~key3 输入为 P3.0~P3.2 端口 sbit key2 = P3^1; sbit key3 = P3^2; char Wei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; char Duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void delayxms(unsigned int x) //这延时函数是原同学的设计 { unsigned char i, j; while(x>0) { _nop_(); i = 2; j = 199; do { while (--j); } while (--i); x--; } } void main() { unsigned char a; unsigned int b; while(1) { if(key1 == 0) // key1被按下时执行 { SMG_duan = 0x00; delayxms(20); while(!key1); // key1放开时显示 SMG_duan = Duan[6]; // 显示 66666666 SMG_wei = 0X00; } if(key2 == 0) // key2被按下时执行 { SMG_duan = 0x00; delayxms(20); while(!key2); // key2放开时显示 while(key1!=0 && key2!=0 && key3!=0) // 此处原程序有错 while(1)会进入死循环, 所以我検查这 { // 三个按键作为退出条件 for(a=0; a<6; a++) { SMG_duan = Duan[a+1]; SMG_wei = Wei[a]; delayxms(1); //显示 123456 } } } if(key3 == 0) // key3被按下时执行 { SMG_duan = 0x00; delayxms(20); while(!key3); // key3放开时显示 b = 500; while(b--) { for(a=0; a<=1; a++) { SMG_duan = Duan[a]; SMG_wei = Wei[7-a]; delayxms(1); // 先用动态型式显示 10 } } for(a=0; a<=9; a++) // 此处我曾经用a=9;a>0;a-- 但出现循环, 原因我定了 { // a为uchar, 所以沒有负数, 永远为0, for为死循环 SMG_duan = Duan[9-a]; SMG_wei = Wei[7]; // 再用靜态型式显示 9~0 delayxms(1000); } } } } */*** 这个程序我是用普中开发板通过, 所以程序有些部份需配合开发板设计 ***/ */*** 这个程序我设计是先按下, 放手后执行显示 ***/ |
当你按下K2后,就一直在里面循环里。 while(1) { for(a=0;a<6;a++) { DU=1; P0=D[a+1]; DU=0; P0=0xff; WE=1; P0=W[a]; WE=0; delayxms(1); } } |
lkc8210 发表于 2022-2-19 00:10 好的,谢谢 |
Proteus仿真没有楼主说的问题 怀疑是KEY3焊接时对地短路了 KEY2的显示代码有问题,没有成功消影 |