|
总的看来,问题比较多。 简单改法: 扫描显示的意义在于无论如何,显示代码在循环中都需要跑一次,这才是扫描。所以 //显示两位数码管 这段代码 需要放在 while(1)中长期运行,而不能放在 if(tj==0) //设置输出电压 里 这样在输出电压时,就只能显示一位了。 所以 按键判断 while(P3_6==0) // 等待按键松开 也是不合适的,这样键盘按下不放时,只会显示一位。 建议做法: 主循环while(1)不能存在卡循坏的代码。 按键在while(1)里取值,连续5次一致,认可此次按键有效(用于消抖),去掉while(P3_6==0);这类代码。然后比较此次按键与上次按键的不同,用于判断按下或是松开按键。这样写法还可加入按键时长的计算,便于代码的扩展。 //显示两位数码管 代码放于主循环中,保证一直运行。 |
lkc8210 发表于 2022-4-20 14:33 搞错了 ,这个才是 #include<math.h> #include <reg51.h> #define uchar unsigned char #define uint unsigned int char led[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; char led1[]={0x3f,0x06,0x5b,0x4f,0xe66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit P3_7=P3^7; //加键 sbit P3_6=P3^6; //减键 sbit P3_1=P3^1; sbit P3_0=P3^0; sbit P3_4=P3^4; //模式选择(设置输出电压值模式or电压输出模式) uchar set=50,tj=0; void delay (unsigned int time) { unsigned j; for (;time>0;time--) for(j=0;j<125;j++) ; } void main () { while (1) { if(P3_4==0) { tj=!tj; while(P3_4==0) ; } if(tj==0) //设置输出电压 { //扫描按键1 if(P3_7==0) { delay(10); // 摁键消抖 if(P3_7==0) { set++; if(set>99) set=99; // 设置显示最大值 while(P3_7==0) // 等待按键松开 ; } } //扫描按键2 if(P3_6==0) { delay(10); // 摁键消抖 if(P3_6==0) { set--; if(set<0) set=0 ; // 设置显示最小值 while(P3_6==0) // 等待按键松开 ; } } //显示两位数码管 P3_0=0; P3_1=1; P0=led[set/10]; delay(50) ; P3_0=1; P3_1=0; P0=led1[set%10]; delay(50) ; } else{ P2=(float)set*2.56 ; //输出算法 // P2=25.6; } } } |
lkc8210 发表于 2022-4-20 14:33 #include<reg52.h> #define uchar unsigned char #define uint unsigned int uint aa,b,bb; sbit p1=P2^7; sbit p2=P2^6; sbit p3=P2^5; sbit p4=P2^4; sbit dp=P0^7; sbit an1=P1^4; sbit an2=P1^5; sbit an3=P1^6; sbit CLK=P1^2;/*定义DAC控制端口*/ sbit CS=P1^1; sbit DIN=P1^3; uchar code SegCode[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc1}; int moshi=0; void DelayMs(uchar n) { uchar j; while (n--) { for (j = 0; j < 113; j++); } } void keyscan1() /*复位*/ { if(an1==0) { aa=0; bb=0; } while(an1==0); } void keyscan2() /*按键1进行加1*/ { if(an2==0) { if(aa<99) { aa=aa+1; bb++; } } while(an2==0); } void keyscan3() /*按键2进行减1*/ { if(an3==0) { if(aa>0) { aa=aa-1; bb--; } } while(an3==0); } /*显示函数*/ void display(void) { p1=0;p2=0; if(bb/10%10==0) P0=SegCode[1]; else P0=SegCode[bb/10%10]; p1=1;p2=0; DelayMs(1); p1=0;p2=0; P0=SegCode[bb/1%10]; dp=0; p1=0;p2=1; DelayMs(1); p1=0;p2=0; } void DA_Conver(unsigned int DAValue) { unsigned char i; DAValue <<= 6; CS = 0; CLK = 0; for(i = 0; i < 12; i++) { DIN = (bit)(DAValue & 0x8000); CLK = 1; DAValue <<= 1; CLK = 0; } CS = 1; CLK = 0; } float zh (float k) { float DA; DA=k*1024/500; /*2.5v参考电压!*/ return DA; } void init_timer() { TMOD=0x01; TH0=(65536-3500)/256; TL0=(65536-3500)%256; EA=1; ET0=1; TR0=1; } void main() {long DAValue=0; aa=0; init_timer(); while(1) { DAValue=zh(aa); /*输出电压*/ DA_Conver(DAValue); keyscan1(); keyscan2(); keyscan3(); } } void time0() interrupt 1 { TH0=(65536-3500)/256; TL0=(65536-3500)%256; b++ ; if(b==2) {b=0; display(); } } 这是我的代码,如果想显示的话,该怎么改才行 |
| 你的延时时间可能有问题,一般这个延时时间几个毫秒。 |
|
代码只给一部份如瞎子摸象 问题现象加上现有代码 可退敲出几个问题可能 1. 没有消影 2. 延时不足 3. 其他代码耗时太长 |
xianfajushi 发表于 2022-4-19 21:04 不行啊,还是只亮各位 |
munuc_w 发表于 2022-4-20 08:48 该怎么写,求指导, |
| 这个代码运行到个位显示就结束了,当然只有个位在显示了。要想两位都显示,需要不停的循环运行显示代码部分,这是动态显示电路工作的基本原理。 |
| P0=~led1[set%10]; 试看 |