2
本帖最后由 237238009 于 2012-12-27 20:39 编辑
昨晚到视频学到了。冲断,定时器,888数码管的显视。学一点,做一点。记的劳,学的快,代码运用更我行我素。因为还没学到按键的操作。所以写出来的还不能改时间,是从00:00:00。0开始的。我在家学的,手头没有单片机,买也大老远。没能亲自试用。发出来给大家点明点明。 晶振:24.0MHZ 不用锁存器,直接用两个IO口控制888数码管。我也不知道AT89C58 IO 口 高电平能输出多少电流,点不亮就要加电流放大电路了。已经用Keil软件 仿真没见有什么问题。 #include
#include //移位功能头文件
#define A unsigned char //全局定量
A code ab[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07, //建一个列表,名叫ab,{内容0-9} 用 来 数 字 显 视
0x7f,0x6f};
A code ac[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf}; //建一个列表,名叫ac};用来扫描WE1到WE7
A a,t1,t2,t3,t4,t5,t6,t7;
void main()
{
TMOD=0x01;//选择定时器为第一个。
TH0=(65536-50000)/256;//给定时器高8位给个初值。
TL0=(65536-50000)%256;//给低8位个初值。
EA=1;//开总冲断。
ET0=1;//开定时器1冲断。
TR0=1;//启动定时器。=0时,停止定时。
t1=0;
t2=0;
t3=0;
t4=0;
t5=0;
t6=0;
t7=0;
while(1)
{
if (a==40)
{
t7++; //10分1之秒
a=0;
}
if (t7==10)
{
t7=0; //个位秒
t6++;
}
if (t6==10)
{
t6=0; //十位秒
t5++;
}
if (t5==6)
{
t5=0; //个位分
t4++;
}
if (t4==10)
{
t4=0; //十位分
t3++;
}
if (t3==6)
{
t3=0; //个位时
t2++;
}
if (t1==2)
if (t2==4)
{ //十位时
t2=0;
t1=0;
}
if (t2==10)
t1++;
P1=ac[0];
P0=ab[t1];
P1=ac[1];
P0=ab[t2];
P1=ac[2];
P0=ab[t3];
P1=ac[3];
P0=ab[t4];
P1=ac[4]; //扫描数据显示
P0=ab[t5];
P1=ac[5];
P0=ab[t6];
P1=ac[6];
P0=ab[t7];
}
}
void timer0() interrupt 1 //定时器1 函数(),冲断方式1。《0为外部冲断,1为定时器冲断》冲断函数不用在前面声明。
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //2.5ms 一次。
a++;
}
//237238009
|
|