标题:
单片机新手写了一个关于秒表的小程序,遇到了一些问题,想请教一下
[打印本页]
作者:
peter_panfayang
时间:
2019-3-7 16:50
标题:
单片机新手写了一个关于秒表的小程序,遇到了一些问题,想请教一下
我这个程序功能很简单:通过tx-1c实验班的第一个矩阵键盘按键开始计时
1、烧写在板子上按键下去可以计时,但是数码管只有当个位数变动时,十位数的显示就闪一下,
就是说个位数的数字显示正常,但是十位数的数字一秒闪一次,想请教一下是什么问题?
2、我想让按键能实现开始和暂停的功能,请问我应该怎么改?
3、还有想问一个小知识点,keil中的bit关键字定义的变量如果没有初始化,那么这个变量初始值是1还是0呢?
刚开始学单片机,很多东西不是很懂,希望各位大佬能帮我解答一下,如果我的代码写得不好也希望能给我一些小建议吧,谢谢了。
单片机源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选信息
uchar single, tenth;
uchar flag;
sbit dula=P2^6;
sbit wela=P2^7;
uint num=1;
void delay(uchar ms)
{
uchar i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--) ;
}
void display(uchar tenth, uchar single) //数码管显示函数
{
dula=1;
P0=led[tenth];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=1;
P0=led[single];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
}
void keyscan() //键盘检测
{
uchar temp;
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee: flag=1;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=0xf0;
}
}
}
}
void main()
{
single=0;
tenth=0;
display(tenth,single);
TMOD=0x02; //利用定时器0方式2计数
TL0=6; //方式2为初值自动重装的8位定时器
TH0=6;
keyscan(); //检测按键是否被按下
EA=1;
ET0=1;
TR0=1;
while(flag) //当检测按键被按下开始计时
{
if(num==3686) //中断3686次相当于1s
{
num=1;
single++;
if(single==10)
{
single=0;
tenth++;
}
display(tenth,single);
}
}
}
void T0_time() interrupt 1 //中断函数
{
num++;
}
复制代码
作者:
hufeng
时间:
2019-3-7 20:47
中断关闭就可以暂停了
作者:
hufeng
时间:
2019-3-7 20:50
keil中的bit关键字定义的变量如果没有初始化,那么这个变量初始值是0
作者:
zhengchong60
时间:
2019-3-7 22:42
变量没有初始化
作者:
yzwzfyz
时间:
2019-3-8 08:35
变量初始值是1还是0?
养成好习惯,先做初始化。否则会吃苦头的!!!即使板凳说明完全正确,也不要轻信!
作者:
peter_panfayang
时间:
2019-3-9 14:48
zhengchong60 发表于 2019-3-7 22:42
变量没有初始化
请问具体是哪一个位置没有初始化呢,可以给我指点一下吗?
作者:
peter_panfayang
时间:
2019-3-9 14:56
hufeng 发表于 2019-3-7 20:47
中断关闭就可以暂停了
我的思路也是这样,但是怎么让单片机第二次检测按键被按下呢?这个地方不太会写
作者:
wulin
时间:
2019-3-9 21:38
给你改这样试试
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};//数码管段选信息
//uchar single, tenth;
uchar flag=0,sec=0;
uint num=0;
bit sign1=0;
void delay(uchar ms)
{
uchar i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--) ;
}
void display()//数码管显示函数
{
static bit k=0;
P0=0x00;//消隐
dula=1;
dula=0;
if(k==0)
{
P0=0xfe;
wela=1;
wela=0;
P0=led[sec/10];
dula=1;
dula=0;
k=1;
}
else
{
P0=0xfd;
wela=1;
wela=0;
P0=led[sec%10];
dula=1;
dula=0;
k=0;
}
}
void keyscan() //键盘检测
{
static bit sign;
// uchar temp;
P3=0xf0;
if(P3!=0xf0)
{
delay(10);
if((P3==0xe0)&&(sign==0))
{
sign=1;//自锁
flag++;
if(flag==3)flag=0;
if(flag==0){sec=0;num=0;}//清0
if(flag==1)sign1=1;//启动
if(flag==2)sign1=0;//停止
}
}
else sign=0;//按键抬起
}
void Timer0Init(void)//1毫秒@11.0592MHz
{
TMOD = 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TR0 = 1; //定时器0开始计时
EA=1;
ET0=1;
}
void main()
{
Timer0Init();
while(1) //当检测按键被按下开始计时
{
keyscan(); //检测按键是否被按下
}
}
void T0_time() interrupt 1 //中断函数
{
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
if(sign1==1)
{
num++;
if(num>=1000)
{
num=0;
sec++;
if(sec>=100)
sec=0;
}
}
display();//动态显示
}
复制代码
作者:
zhb2004xp
时间:
2019-3-10 00:40
变量的定义如果是全局变量(函数初始就定义了,在整个函数里都能使用),初始值=0;
如果是局部变量(在子函数中定义,只能在子函数中调用),初始值是随机的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1