
本人菜鸟,做课程设计,要求89C51单片机实现4位7段数码管动态和静态显示,希望大神能给写个程序,谢谢了
/********************/
/*
按键静态显示不同数字,即按1键显示1
动态显示:数字移动显示
*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit Dp=P0^6;
sbit d1=P2^4;
sbit d2=P2^5;
sbit d3=P2^6;
sbit d4=P2^7;
uchar code table[]=
{0x28,0xeb,0x32,0xa2,
0xe1,0xa4,0x24,0xea,
0x20,0xa0,0xf7};
uchar code table1[]= {0xfe,0xfd,0xfb};
uint num1=0,temp,num,flag=0;
char Char[50]="===",*p;
uchar dp=0,wei;
float A=0;
void delay(uint z)
{ uint x;
uint y;
for(x=z;x>0;x--)
for(y=110;y>0;y--) ; }
void jian() //键盘扫描
{
if(num1==3)num1=0;
P2=table1[num1];
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{delay(5);
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{temp=P2;flag=1;
switch(temp>>4)
{case 0x0e:num=0+4*num1;
break;
case 0x0d:num=1+4*num1;
break;
case 0x0b:num=2+4*num1;
break;
case 0x07:num=3+4*num1;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
delay(5);
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
num1++; P2=0xff;
}
//数码管显示
void display(char z[],uchar z1) //“:“表示“-” /***无
{ if(z[0]-'0'<13) //不能为小于等于0
{
d1=0;P0=table[z[0]-'0'];if(z1==1)Dp=0;
delay(1);d1=1;P0=0xff;
}
if(z[1]-'0'<13){d2=0;P0=table[z[1]-'0'];if(z1==2)Dp=0;delay(1);d2=1;P0=0xff; }
if(z[2]-'0'<13){d3=0;P0=table[z[2]-'0'];if(z1==3)Dp=0;delay(1);d3=1;P0=0xff;}
if(z[3]-'0'<13){d4=0;P0=table[z[3]-'0'];if(z1==4)Dp=0;delay(1);d4=1;P0=0xff; } }
void main()
{
while(1)
{
jian();
if(flag==1){flag=0;
Char[wei+3]='0'+num; wei++;
p=Char+wei-1;
}
if(wei>0)display(p,dp);
}
}
硬件电路图
/**************************************************
*
* 4位数码管动态显示
*
*
*
*
*
***************************************************/
#include "REG52.H"
sbit SHUG_01 = P2^0; //数码管1
sbit SHUG_02 = P2^1; //数码管2
sbit SHUG_03 = P2^2; //数码管3
sbit SHUG_04 = P2^3; //数码管4
#define LED_DATA P0 //P1数据端口
unsigned char code value_tab0[]=
{
0xC0,
0xF9,
0xA4,
0xB0,
0x99,
0x92,
0x82,
0xF8,
0x80,
0x90
}; //共阳极0-9显示断码
/*
* 延时1ms延时子函数
**/
void Delay_1ms(unsigned int Time)
{
unsigned int x, y;
for(x = Time; x > 0; x--)
for(y = 120; y > 0; y--);
}
/*
* 数码管动态显示0-9
**/
void Display_ShmgtablCmd(void)
{
unsigned char temp;
for(temp = 0; temp < 10; temp++)
{
SHUG_01 = 1;
SHUG_02 = 1;
SHUG_03 = 1;
SHUG_04 = 1;
LED_DATA = value_tab0[temp];
Delay_1ms(500);
}
}
/*
* 函数主体
**/
int main(void)
{
P0 = P1 = P2 = 0x00;
while(1)
{
Display_ShmgtablCmd();
}
}
恩…
望指点啊