
unsigned char flag1=0
unsigned char counter=0
unsigned char first=0
unsigned char second=0
unsigned char code dptable[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}//段码表
main()
{
TMOD=0x10//定时首侍器T1,方式山芹族1
TH1=0xfa//晶振为3.6864MHz,每5ms进一次中逗弊断
TL1=0x00
TR1=1
ET1=1
EA=1
while(1)
{
P1_0=1//P1口为位选
P2=dptable[second]//P2口为段选
P1_0=0
while(flag1==0)//动态扫描,每个数码管亮5ms
flag1=0
P1_0=1
P2=dptable[first]
P1_1=0
while(flag1==0)
flag1=0
P1_1=1
}
}
void interT1() interrupt 3//5ms进一次中断
{
TH1=0xfa
TL1=0x00
flag1=1
counter++
if(counter==200)//定时至1s
{
counter=0
first--
if(first==255)
{
first=9
second--
}
if(second==255)
{
second=7
first=9
}
}
}
#include<reg52.h>#define uchar unsigned char
#define duan P0 //共阴数码管的阳极端口
sbit wei1=P2^4 //共阴数码管的阳极端口,我的是四位的,下面语句中把1,2关了,只用到了3,4。
sbit wei2=P2^5
sbit wei3=P2^6
sbit wei4=P2^7
uchar code num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0~9的十六进制码
void delay(uchar xms)//软件延时
{
int i,j
for(i=xmsi>0i--)
for(j=125j>0j--)
}
void display(int tens,ones) //用来显示数字的函数,显示此时的十位,个亩尘位。
{
int i,j
for(i=2i>0i--)//通过改变i和j的值,可以改段掘变计时时间。
for(j=50j>0j--)
{
wei3=1//扫描原理。
wei4=0
duan=num[tens]
delay(5)
wei3=0
wei4=1
duan=num[ones]
delay(5)
}
}
void main()
{
int onesp=0,tensp=0//定义ones place和tens place。
wei1=0
wei2=0
while(1)
{
for(tensp=9tensp>=0tensp--)
{
for(onesp=9onesp>=0onesp--)
{
display(tensp,onesp)//调用函数握耐核显示此时的数字。
}
}
}
}
这个程序测试可用,从99计数到00。只用了比较简单知识,不涉及定时器和系统中断。不懂可以追问。
其实,这与keil 没什么关系,主要是取决于用什么语言写程序局罩,是汇编还是C语言,keil 不过是用来编译的软件。其次,既然是用数码管显示,就应该先画仿真图,或用实物开发板来显兆腊唯示,应该给开发板的原理图才好写程序。最先,至于倒计时就非常简单了,定义一个计时变量,作减法计数即可,每减一个数都送数族培码管显示出来。如下面仿真图,是两位倒计时的例子。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)