char define uint unsigned int uchar count;uint disnum;sbit dula=P2^6;sbit wela=P2^7;uchar code tabledu[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
1/首先把段码端和片选端都设为输出,也就是led和单片机连的那几个角 2/你先用延时来做吧,大致是这样的 设一个片选有效;把要显示的内容放段码中;延时15ms;设第二个片选有效;把要显示的内容放段码中;延时15ms
亮第一个数码管(这里当他为共阳极数码管):P2^0=1;P1=XXX;//自己写出L的字形码 delay_ms(1);//延迟1ms这个时间越小越好拉 P2^0=0;//关掉第1个数码管显示 P2^1=1;//开始第二个数码管显示 //然后就以此类推
case 3: D1 = 0; D2 = 0; D3 = 0; D4 = 1; break; // 显示个位 } P0 = digit[i]; // 设置数码管显示的数值 delay(1); // 延时1ms P0 = 0x00; // 关闭数码管 } } void main(){ uns
首先你的仔细看看电路图,看一下数码管是怎么接的,接的是哪一个管脚,从而确定出位选和段选。所谓段选指的是数码管显示的内容,位选指的是哪几个数码管显示。总之你一定要学会看懂电路图。下面我给你一个例子啊,是根
应怎样编写LED数码管显示程序?
共阴极数码管也就是说,当控制信号为1时该段LED点亮,8段数码管的数字0~9定义为:3FH,06H,5BH,4FH,66H ;01234 6DH,7DH,07H,7FH,6fh ;56789 以下为简易8路抢答器的例程:include
uchar table[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d};uchar table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//这样显示654321,顺序反一下为123456 void delay(uint z);void main(){ uchar i=0;whil
uchar number=0;void t0isr() interrupt 1 { TH0=0xf4;TL0=0x48;switch(number){ case 0:P2=0x01;P0=distab[1];break;case 1:P2=0x02;P0=distab[2];break;case 2:P2=0x04;P0=distab[3];break;case 3
要让51单片机共阴数码管显示数字,只需要将单片机的P2端口输出数字对应的段码即可。以显示数字“0”为例,c语言程序如下:include
we = 1;//位选开 data = 0x00;//送入位选数据 we = 0;//位选关 while(1){ for(i = 0;i < 16 ; i++){ du = 1; //段选开 data = leddata[i]; //送入段选数据 du = 0; //段选
51单片机共阴数码管利用静态显示,让六个数码管显示1~6,程序怎么写?
(1)这里存在一个问题,就是245的输出是一个5V,需要接限流电阻,不然的话会烧毁数码管。其作用是增强驱动能力(因为单片机的驱动能力是很强,必要时需要外接驱动芯片(一般是锁存器)),你要看你所用的数码管的总电流
假设P0 P2口接数码管 程序如下 include
付值给一个变量,从1到F显示后,再反过来不就行了吗?太简单了,自己都没仔细想 程序:…unsigned code tab[]={0到F的段码};void main(){ unsigned char i;打开位选;for(i=0,i++;i<16){ 段选=tab[i];
显示8,是因为你程序跑飞了,加上延时,自然是延时后跑飞,所以显示8。静态显示不需特殊的延时。想要一直显示就写个死循环就程序停住就可以了,RET是子程序调用的返回,你这里不用加。
单片机汇编程序:LED数码管静态显示问题
0111第4位数码管显示,wk = 0;关闭位选。5、while(1) //死循环效果{} 。6、dk = 1;//打开段选,P0 = leddata[i];,dk = 0;//关闭段选,delay(100);//延时效果。7、选择效果,限制i值的循环范围。
include
int key1,key,disbuf;// 此表为 LED 的字模 0 1 2 3 4 5 6 7 8 9 a b c d e f unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,
define uint unsigned int uchar num=0;//共阴数码管七段码 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};void Delay1ms(uint i) //1ms延时程序 { uint j;for(;i>0
51单片机led数码管显示0-99静态程序
4、共阴数码管,即阴极全部连接在一起,单片机接口给高电位即可点亮对应的段位。5、其中“开始”按键当开关由上向下拨时开始计时,此时若再拨“开始”按键则数码管暂停;“清零”按键当开关由上向下拨时数码管清零,此时若再
if(key==k1) { if(s<9) s++; esle s=0;}else if(key==k2) {if(s>0) s--; esle s=9;}主要程序应该就这是这样,key为键值,s为显示在数码管上的值
这些用定时器来完成,都很容易实现,再加上数码管显示程序,也还可以实现。但是最后要显示DIANK,不好办,可显示出d1An,就是字母K显示不出来。
//主程序--- main(){ while(1) //循环显示 { Out=tab[8]; //把数字8查表得到7段显示码数据送P1端口 ls1=0; //点亮千位 Delay(100); //显示一会 ls1=1; //关闭,显示下一位 Out=tab[7]
单个数码管0-f循环显示程序以及PROTUES的仿真电路图,希望对你有用 include
2.用显示函数代替延时函数。把你的程序中,凡是:delay(10);,都改成:display(shi,ge);。3.把几处等待按键释放,都加上显示函数。如:while(!key1);改为:while(!key1)display(shi,ge);试试看吧。
这份程序中,首先定义了静态数码管的码表,然后通过循环依次将每个数码管的码值赋值给P1口进行显示,同时控制最后一个数码管不同步显示,即循环显示四个数码管后关闭所有数码管的显示,再等待一段时间后才开始下一轮的显示。
、编写静态数码管显示的C51程序。功能要求:实验板上最后一个静态数码管循环?
兄弟,你刚学的吧,不知道你是大学生还是非大学生的,如果是大学生的话我觉得我不应该回答了,俺只是说方法,不会给什么程序的,当然并不是程序简单我就不写,不是这样的,而是你要弄清电路的工作原理,弄清程序和电路的关系,弄清的硬件,结合程序看就应该能弄清楚了。 数码的显示方式:静态和动态 静态简单,动态是用扫描技术,进行扫描的,就是显示的数据是一样的,不过利用的扫描后,就造成显示的数据不一样了,原因是显示的速度是非常快的,人的眼是分辨不出的。而你的电路采用的静态显示,那么就是数码的共极部分,当然proteus里的数码应该是共阴极的吧,而阳极是送显示的数据,这样显示的方式是静态显示 P0 P2是数码管送显示的数据,当然这两数码管一个显示个位,一个显示十位,那么你要对显示的数据进行处理一下,比如是要显示99: uint a,b; uint k=99; a=99/10;//这里只取十位而已,也就是9 b=99%10//这是求模,相当于数学里说的取余数 然后再将这a和b的数据指向一个数码管显示的代码数组[弄清数码管的显示就知道怎么写出显示代码了] 第一个是个位,先显示个位,数组的运用是利用下标控制的,我们用变量b控制下标。 第二个是十位,也是利用下标控制数组的。 当然这个变量k我们可以先不赋值,让它自增或自减从最大值一直减到最小,就是从99显示到0了, 当然你的电路有些浪费I/O口,两个数码管你把段全部连在一起不就行了,然后把共极各自连接I/O口,利用动态显示,你上图所示的,根本就是静态显示,浪费资源啊,当你在设计产品时是浪费I/O口的, 我认为应该是这样的,这样节省资源,控制也非常方便的,一点儿也不能,这个才是动态显示,利用动态扫描就搞定了,要不然会浪费资源的,俺的基础有限,再说也是自学的,也好久没弄51了,现在在做其经类型的MCU了,兄弟祝你学习有成。 注意要外接上拉电阻的,P0内部没带上拉电阻,要自己接上哦,俺没画上,你做实际产品时不要忘记了。那个lalala有什么用?看程序是在P0口接一个共阳数码管。那同样在P2口再接一个数码管。这样,P0口的数码管显示十位数,P2口的数码管显示个位数。或在P2,P3口各接一个数码管。见下图。 这种接法属于静态显示电路。这个学会后,再练习动态显示电路。
错误给你找到了,由于在查显示编码表时 要不断地使用累加器A, 累加器A不能用来保存要轮流要显示的数据,可以改用R4. ORG 0000H TT: MOV R4,#0 ;循环16次 KK: MOV A,R4 MOV DPTR,#TABLE ;存入表的起始地址 MOVC A,@A+DPTR ;按地址取代码并存入A MOV P0,A ;将代码送P0转变为数字显示 INC R4 LCALL DELAY CJNE R4,#16,KK AJMP TT TABLE: DB 0FCH,60H,0DAH,0F2H ;代码表 DB 66H,0B6H,0BEH,0E0H DB 0FEH,0F6H,0AAH,3EH DB 9CH,7AH,9EH,8EH DELAY: MOV R1,#25 ;延时 L1: MOV R2,#50 L2: MOV R3,#250 L3: DJNZ R3,L3 DJNZ R2,L2 DJNZ R1,L1 RET
#include #define uchar unsigned char #define uint unsigned int int counter=0; sbit w0=P2^7; sbit w1=P2^6; sbit w2=P2^5; sbit w3=P2^4; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 }; void delay_nms(uint z) //延时子 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void DisplayShumaguan(uchar* shuzi) { w0=1; w1=0; w2=0; w3=0; P0=table[*shuzi]; delay_nms(40); w0=0; w1=1; w2=0; w3=0; P0=table[*(shuzi+1)]; delay_nms(40); w0=0; w1=0; w2=1; w3=0; P0=table[*(shuzi+2)]; delay_nms(40); w0=0; w1=0; w2=0; w3=1; P0=table[*(shuzi+3)]; delay_nms(40); } void main() { uchar ii[4]={1,2,3,4}; while(1) { DisplayShumaguan(ii); } }
# include# define uint unsigned int# define uchar unsigned charcode uchar shu[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, /* 0 1 2 3 4 5 6 7 */ 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管段选 /* 8 9 a b c d e f */code uchar wen[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //数码管位选uchar huancun[] = {0x00,0x00,0x00,0x00,0x00,0x00}; //数码管段选缓存sbit duan = P2^6; //段选sbit wei = P2^7; //位选void delay(uchar x) //延时函数{ uchar i,j; for(i = 0; i9) //移到最后面 回到初始状态 { j = 0; } }}照着你给你电路图写的,有问题请追问
位选不是接在数码管得公共端吗,他是共阴极的,只有接低电平,这样阳极与公共端才能有压差 才能选中这个数码管,再把段选给高电平这样数码管不就亮了吗
#include"at89x51.h" #define uchar unsigned char #define uint unsigned int /************************* 全局变量定义部分 **************************/ //硬件设计接口不同,要修改下一行 uchar code acLEDCS[]={0x7f,0xbf,0xdf,0xed}; /* 位选地址码,“0”有效,位选接的是P2口高4位 */ uchar code acLedSegCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c};/* 段码 */ uchar acLED[4]; /* 显示缓冲区 */ char cScanIndex; /* 位选指针0~3 */ uint t=0; /************************* 数码管显示函数 ***************************/ void Display(void) { // 添加要显示的数据(变量) acLED[3]=acLedSegCode[t/1000]; /* LED显示第1位 */ acLED[2]=acLedSegCode[t%1000/100]; /* LED显示第2位 */ acLED[1]=acLedSegCode[t%100/10]; /* LED显示第3位 */ acLED[0]=acLedSegCode[t%10]; /* LED显示第4位 */ } /************************** 主函数 *****************************/ void main(void) { /**************** 定时器初始化 *******************/ TMOD= 0x02; /* 定义定时器0工作于方式2(8位自动重装) */ TH0 = -200; /* 8位自动重装定时器约每100uS中断1次,9216次为1秒 */ TL0 = -200; TR0 = 1; ET0 = 1; EA = 1; /* 开总中断 */ while(1) { Display(); } } void IntT0(void) interrupt 1 /* 定时器0中断,完成1秒定时和LED延时 */ { t++; if(t==10000) t=0; P0 = 0; /* 先清显示再换位选 */ P2 = acLEDCS[cScanIndex]; /* 送位选数据 */ P0 = acLED[cScanIndex++]; /* 送显示数据,位选指针移位 */ cScanIndex &= 3; /* 位选指针回位 */ }
C语言写LED数码管显示程序与汇编是一致的,将显示的基本内容定义在一个数组中就可以了,比如: #include #define uchar unsigned char uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; sbit rstkey=P2^2; sbit speaker=P2^0; void delay()//延时约400毫秒 { uchar i,j; for(i=0;i<200;i++) for(j=0;j<250;j++); } main() { uchar i,key; P2=0xff; while(1) { i=0; P1=table[i]; while(1) { key=P3; if(key!=0)break; } switch(key) { case 0x01:i=1;break; case 0x02:i=2;break; case 0x04:i=3;break; case 0x08:i=4;break; case 0x10:i=5;break; case 0x20:i=6;break; case 0x40:i=7;break; case 0x80:i=8;break; default:break; } P1=table[i];//显示按下抢答器的号 P0=key;//显示按下键号的LED while(1) { if(rstkey==0)break;//主持人按下复位键则重新开始 speaker=~speaker;//否则蜂鸣器报警 delay(); } } }