数码管显示问题:写的c程序在运行时,2位数码管只能每一位单独显示,如果一起显示就出错
#include reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit PRESS1=P1^0;
sbit PRESS2=P1^1;
sbit PRESS3=P1^2;
uint a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0到9
uint b[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
int miao=45,fen=58,shi=15;
uint jishu;
uint miaog,miaos,feng,fens,shig,shis;
int ji;
void init()//初始化函数设置中断寄存器的值。
{
jishu=0;
TMOD=0x01;
TR0=1;
ET0=1;
EA=1;
TH0=0x3c;
TL0=0xb0;
}
void delay(x)//延时函数。
{
uint i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
void xian()//把时分秒送到数码管显示。
{
uint i;
miaog=miao%10;
miaos=miao/10;
feng=fen%10;
fens=fen/10;
shig=shi%10;
shis=shi/10;
for(i=0;i8;i++)
{
switch(i)
{
case 0:P3=b[7];P2=a[miaog];break;
case 1:P3=b[6];P2=a[miaos];break;
case 2:P3=b[5];P2=0x40;break;
case 3:P3=b[4];P2=a[feng];break;
case 4:P3=b[3];P2=a[fens];break;
case 5:P3=b[2];P2=0x40;break;
case 6:P3=b[1];P2=a[shig];break;
case 7:P3=b[0];P2=a[shis];break;
}
delay(1);
};
}
void jiance()//检测键是否按下按不同键实现不同的处理。
{
if(PRESS1==0)
{
delay(2);
if(PRESS1==0)
{
while(!PRESS1);
ji++;
if(ji>=4)
ji=0;
}
}
if(ji==1)
{
if(PRESS2==0)
{
delay(1);
while(!PRESS2);
miao++;
if(miao>=60)
{
miao=0;
fen++;
}
}
if(PRESS3==0)
{
delay(1);
while(!PRESS3);
miao--;
if(miao0)
{
miao=59;
}
}
}
if(ji==2)
{
if(PRESS2==0)
{
delay(1);
while(!PRESS2);
fen++;
if(fen>=60)
{
fen=0;
sh......顺一门有百福 平安二字值千金 万象更新
动态显示程序,必须不停的、反复的调用。
稍有停顿,就只能看见最后显示的一位字符。
解决方法,可以参考我以前回答的问题:
http://zhidao.baidu.com/question/408722818.html
{
p20=1;
//p20=0;
//p21=1;
P0=gewei;
delay(300);
p20=0;
//p20=1;
//p21=0;
p21=1;
P0=shiwei;
delay(300);
p21=0;
}
显示这样改一下。 一般是开位选,送段(这2 个先后可以试),延时1~3ms,关位选 。再下一位。。。这样处理比较容易成功。
是延时太快了吧
扫描显示有问题 一般都是延时的事
单片机串口控制数码管显示两位数字时显示不对。
程序都是对的,你对16进制 10进制数。可能没理解透彻。。。你的数码管显示是10进制显示模式。所以出现了这种情况。你可以改成16进制显示。也可以自己发送数据的时候换算一下10进制应该是什么?是否跟显示的值一样?文本模式也是显示的对的。。。下面网址是ASII码表。你发送的文本1ASII码值就是49(10...
51单片机控制数码管显示不正常问题,为什么后面4位数码管1234和5678都...
授人以鱼不如授之以渔。先建立程序的一般结构,然后定义一个code数组,里边存放数码管显示0~9的数据,之后定义一个display显示函数,传递参数但不返回参数,然后将传递的参数(1234或5678)分解成4哥单个数,然后依次选择要显示的数码管和数据,紧接消影和简单暂时,这样一个数码管显示就完成了,之后三个...
单片机中二位数码管的显示,怎样用c语言写一段从0到99的程序啊?
公阳,P0.2,P0.3 分别通过PNP管接个位,十位数码管公共端,P1口输出数据,都是低电平有效 include <reg51.h> sbit shi=P0^3; \/\/十位公共极 sbit ge=P0^2; \/\/个位公共极 define Out P1 \/\/数据输出端 unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8...
数码管动态显示
然后延时delay(5);执行到时(10),由于P0给出了ge的段码,而位码还没改变,这时候当然要在第一个数码管上显示第二个数码管的内容。执行到(14),位码改变,第二个数码管被选中,这时段码和位码共同作用,第二个数码管显示ge所对应的数字。然后延时。由于第一个数码管显示ge的时间很短,只有不到...
用数码管显示路灯亮的时间,用C语言写单片机程序
数码管显示路灯亮的时间是一个常见的应用场景,可以通过单片机来实现。下面是一个简单的C语言程序示例,用于控制数码管显示路灯亮的时间。```c include sbit D1 = P2^0; \/\/ 定义数码管引脚 sbit D2 = P2^1;sbit D3 = P2^2;sbit D4 = P2^3;void delay(unsigned int t) \/\/ 延时函数...
...我在做protues仿真数字温度电路时,数码管不显示数字?
这种情况,一般用排它法来找问题原因。你先写个最简单的数码管显示程序,就让数码管固定显示“123”之类的,来检查硬件电路和数码管驱动函数是否正确。如果显示空白,那就检查仿真电路是否正确,数码管是否接电源,有没有把单片机IO口搞错;如果有显示但显示的是乱码,那多半是把数码管共阴共阳搞反了,...
STC89C51单片机串口通讯 ,发送数据数码管不显示,大佬们帮忙看看代码哪里...
STC89C51单片机串口通讯 ,发送数据数码管不显示,是因为串口初始化程序错误,设置串口方式1,要写成一行,别分开写,那样写是错的。写成SCON=0x50;TMOD方式也错了,串口用定时器T1的方式2。应该是TMOD|=0x20;你这个程序,T0和串口初始化写成了两个子程序,最好不要这么写程序,直接在主程序中合并写一...
为什么Proteus中数码管显示不全,是不是89c51单片机自身存在的问题
动态显示的话Proteus中数码管显示有时会不全 和刷新频率有关 同时Proteus中数码管显示效果和实际有很大出入 静态显示的话是肯定没问题的啦
什么是数码管动态显示
P0 = dis_code[dis_index]; \/\/ 段码送P0口 P2 = (char) pow(2, dis_index); \/\/ 位码送P2口 delayms(255); } 再次下载到板上发现仍有问题, 即延时很小的时候显示混乱,但加大延时时间(如程序中的值)可以观查到数码管是按位正确显示的。另外用这种方法产生的代码量也很大(从写入速度看,很明显)。
我有一个病历管理系统,一点代码维护它就显示错误,自动退出系统是怎么...
6. 对库房的药品自动进行助记码的添加。7. 可实现病人电子照片及文书一类文件添加,从而进行察看、对比,及时了解病人的治疗效果。8. 对病人的治疗疗程实现自动提醒的功能,还可对诊疗的患者进行临床分析。9. 对一些禁忌药品的可进行提示警告。10. 病历、处方的自定义设置、打印预览和打印。免却手工写...
鲜兔芩连: void display(int n) { char b3, b2, b1; //定义两个有符号整形数b3,b2和b1 b3=n/100; b2=(n/10)%10;//这里应该这样才对不然会大于10的 b1=n%10;//百位 P0=seg7[b3]; // en3=0; //显示DS2 ms_delay(10); //延时 en3=1; //关闭DS2 //十位 P0=...
陆良县18799632307: 求单片机数码管显示C程序 - ?
鲜兔芩连: 这个就是数码管的动态刷新问题,你直接将要显示的数的对应数码管值从你的p1口输出,然后选择1或者2来显示,再做个几毫秒的延时,再将下一个要显示的数的对应数码管值从你的p1口输出,然后选择2或者1来显示,再做个几毫秒的延时,循环这个过程就行了.当然数码管的1、2也要接到单片机的输出口上,才能选择,而且还要考虑你的数码管是共阴还是共阳的接法,这样才能正确的选择p1口的输出电平和1、2两个接口的输入电平
陆良县18799632307: 51单片机问题 编写4个LED数码管循环显示2008的程序. 用C语言写.. - ?
鲜兔芩连: #include<reg51.h> //----------------------------------------------- void delay(unsigned int i) //延时 {unsigned char j;while(i--) for(j = 0; j < 115; j++); } //----------------------------------------------- void main(void) {unsigned char n1;unsigned char code SEG[] = {0xc0, ...
陆良县18799632307: C语言中无法控制数码管显示! - ?
鲜兔芩连: 首先从理论上说这个问题是不存在的,一定是硬件或软件上的原因.如果汇编可以,说明硬件没有问题,那就剩下软件.对应汇编的#10000000b ,C中应该是0x32,建议在包含头文件以后直接: include main() { P3=0x32; } 观察灯的状态,活用万用表直接测量引脚电压确定结果.你好:根据你补充的题目,我想谈一下单片机的学习问题,这是我自己的经历.单片机开始学的时候,如果想要详细了解其内部的工作原理,可以学习汇编,这样可以清楚的知道每一步的寄存器工作.但是从应用的角度来看,还是要用C语言,因为他会让你的思路更加清晰,让你的程序更加易懂.而且汇编能实现的功能,C语言同样可以实现.所以,为什么不选择C语言呢.
陆良县18799632307: C语言控制单片机共阳极数码管,出现问题 - ?
鲜兔芩连: 把num[4][4]的声明改成 uint code num[4][4]= { {0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15},};
陆良县18799632307: 求助C语言写了一段控制数码管静态显示的程序,编译老是出错,哪位大哥进来帮帮忙啊,谢谢了!?
鲜兔芩连: while(1){}最后的两个分号去掉 for(y=z;y>0;y--) { };加上一个分号
陆良县18799632307: 单片机的数码管显示两位数的c出现了问题? - ?
鲜兔芩连: s1=0只是让 p0.0口为0 P0=0xfe 也是让 P0.0口为0,但还让别的口为高.你s1=0时,要让s2等等别的口为高才行.要是同时有两个或多个为0就不行了.
陆良县18799632307: C语言编程51单片机,启动时8个LED闪烁,按下K1数码管显示28,求大神给个编好的程序谢谢! - ?
鲜兔芩连: void onboot() {/* 执行LED灯闪烁*/} void ongpio8() {/* 执行K1数码管显示.例如 */}
陆良县18799632307: 用C语言编写数码管显示3的倍数(0 ,3,6,9.......)6段灯从右边开始亮 - ?
鲜兔芩连: bool check_multiple(int a, int b) { if (a == 0 || a%b == 0) return true; return false; } 至于你说的从右边开始,sorry, 不清楚,数据是怎么输入的 因为这个数组不太清楚是有序还是无序的排列 然后数码管显示的话,这样要查厂商的API了
陆良县18799632307: 51单片机用c语言编写一个程序,数码管显示从10到30,再从30到10. - ?
鲜兔芩连: 大概理解你的意思,是在数码管一次排列好这一句话,首先第一步需要做的是数码管的取模工作.#include//这边为了让你看的更容易,用的是单独操作,没有用总线sbitled1=P1^0;sbitled2=P1^1;sbitled3=P1^2;sbitled4=P1^3;sbitled5=P1^4;sbitled6=P1^5;sbitled7=P1^6;//看清楚自己的管脚,不一定对应,这里采用P0对应段选codeunsignedcharled_paly[5]={0x76,0x79,0x38,0x38,0x5c};//HELLOvoiddelay(unsignedintum)//延时函数{inti,j;for(i=0;i