1sdaw123 发表于 2018-5-21 22:32 软件是建立在硬件的基础上的,首先要了解硬件电路,才能编写与其相适应的软件。没有包打天下的自适应软件。 |
1sdaw123 发表于 2018-5-21 22:32 自己要改程序了,看到你的板子,才知道不是我的板子。但原理差不多。 好像你的573控制口和我的不一样哦。 |
|
好像我有你这板子,所以我有现成的程序。 看看我写的(呵呵——得意的笑——新手的表现) #include<reg51.h> #define SMG P0//数码管 sbit DUAN=P2^6; sbit WEI1=P2^7; unsigned char code ZF[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77 ,0x7c,0x39,0x5e,0x79,0x71,0x00};//标准0~F数码管显示码 unsigned char code WEI[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//控制哪一位数码管显示 //一次一位,对应最左位→最右位 unsigned char DisplayData[8];//用来存放要显示的8位数的值,一个管分配一位数组,叫显示缓存 void DigDisplay()//数码管动态显示函数 { unsigned char i,j; for(i=0;i<8;i++)//只有8个数码管 { switch(i) //位选,选择点亮的数码管,并赋值显示内容 { case(0): SMG=WEI[i];//先选位0(最左边),后选段 WEI1=1; WEI1=0; SMG=DisplayData[i];//发送段码 DUAN=1; DUAN=0; break; case(1): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(2): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(3): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(4): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(5): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(6): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; case(7): SMG=WEI[i]; WEI1=1; WEI1=0; SMG=DisplayData[i]; DUAN=1; DUAN=0; break; } j=20;//显示一段时间,再消隐,可以得到稳定的显示 while(j--); SMG=0xff; WEI1=1; WEI1=0; SMG=0x00;//消隐 DUAN=1; DUAN=0;//关闭段码 } } void XSHCFZ (unsigned long j)//显示缓存赋值 { DisplayData[0]=ZF[j/10000000];//将十进制数换算为可显示字符 DisplayData[1]=ZF[(j%10000000)/1000000]; DisplayData[2]=ZF[(j%1000000)/100000]; DisplayData[3]=ZF[(j%100000)/10000]; DisplayData[4]=ZF[(j%10000)/1000]; DisplayData[5]=ZF[(j%1000)/100]; DisplayData[6]=ZF[(j%100)/10]; DisplayData[7]=ZF[(j%10)/1]; } void main(void) { DUAN=0;WEI1=0; XSHCFZ(76543210); while(1) { DigDisplay();//显示 } } 好像和你的板子有点区别:两个锁存器的控制端接的口 不一样,你自己改一下试试。 |
|
想要数码管显示count=116788;要定义变量count为 long 类型,分解这么大的数在12MHz时钟条件下需要耗时约3ms,这会造成数码管闪烁。给你改主循环一次分解一位,显示一位。 #include<reg51.h> #define DataPort P0 sbit duso=P2^1; sbit weso=P2^2; unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char count_Data[6];//定义count的全局变量 void main() { unsigned char i=0; unsigned long count=116788; while(1) { switch(i) { case 0: count_Data[0]=dofly_DuanMa[count/100000]; break; case 1: count_Data[1]=dofly_DuanMa[count%100000/10000]; break; case 2: count_Data[2]=dofly_DuanMa[count%10000/1000]; break; case 3: count_Data[3]=dofly_DuanMa[count%1000/100]; break; case 4: count_Data[4]=dofly_DuanMa[count%100/10]; break; case 5: count_Data[5]=dofly_DuanMa[count%10]; break; } DataPort=0; //清空数据,防止有交替重影 duso=1; //段锁存 duso=0; DataPort=dofly_WeiMa[i+2]; //取位码 weso=1; //位锁存 weso=0; DataPort=count_Data[i]; //取显示数据,段码 duso=1; //段锁存 duso=0; i++; if(i>=6) i=0; } } |
| 主函数中没有发现怎么以调用显示函数呀~~显示似乎没有执行吧?? |