~~~~~~~~数字钟出现~~~~~~~~~~~
#include<reg52.h>
#define uchar unsigned char
uchar DspFlag; //数码管显示模式
uchar DspBit; //数码管位扫描
uchar KeyFlag; //按键扫描
uchar sec;
uchar min;
uchar hou;
uchar KeyLongSta=0;
uchar TmCnt; //定时器计时变量
uchar KeyModeTime=0;
uchar KeyBuf;
uchar const BITAB[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //数码管位选择
uchar DspBuf[6]={0,0,0,0,0,0}; //显示数据的存储单元
uchar const code SEGTAB[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //0~9,-的编码
uchar KeySta=0;
uchar KeyBuf;
uchar KeyLongCnt;
sbit dula=P2^6;
sbit wela=P2^7;
uchar i;
uchar KeyLong();
uchar KeySch();
void NmlCnt();
void KeyDeal();
void DspFun();
void NmlCnt() //计时函数
{
if(KeyModeTime==0) //控制模式的按键未按,模式0时刻
{
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hou++;
if(hou>23)
{
hou=0;
}
}
}
}
DspBuf[5]=sec%10; //数组0位存储秒的个位
DspBuf[4]=sec/10; //数组1位存储秒的十位
DspBuf[3]=min%10; //数组3位存储分的个位
DspBuf[2]=min/10; //数组4位存储分的十位
DspBuf[1]=hou%10; //数组6位存储时的个位
DspBuf[0]=hou/10; //数组7位存储秒的十位
}
void Init_Timer() //定时器0初始化
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
EA=1;
ET0=1;
TR0=1;
}
void Timer0_isr() interrupt 1 using 1 //定时器中断子程序
{
if(TmCnt>=250) //计时达到1s
{
TmCnt=0;
sec++;
DspBit=!DspBit;
}
else
{
TmCnt++;
if(TmCnt%5==0)
DspBit=!DspBit; //数码管扫描
}
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
}
main()
{
Init_Timer(); //定时器初始化
P0=0xff;
while(1)
{
if(DspBit==1) //数码管扫描
{
DspFun(); //数码管显示函数
}
NmlCnt(); //正常计时
}
}
void DspFun() //显示函数
{
uchar temp;
temp=temp+1; //问题就在这里!!!!这个子函数若改成下面那样就不行了。
if(temp>=6)
{
temp=0;
}
dula=0;
P0=SEGTAB[DspBuf[temp]]; //读取数码管段值
dula=1;
dula=0;
wela=0;
P0=BITAB[temp]; //数码管位选择
wela=1;
wela=0;
}
错误的子程序,你知道错在哪里吗??
(1)void DspFun() //显示函数
{
uchar temp;
if(temp>=6)
{
temp=0;
}
temp=temp+1;
dula=0;
P0=SEGTAB[DspBuf[temp]]; //读取数码管段值
dula=1;
dula=0;
wela=0;
P0=BITAB[temp]; //数码管位选择
wela=1;
wela=0;
}
(2)
void DspFun() //显示函数
{
uchar temp;
if(temp>=6)
{
temp=0;
}
else
temp=temp+1;
dula=0;
P0=SEGTAB[DspBuf[temp]]; //读取数码管段值
dula=1;
dula=0;
wela=0;
P0=BITAB[temp]; //数码管位选择
wela=1;
wela=0;
}
(3)
void DspFun() //显示函数
{
uchar temp;
dula=0;
P0=SEGTAB[DspBuf[temp]]; //读取数码管段值
dula=1;
dula=0;
wela=0;
P0=BITAB[temp]; //数码管位选择
wela=1;
wela=0;
if(temp>=6)
{
temp=0;
}
temp=temp+1;
}
以上的子程序都是将temp的判断部分的代码换了位置,可是经keil编译之后再下载都单片机就不行了,你知道错在哪里吗?
此帖出自
小平头技术问答
一周热门 更多>