1. 單片機數碼管靜態顯示學號1830508,用keil 最好有過程,在圖上的過程上修改
// 單片機數碼管動態顯示學號1830508(注多位數碼管用靜態顯示電路會很復雜,所以一般多用動態顯示),方法有多種,下面是一個模擬常式可以參考。
#include<reg51.h>
#define uchar unsigned char
// 此表為 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,0x5E,0x79,0x71};
void delay(uchar z)
{
uchar i,j;
for(i=0;i<120;i++)
for(j=0;j<z;j++);
}
void main()
{
while(1)
{
P0=0xff;
P2=LED7Code[0];
P0=0xfe;
delay(5);
P0=0xff;
P2=LED7Code[1];
P0=0xfd;
delay(5);
P0=0xff;
P2=LED7Code[8];
P0=0xfb;
delay(5);
P0=0xff;
P2=LED7Code[3];
P0=0xf7;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xef;
delay(5);
P0=0xff;
P2=LED7Code[5];
P0=0xdf;
delay(5);
P0=0xff;
P2=LED7Code[0];
P0=0xbf;
delay(5);
P0=0xff;
P2=LED7Code[8];
P0=0x7f;
delay(5);
}
}
2. 單片機匯編語言數碼管顯示數字。。。。
MAIN:
;------------------
LOOP:
ACALLSHOW1
ACALLDELAY
ACALLSHOW6
ACALLDELAY
SJMPLOOP
;------------------
SHOW1:
MOVP0,#06H
SETBP2.6
CLRP2.6
MOVP0,#0FEH
SETBP2.7
CLRP2.7
RET
;------------------
SHOW6:
MOVP0,#7DH
SETBP2.6
CLRP2.6
MOVP0,#0FDH
SETBP2.7
CLRP2.7
RET
;------------------
DELAY:
DEL1:
NOP
NOP
DJNZR7,DEL1
RET
;------------------
END
3. 單片機控制一個4位的共陰數碼管通電的狀態下顯示時間的程序
#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;i<8;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(miao<0)
{
miao=59;
}
}
}
if(ji==2)
{
if(PRESS2==0)
{
delay(1);
while(!PRESS2);
fen++;
if(fen>=60)
{
fen=0;
shi++;
}
}
if(PRESS3==0)
{
delay(1);
while(!PRESS3);
fen--;
if(fen<0)
{
fen=59;
}
}
}
if(ji==3)
{
if(PRESS2==0)
{
delay(1);
while(!PRESS2);
shi++;
if(shi>=24)
{
shi=0;
}
}
if(PRESS3==0)
{
delay(1);
while(!PRESS3);
shi--;
if(shi<0)
{
shi=23;
}
}
}
if(ji==0)
EA=1;
else
EA=0;
}
void main()
{
init();
while(1)
{
xian();
jiance();
}
}
void an() interrupt 1 //計時中斷0工作方式1函數。
{
TH0=0x3c;
TL0=0xb0;
jishu++;
if(jishu==20)
{
jishu=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
}
4. C51編程:如何讓一位數碼管循環顯示數字0~9,時間間隔為1秒
非精確的,用定時器就足夠了,
有模擬圖,
P0加上拉電阻,
74HC373做驅動,不過沒加保護電阻,
模擬通過:
這是源碼:
#include<reg52.h>
unsignedcharcode1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsignedinta;
voiddelay()
{
unsignedinti,j;
for(i=100;i>1;i--)
for(j=0;j<100;j++);
}
main()
{
while(1)
{
for(a=0;a<=9;a++)
{
P0=code1[a];
delay();
}
}
}