想利用八段数码管做一个电子表。
数码管一个有四片。
最后一片显示秒数。利用延时函数成功实现了,到9的时候,需要进位,想让倒数第二片数码管显示进位的数,但是
问题出现了,按理第四片到9,第三片就应该变成1,然后第四片循环,直到下一次到9,第三片才变成2,以此类推。为什么我没有办法让第三片数码管停止在一个数不动,就是等到需要进位的时候第三片的状态完全跟第四片一样了!
[mw_shl_code=c,true]
u8 const CharCode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳段码表
//数码管显示
int main(void)
{
// u8 i;
// u8 t;
u8 a; //秒个位(第四片)
u8 b; //秒十位(第三片)
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
SEG_Init(); //数码管初始化
SEG_DATAOUT(0); //取段码数据
KEY_Init();
/*
数码管第四片显示秒的个位数
*/
b=0;
for(a=1;;a++)
{
if(a==10)
{
delay_ms(1000);
a=0;
b=b+1;
{
SEG_DATAOUT(CharCode<<8);
PC8=0;
}
{
SEG_DATAOUT(CharCode[0]<<8);
PC9=0;
}
}
else if(a<=9)
{
delay_ms(1000);
SEG_DATAOUT(CharCode[a]<<8);
PC9=0;
}
}[/mw_shl_code]
---------------------------------
同意原子哥答案,数码管就是扫描的,不扫描不行,好好想想肿么扫描吧,生么共阳、共阴的,让它显示数字再说
---------------------------------
你这用中断好吗,就用延时 主函数啥都不用干了
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit 10=P1^0;
sbit 11=P1^1;
sbit 12=P1^2;
sbit beep=P3^4;
sbit ir=P3^3;
sbit relay=P3^5;
uchar code tabledu[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
display(uint ,uint ,uint ,uint );
delay(uint);
uchar flag;
uint a;
uint b;
uchar c=50;
void main()
{ TMOD=0X20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
while(1)
{display(a/1000,a%1000/100,a%100/10,a%10);
b++;
if(flag==1)
{
ES=0;
flag=0;
SBUF=a+1;
while(!TI);
TI=0;
ES=1;}
if(ir==0)
c=50;
if(ir==1)
c=30;
if(b==c)
{
beep=!beep;
b=0;
a=a+1;
if(a%10==0)
relay=!relay;
}
}
}
void serail() interrupt 4
{a=SBUF-48;
flag=1;
RI=0;
}
display(uint b,uint c,uint d,uint e)
{
P2=tabledu;
 10=0;
 11=0;
 12=1;
delay(10);
P2=tabledu[c];
P10=1;
 11=0;
 12=1;
delay(10);
P2=tabledu[d];
P10=0;
 11=1;
 12=1;
delay(10);
P2=tabledu[e];
P10=1;
P11=1;
P12=1;
delay(10);
}
delay(uint x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=255;b>0;b--);
}
一般可以开1个1毫秒的定时器,这1毫秒显示第一片内容, 下一毫秒显示第二片内容,.......
或者用个for循环扫描
一周热门 更多>