单片机定时器控制数码管动态显示程序
#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint//段...
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//段码,最后一位是“-”的段码
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//待显示的数据:09-12-25与23-59-58(分两组显示)
uchar codeTable_of_Digits[][8]={{0,9,10,1,2,10,2,5},{2,3,10,5,9,10,5,8}};
uchar i,j=0;
uint t=0;
//主程序
void main()
{
P3=0x80; //位码初值
TMOD=0x00; //计数器T0方式0
TH0=(8192-4000)/32; //4ms定时
TL0=(8192-4000)%32;
IE=0x82;
TR0=1; //启动T0
while(1);
}
//T0中断函数控制数码管刷新显示
void DSY_Show() interrupt 1
{
TH0=(8192-4000)/32; //恢复初值
TL0=(8192-4000)%32;
P0=0xff; //输出位码和段码
P0=DSY_CODE[Table_of_Digits[i][j]];
P3=_crol_(P3,1);
j=(j+1)%8; //数组第i行的下一字节索引
if(++t!=350)return; //保持刷新一段时间
t=0;
i=(i+1)%2; //数组行i=0时显示年月日,i=1时显示时分秒
}
关于以上程序有一点疑惑<1>TR0=1 开始启动以后 每隔4ms中断一次去处理中段程序然后是返回到void main()什么地方 中断程序会处理会不会消耗太多时间。<2>中断程序开始处理时候P0=DSY_CODE[Table_of_Digits[0][0]],即数字0显示在第一个数码管,然后P3左移,j=1; if(++t!=350)return这个会消耗多少时间 if(++t!=350)return; 执行完毕后是往下执t=0行还是执行P0=DSY_CODE[Table_of_Digits[i][j]];即P0=DSY_CODE[Table_of_Digits[0}[1]]; 展开
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//段码,最后一位是“-”的段码
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//待显示的数据:09-12-25与23-59-58(分两组显示)
uchar codeTable_of_Digits[][8]={{0,9,10,1,2,10,2,5},{2,3,10,5,9,10,5,8}};
uchar i,j=0;
uint t=0;
//主程序
void main()
{
P3=0x80; //位码初值
TMOD=0x00; //计数器T0方式0
TH0=(8192-4000)/32; //4ms定时
TL0=(8192-4000)%32;
IE=0x82;
TR0=1; //启动T0
while(1);
}
//T0中断函数控制数码管刷新显示
void DSY_Show() interrupt 1
{
TH0=(8192-4000)/32; //恢复初值
TL0=(8192-4000)%32;
P0=0xff; //输出位码和段码
P0=DSY_CODE[Table_of_Digits[i][j]];
P3=_crol_(P3,1);
j=(j+1)%8; //数组第i行的下一字节索引
if(++t!=350)return; //保持刷新一段时间
t=0;
i=(i+1)%2; //数组行i=0时显示年月日,i=1时显示时分秒
}
关于以上程序有一点疑惑<1>TR0=1 开始启动以后 每隔4ms中断一次去处理中段程序然后是返回到void main()什么地方 中断程序会处理会不会消耗太多时间。<2>中断程序开始处理时候P0=DSY_CODE[Table_of_Digits[0][0]],即数字0显示在第一个数码管,然后P3左移,j=1; if(++t!=350)return这个会消耗多少时间 if(++t!=350)return; 执行完毕后是往下执t=0行还是执行P0=DSY_CODE[Table_of_Digits[i][j]];即P0=DSY_CODE[Table_of_Digits[0}[1]]; 展开
展开全部
基本上不算消耗太多时间。
每个指令的消耗时间可以KEIL模拟仿真的时候可以大概算出时间。
if(++t!=350)return,这句是没有达到350,就退出中断函数,到了中断时间载再进入就是另外一次了。
追问
if(++t!=350)return是不是产生350T0中断 程序才会继续往下处理t=0; i=(i+1)%2; 另外要使整个程序能正常显示if(++t!=350)return最少取值为8即if(++t!=8)return;
追答
是的,t取多少这个,要根据单片机的运行速率,显示刷新率来决定的!!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询