㈠ 51单片机的共阴数码管怎么显示数字(c语言)
要让51单片机共阴数码管显示数字,只需要将单片机的P2端口输出数字对应的段码即可。
以显示数字“0”为例,c语言程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//数码管的段码编码
Uchar table[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main(){//主函数
P0 = table[0];//显示0,大家可以修改里面的数据。
while(1);//程序不再执行其他步骤;
}
(1)c51单片机显示数字25扩展阅读:
数字0-9的对应段码:
数字0 0x3f
数字1 0x06
数字2 0x5b
数字3 0x4f
数字4 0x66
数字5 0x6d
数字6 0x7d
数字7 0x07
数字8 0x7f
数字9 0x6f
㈡ 在c51单片机的显示管上显示四个数字的c语言程序怎么写
sbit la=P2^6;//段锁存器锁存湍
sbit wela=P2^7;;//位锁存器锁存湍
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void display(shiwan_c,wan_c,qian_c,_c,shi_c,ge_c)//6位显示子程序
{
P0=table[shiwan_c]; //显示十万位
la=1;
la=0;
P0=0xfe;
wela=1;
wela=0;
delay(2);
P0=table[wan_c]; //显示万位
la=1;
la=0;
P0=0xfd;
wela=1;
wela=0;
delay(2);
P0=table[qian_c]; //显示千位
la=1;
la=0;
P0=0xfb;
wela=1;
wela=0;
delay(2);
P0=table[_c]; //显示百位
la=1;
la=0;
P0=0xf7;
wela=1;
wela=0;
delay(2);
P0=table[shi_c]; //显示十位
la=1;
la=0;
P0=0xef;
wela=1;
wela=0;
delay(2);
P0=table[ge_c]; //显示个位
la=1;
la=0;
P0=0xdf;
wela=1;
wela=0;
delay(2);
P0=0xff; //显示完毕后关闭最后一位显示
wela=1;
wela=0;
}
以上程序需放在循环程序中,数码管需反复显示
如果其中两位不需显示,可赋值为16
㈢ 51单片机的共阴数码管怎么显示数字(c语言)知道
共阴极数码管也就是说,当控制信号为1时该段LED点亮,8段数码管的数字0~9定义为:
3FH,06H,5BH,4FH,66H
;01234
6DH,7DH,07H,7FH,6fh
;56789
以下为简易8路抢答器的例程:
#include<reg51.h>
#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();
}
}
}
㈣ C51单片机12864怎样按顺序显示数字
#include<reg52.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitCS=P2^5;//片选信号
sbitSID=P2^6;//数据信号
sbitSCLK=P2^7;//时钟信号
sbitRST=P2^2;//复位信号
sbitCH=P2^4;//并行、串行选择信号
/********************************************************************
*名称:delay()
*功能:延时,延时时间为100us*t。这是通过软件延时,有一定误差。
*输入:t
*输出:无
***********************************************************************/
voiddelay(unsignedintt)
{
unsignedinti,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
/********************************************************************
*名称:sendbyte()
*功能:按照液晶的串口通信协议,发送数据
*输入:zdata
*输出:无
***********************************************************************/
voidsendbyte(unsignedcharzdata)
{
unsignedinti;
for(i=0;i<8;i++)
{
if((zdata<<i)&0x80)
{
SID=1;
}
else
{
SID=0;
}
SCLK=0;
SCLK=1;
}
}
/********************************************************************
*名称:write_com()
*功能:写串口指令
*输入:cmdcode
*输出:无
***********************************************************************/
voidwrite_com(unsignedcharcmdcode)
{
CS=1;
sendbyte(0xf8);
sendbyte(cmdcode&0xf0);
sendbyte((cmdcode<<4)&0xf0);
delay(2);
}
/********************************************************************
*名称:write_data()
*功能:写串口指令
*输入:cmdcode
*输出:无
***********************************************************************/
voidwrite_data(unsignedcharDispdata)
{
CS=1;
sendbyte(0xfa);
sendbyte(Dispdata&0xf0);
sendbyte((Dispdata<<4)&0xf0);
delay(2);
}
/********************************************************************
*名称:lcdinit()
*功能:初始化函数
*输入:cmdcode
*输出:无
***********************************************************************/
voidlcdinit()
{
RST=0;
delay(100);
RST=1;
delay(20000);
write_com(0x30);
delay(50);
write_com(0x0c);
delay(50);
}
/********************************************************************
*名称:hzkdis()
*功能:显示字符串
*输入:*s
*输出:无
***********************************************************************/
voidhzkdis(unsignedcharcode*s)
{
while(*s>0)
{
write_data(*s);
s++;
delay(50);
}
}
/********************************************************************
*名称:Test()
*功能:显示子函数
*输入:无
*输出:无
***********************************************************************/
voidTest()
{
write_com(0x03);
delay(50);
write_com(0x81);
hzkdis("HOT-51");
write_com(0x91);
hzkdis("单片机开发板");
write_com(0x89);
hzkdis("");
write_com(0x98);
hzkdis("东流电子");
}
/********************************************************************
*名称:Main()
*功能:主函数
*输入:无
*输出:无
***********************************************************************/
voidMain()
{
CH=0;
delay(1);
lcdinit();
delay(10);
while(1)
{
Test();
delay(5000);
}
}
㈤ 51单片机显示数字问题
这个问题我在初学单片机的时候也碰到过,因为数码管是一个一个扫描的,在你这个程序中只要把延时加长就可以了
for(i=0;i<15;i++)
{
P0=tablewei[i]; P1=0x7f;
delay(500);
}
把delay延时加长,直到人的肉眼可以分辨出来
㈥ 在51单片机中用数码管可不可以单独显示超过255的三位数字
当然可以了,你把temp定义成unsigned int
unsigned int temp=999;
=temp/100;
temp=temp%100;
shi=temp10;
ge=temp%10;
㈦ 用51单片机编写程序实现数码管的时钟数字显示
KEYVAL EQU30H
KEYTM EQU31H
KEYSCAN EQU32H
DAT EQU33H
SCANLED EQU39H
CLK EQU77H
SEC EQU78H
MIN EQU79H
HOUR EQU7AH
PAUSE BIT00H
DOT BIT01H
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0ISR ;50ms定时
ORG001BH
LJMPT1ISR ;扫描显示
ORG0030H
MAIN:
MOVSP,#5FH
MOVTMOD,#11H
MOVTH0,#03CH
MOVTL0,#0B0H
MOVTH1,#0ECH
MOVTL1,#078H
MOVKEYVAL,#0
MOVSCANLED,#0
MOV33H,#10H
MOV34H,#10H
MOV35H,#10H
MOV36H,#10H
MOV37H,#10H
MOV38H,#10H
MOVSEC,#0
MOVMIN,#0
MOVHOUR,#0
MOVCLK,#0
CLRPAUSE
SETBEA
SETBET1
SETBTR1
LOOP:
LCALLKEYSEL
MOVA,KEYVAL
CJNEA,#0FFH,LOOP1
SJMPLOOP
LOOP1:
CJNEA,#10,LOOP2 ;“ON”启动
SETBTR0
SETBET0
SETBPAUSE
SJMPLOOP
LOOP2:
CJNEA,#11,LOOP3 ;“=”清零
MOVSEC,#0
MOVMIN,#0
MOVHOUR,#0
LCALLDISCHG
SJMPLOOP
LOOP3:
CJNEA,#15,LOOP4 ;“+”暂停
CLRTR0
CLRET0
CLRPAUSE
SJMPLOOP
LOOP4:
CJNEA,#14,LOOP5 ;“-”清显示暂停
MOV33H,#10H
MOV34H,#10H
MOV35H,#10H
MOV36H,#10H
MOV37H,#10H
MOV38H,#10H
CLRTR0
CLRET0
CLRPAUSE
SJMPLOOP
LOOP5:
CJNEA,#10,LOOP6 ;数字键
LOOP6:
JCLOOP7
LJMPLOOP
LOOP7:
JNBPAUSE,LOOP8 ;暂停状态可以输入数字键
LJMPLOOP
LOOP8:
MOV33H,34H
MOV34H,35H
MOV35H,36H
MOV36H,37H
MOV37H,38H
MOV38H,KEYVAL
MOVA,33H
SWAPA
ORLA,34H
LCALLBCDH
MOVHOUR,A
MOVA,35H
SWAPA
ORLA,36H
LCALLBCDH
MOVMIN,A
MOVA,37H
SWAPA
ORLA,38H
LCALLBCDH
MOVSEC,A
LJMPLOOP
;------------------
;BCD转换为十六进制
BCDH:
MOVB,#10H
DIVAB
MOVR7,B
MOVB,#10
MULAB
ADDA,R7
RET
;------------------
;十六进制转换为BCD
HBCD:
MOVB,#10
DIVAB
SWAPA
ORLA,B
RET
;------------------
KEYSEL:
MOV KEYVAL,#0
MOV KEYSCAN,#0EFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS1
MOV KEYVAL,A
SJMP KEYRTN
KEYS1:
MOV KEYSCAN,#0DFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS2
CLR C
ADD A,#4
MOV KEYVAL,A
SJMP KEYRTN
KEYS2:
MOV KEYSCAN,#0BFH
LCALL GETKEY
MOV A,KEYTM
JZ KEYS3
CLR C
ADD A,#8
MOV KEYVAL,A
SJMP KEYRTN
KEYS3:
MOV KEYSCAN,#7FH
LCALL GETKEY
MOV A,KEYTM
JZ KEYRTN
CLR C
ADD A,#12
MOV KEYVAL,A
KEYRTN:
LCALLCHGKEY
RET
;--------------------
GETKEY:
MOVKEYTM,#0
MOV A,KEYSCAN
MOV P3,A
NOP
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY
MOVR2,#10
LCALLDELAY
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY
MOV A,P3
ANL A,#0FH
MOV R7,A
SF:
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ SF
MOV A,R7
CJNE A,#0EH,NK1
MOV KEYTM,#1
SJMP NOKEY
NK1:
CJNE A,#0DH,NK2
MOV KEYTM,#2
SJMP NOKEY
NK2:
CJNE A,#0BH,NK3
MOV KEYTM,#3
SJMP NOKEY
NK3:
CJNE A,#07H,NOKEY
MOV KEYTM,#4
NOKEY: RET
;--------------------
DELAY:
MOVR3,#50
DELAY1:
MOVR4,#100
DJNZR4,$
DJNZR3,DELAY1
DJNZR2,DELAY
RET
;--------------------
T0ISR:
PUSHACC
CLRTR0
MOVTH0,#3CH
MOVTL0,#0B0H
SETBTR0
INCCLK
MOVA,CLK
CJNEA,#20,T0ISRE
MOVCLK,#0
INCSEC
MOVA,SEC
CJNEA,#60,T0ISRE
MOVSEC,#0
INCMIN
MOVA,MIN
CJNEA,#60,T0ISRE
MOVMIN,#0
INCHOUR
MOVA,HOUR
CJNEA,#24,T0ISRE
MOVSEC,#0
MOVMIN,#0
MOVHOUR,#0
T0ISRE:
LCALLDISCHG
POPACC
RETI
;--------------------
DISCHG:
MOVA,HOUR
LCALLHBCD
PUSHACC
ANLA,#0FH
MOV34H,A
POPACC
ANLA,#0F0H
SWAPA
MOV33H,A
MOVA,MIN
LCALLHBCD
PUSHACC
ANLA,#0FH
MOV36H,A
POPACC
ANLA,#0F0H
SWAPA
MOV35H,A
MOVA,SEC
LCALLHBCD
PUSHACC
ANLA,#0FH
MOV38H,A
POPACC
ANLA,#0F0H
SWAPA
MOV37H,A
RET
;--------------------
T1ISR:
PUSHACC
CLRTR1
MOVTH1,#0ECH
MOVTL1,#78H
SETBTR1
MOVDPTR,#LEDTAB
T100:
MOVR0,#DAT
MOVA,SCANLED
ADDA,R0
MOVR0,A
MOVA,SCANLED
JNZT101
MOVP2,#01H
CLRDOT
SJMPT1DIS
T101:
DECA
JNZT102
MOVP2,#02H
SETBDOT
SJMPT1DIS
T102:
DECA
JNZT103
MOVP2,#04H
CLRDOT
SJMPT1DIS
T103:
DECA
JNZT104
MOVP2,#08H
SETBDOT
SJMPT1DIS
T104:
DECA
JNZT105
MOVP2,#10H
CLRDOT
SJMPT1DIS
T105:
MOVP2,#20H
CLRDOT
T1DIS:
MOVA,@R0
MOVCA,@A+DPTR
JNBDOT,T1DIS1
ORLA,#01H
T1DIS1:
CPLA
MOVP0,A
INCSCANLED
MOVA,SCANLED
CJNEA,#6,T1END
MOVSCANLED,#0
T1END:
POPACC
RETI
;--------------------
CHGKEY:
MOVA,KEYVAL
JZKV16
DECA
JNZKV01
MOVKEYVAL,#7
RET
KV01:
DECA
JNZKV02
MOVKEYVAL,#4
RET
KV02:
DECA
JNZKV03
MOVKEYVAL,#1
RET
KV03:
DECA
JNZKV04
MOVKEYVAL,#10
RET
KV04:
DECA
JNZKV05
MOVKEYVAL,#8
RET
KV05:
DECA
JNZKV06
MOVKEYVAL,#5
RET
KV06:
DECA
JNZKV07
MOVKEYVAL,#2
RET
KV07:
DECA
JNZKV08
MOVKEYVAL,#0
RET
KV08:
DECA
JNZKV09
MOVKEYVAL,#9
RET
KV09:
DECA
JNZKV10
MOVKEYVAL,#6
RET
KV10:
DECA
JNZKV11
MOVKEYVAL,#3
RET
KV11:
DECA
JNZKV12
MOVKEYVAL,#11
RET
KV12:
DECA
JNZKV13
MOVKEYVAL,#12
RET
KV13:
DECA
JNZKV14
MOVKEYVAL,#13
RET
KV14:
DECA
JNZKV15
MOVKEYVAL,#14
RET
KV15:
DECA
JNZKV16
MOVKEYVAL,#15
RET
KV16:
MOVKEYVAL,#0FFH
RET
;--------------------
LEDTAB: DB0FCH ;"0" 00H
DB60H ;"1" 01H
DB0DAH ;"2" 02H
DB0F2H ;"3" 03H
DB66H ;"4" 04H
DB0B6H ;"5" 05H
DB0BEH ;"6" 06H
DB0E0H ;"7" 07H
DB0FEH ;"8" 08H
DB0F6H ;"9" 09H
DB0EEH ;"A" 0AH
DB3EH ;"B" 0BH
DB9CH ;"C" 0CH
DB7AH ;"D" 0DH
DB9EH ;"E" 0EH
DB8EH ;"F" 0FH
DB00H ;"" 10H
;--------------------
END
㈧ C51单片机的数码管显示问题
#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,t,num,xms;
sbit wela=P2^7;
sbit la=P2^6;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uchar xms)//这里最好把uchar改为uint,当然不改应该也没问题,你下面的i跟xms类型不一样,在这里应该是没问题,最好还是统一一下
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar shi,uchar ge)
{
shi=num/10;
ge=num%10;
la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
wela=1;
P0=0xfd;
wela=0;
//delay(5);
la=1;
P0=table[ge];
la=0;
delay(5);
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(key1==0)
{
delay(10);//这里消抖也是,也就是说,用按键的话,数码管就是会闪
因为时间有点长对吧,数码管来不及立刻显示,此时用肉眼就能看到闪,所以应该避免不了吧,除非你消抖时间也改短一点,你试试看。看看效果
if(key1==0)
num++;
if(num==60)
num=0;
while(!key1);
delay(10); //按一下十位闪一下就是这里延时太长了,可以不用延时,
数码管动态显示要求扫描很快,你上面就是延时了5ms,如果时间再长一点,那你就能看到数码管不停的闪。所以这里10ms太长了,可以不用。
但为什么个位没闪,应该是在display时,先是现实十位,然后把十位灭掉,再显示个位,一直等到在显示十位时,个位才灭,就是说在这支前,个位是亮的,由于你这延时了10ms,导致此时十位没有很快的显示出来,所以等过了10ms之后,十位才由暗变亮,你就可以看到十位闪了一下。
当你按住key1时,key1一直是0,那么!key1=1;所以程序一直执行while(!key1);这句语句,那么结合上面所说十位就亮不了了,只有个位亮。
你可以试着改改delay函数中的值大小,自己观察一下,display中的delay值可以更小的,3ms,2ms,自己试试吧
}
if(key2==0)
{
delay(10);
if(key2==0)
num--;
if(num==-1)
num=59;
while(!key2);
delay(10);
}
if(key3==0)
{
delay(10);
if(key3==0)
num=0;
while(!key1);
delay(10);
}
if(key4==0)
{
if(key4==0)
{
TR0=~TR0;
}
while(!key4);
}
display(shi,ge);
}
}
void time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
{
t=0;
num++;
if(num==60)
num=0;}}
㈨ 如何用51单片机用一位数码管显示对应数字
首先你要把0到9的数字对应的七段码放在一个数组中,然后用一个变量计按键的次数或序号,把该序号的七段码输出到对应的端口即可。