標(biāo)題:
單片機(jī)C語(yǔ)言怎么讓數(shù)碼管移位顯示?
[打印本頁(yè)]
作者:
萌新小白一個(gè)
時(shí)間:
2021-4-15 20:02
標(biāo)題:
單片機(jī)C語(yǔ)言怎么讓數(shù)碼管移位顯示?
現(xiàn)在數(shù)碼管最初狀態(tài)全為0,我想一開始不顯示,按下矩陣按鈕顯示對(duì)應(yīng)的數(shù),然后再按下矩陣按鍵前一個(gè)數(shù)左移后面顯示新的數(shù)字,需要如何改進(jìn)。
單片機(jī)C語(yǔ)言源程序如下:
#include"reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
#define GPIO_KEY P1
#define GPIO_DIG P0
u16 a,b,c;
u16 KeyValue;
u16 keyflag,i;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
u8 dat[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
u16 wei[8]={0};
void delay(u16 i)
{
while(i--);
}
void display()
{
LSA=0; LSB=0; LSC=0; GPIO_DIG=smgduan[wei[0]];delay(50); GPIO_DIG=0x00;
LSA=1; LSB=0; LSC=0; GPIO_DIG=smgduan[wei[1]];delay(50); GPIO_DIG=0x00;
LSA=0; LSB=1; LSC=0; GPIO_DIG=smgduan[wei[2]];delay(50); GPIO_DIG=0x00;
LSA=1; LSB=1; LSC=0; GPIO_DIG=smgduan[wei[3]];delay(50); GPIO_DIG=0x00;
LSA=0; LSB=0; LSC=1; GPIO_DIG=smgduan[wei[4]];delay(50); GPIO_DIG=0x00;
LSA=1; LSB=0; LSC=1; GPIO_DIG=smgduan[wei[5]];delay(50); GPIO_DIG=0x00;
LSA=0; LSB=1; LSC=1; GPIO_DIG=smgduan[wei[6]];delay(50); GPIO_DIG=0x00;
LSA=1; LSB=1; LSC=1; GPIO_DIG=smgduan[wei[7]];delay(50); GPIO_DIG=0x00;
}
void KeyDown(void)
{
u16 a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)
{
delay(1000);
if(GPIO_KEY!=0x0f)
{
GPIO_KEY=0x0f;
switch(GPIO_KEY)
{
case(0X07): KeyValue=9;break;
case(0X0b): KeyValue=8;break;
case(0X0d): KeyValue=7;break;
case(0X0e): KeyValue=20;break;
}
GPIO_KEY=0xf0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue-3;break;
case(0Xd0): KeyValue=KeyValue-6;break;
case(0Xe0): KeyValue=KeyValue-9;break;
}
if(KeyValue==0 || KeyValue==1 || KeyValue==2 || KeyValue==3 || KeyValue==4 || KeyValue==5 || KeyValue==6 || KeyValue==7 || KeyValue==8 || KeyValue==9)
{
keyflag=1;
}
while((a<50)&&(GPIO_KEY!=0xf0))
{
delay(1000);
a++;
}
}
}
}
void main()
{
u16 a=0,b=0,c=0;
while(1)
{
display();
KeyDown();
if(keyflag==1)
{
for(i=7;i>0;i--)
{
wei[i]=wei[i-1];
}
wei[0]=KeyValue;
keyflag=0;
}
else if(KeyValue==-1)
{
for(i=0;i<8;i++)
wei[i]=0;
display();
}
else if(KeyValue==20)
{
a=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
for(i=0;i<8;i++)
wei[i]=0;
while(1)
{
display();
KeyDown();
if(KeyValue==-2) break;
if(keyflag==1)
{
for(i=7;i>0;i--)
{wei[i]=wei[i-1];}
wei[0]=KeyValue;
keyflag=0;
}
}
b=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
c=a+b;
wei[0]=c%10;
wei[1]=c/10%10;
wei[2]=c/100%10;
wei[3]=c/1000%10;
wei[4]=c/10000%10;
wei[5]=c/100000%10;
wei[6]=c/1000000%10;
wei[7]=c/10000000%10;
display();
}
else if(KeyValue==17)
{
a=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
for(i=0;i<8;i++)
wei[i]=0;
while(1)
{
display();
KeyDown();
if(KeyValue==-2) break;
if(keyflag==1)
{
for(i=7;i>0;i--)
{wei[i]=wei[i-1];}
wei[0]=KeyValue;
keyflag=0;
}
}
b=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
if(a>=b)
{
c=a-b;
wei[0]=c%10;
wei[1]=c/10%10;
wei[2]=c/100%10;
wei[3]=c/1000%10;
wei[4]=c/10000%10;
wei[5]=c/100000%10;
wei[6]=c/1000000%10;
wei[7]=c/10000000%10;
}
if(a<b)
{
u16 e=0;
c=b-a;
wei[0]=c%10;
wei[1]=c/10%10;
if(wei[1]==0)
{
wei[1]=16;
e=1;
}
wei[2]=c/100%10;
if(wei[2]==0 && e==0)
{
wei[2]=16;
e=1;
}
wei[3]=c/1000%10;
if(wei[3]==0 && e==0)
{
wei[3]=16;
e=1;
}
wei[4]=c/10000%10;
if(wei[4]==0 && e==0)
{
wei[4]=16;
e=1;
}
wei[5]=c/100000%10;
if(wei[5]==0 && e==0)
{
wei[5]=16;
e=1;
}
wei[6]=c/1000000%10;
if(wei[6]==0 && e==0)
{
wei[6]=16;
e=1;
}
wei[7]=c/10000000%10;
if(wei[7]==0 && e==0)
{
wei[7]=16;
e=1;
}
}
display();
}
else if(KeyValue==14)
{
a=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
for(i=0;i<8;i++)
wei[i]=0;
while(1)
{
display();
KeyDown();
if(KeyValue==-2) break;
if(keyflag==1)
{
for(i=7;i>0;i--)
{wei[i]=wei[i-1];}
wei[0]=KeyValue;
keyflag=0;
}
}
b=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
c=a*b;
wei[0]=c%10;
wei[1]=c/10%10;
wei[2]=c/100%10;
wei[3]=c/1000%10;
wei[4]=c/10000%10;
wei[5]=c/100000%10;
wei[6]=c/1000000%10;
wei[7]=c/10000000%10;
display();
}
else if(KeyValue==11)
{
a=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
for(i=0;i<8;i++)
wei[i]=0;
while(1)
{
display();
KeyDown();
if(KeyValue==-2) break;
if(keyflag==1)
{
for(i=7;i>0;i--)
{wei[i]=wei[i-1];}
wei[0]=KeyValue;
keyflag=0;
}
}
b=wei[0]+wei[1]*10+wei[2]*100+wei[3]*1000+wei[4]*10000+wei[5]*100000+wei[6]*1000000+wei[7]*10000000;
c=a/b;
wei[0]=c%10;
wei[1]=c/10%10;
wei[2]=c/100%10;
wei[3]=c/1000%10;
wei[4]=c/10000%10;
wei[5]=c/100000%10;
wei[6]=c/1000000%10;
wei[7]=c/10000000%10;
display();
}
}
}
復(fù)制代碼
作者:
MOVEORDIE
時(shí)間:
2021-4-15 22:49
建議看一下有關(guān)數(shù)碼管顯示方面的內(nèi)容,掌握方法了,想怎么顯示、怎么移動(dòng)都可以
作者:
yhang18
時(shí)間:
2021-4-15 23:59
建一個(gè)數(shù)組用于數(shù)碼管顯示,比如4位數(shù)碼管就【4】{;;;} i++
作者:
wulin
時(shí)間:
2021-4-16 06:33
不用寫這么復(fù)雜,改這樣就能達(dá)目的。
#include"reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
//sbit LSA=P2^2;
//sbit LSB=P2^3;
//sbit LSC=P2^4;
//#define GPIO_KEY P1
//#define GPIO_DIG P0
//u16 a,b,c;
u8 KeyValue;
//u16 keyflag,i;
u8 code smgduan[]={//共陰數(shù)碼管段碼"0~f-."
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40,0x80};
u8 dat[9];
//u16 wei[8]={0};
void delay(u16 i)
{
while(i--);
}
void KeyDown(void)
{
static bit sign=0;
static u8 count=0;
u8 i;
P1=0xf0;
if(P1!=0xf0)
{
if(++count>=10 && sign==0)
{
sign=1;
switch(P1)
{
case(0Xe0):KeyValue = 0;break;
case(0Xd0):KeyValue = 1;break;
case(0Xb0):KeyValue = 2;break;
case(0X70):KeyValue = 3;break;
}
P1=0x0f;
switch(P1)
{
case(0X0e):KeyValue+= 0;break;
case(0X0d):KeyValue+= 4;break;
case(0X0b):KeyValue+= 8;break;
case(0X07):KeyValue+=12;break;
}
dat[8]=smgduan[KeyValue];
for(i=0;i<8;i++)
dat[i]=dat[i+1];
}
}
else
{
sign=0;
count=0;
}
}
void display()
{
static u8 i=0;
P0=0x00;
P2&=0xe3;
P2|=(i*4);
P0=dat[i];
i=++i%8;
}
void main()
{
while(1)
{
KeyDown();
display();
delay(100);
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1