OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5956|回复: 11

PIC16F877A单片机TMR0计数器问题!!来大神!!!!!

[复制链接]

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-11-11
在线时间
29 小时
发表于 2015-11-11 21:20:48 | 显示全部楼层 |阅读模式
5金钱
请问下,TMR0用作计数器的话,我想让按键按两下,数码管(我设置为只有两位显示)加一,然后写到这卡住了,问题是:怎么关联按键和计数器呀!!!!?想了好久,求大神答疑、编程!


#include<pic.h>
__CONFIG(0X3F39);
#define ucar unsigned char 
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};
char shi,ge;
void delay(uint x);
void scan();
void init();
void disp(uchar shi,uchar ge);
void main()
{
init();
while(1)
{
scan();
disp(shi,ge);
}
}




void init()
{
TRISB=0xff;//键盘为输入
TRISA=0;//数码管位选输出
TRISD=0;//段选
PORTA=0x20;//开位选
PORTD=0x3f;//开段选
delay(1);
PORTA=0x10;//0001 0000
PORTD=0x3f;
delay(1);
TMR0=255;//按4下+1
OPTION=0x21;//0010 0001
INTCON=0;//0000 0000
TRISA4=1;
}


void scan()
{
if(RB0==0)
{
delay(10);
if(RB0==0)
{

}
}
}




void disp(uchar shi,uchar ge)//数码管动态扫描
{
PORTD=table[shi];//显示第一个数码管
PORTA=0x20;//0010 0000
delay(2);


PORTD=table[ge];//显示第二个数码管
PORTA=0x10;//0001 0000
delay(2);
}


void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-4-14
在线时间
0 小时
发表于 2015-11-11 22:30:18 | 显示全部楼层
TMR0在这起什么作用?
如果单纯的想按下按钮显示加1,我想就用不着TMR0嘛

// scan函数要返回一个值作按钮是否按下的判断
char scan(void)
{
if(RB0==0)
{
delay(10);
if(RB0==0)
{
return 1;
}
}
return 0;
}

//主循环这么写
while(1)
{
if(scan())
{
ge++;
if(ge>9)
{
ge=0;
shi++;
if(shi>9) shi=0;
}
}
disp(shi,ge);
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-11-11 22:56:00 | 显示全部楼层
帮顶.....
回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-11-11
在线时间
29 小时
 楼主| 发表于 2015-11-12 09:31:04 | 显示全部楼层
回复【2楼】chy712:
---------------------------------
老师要求我们熟悉TMR0的计数器用法,不然我就不用计数器啦。求大神指点
回复

使用道具 举报

3

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-4-14
在线时间
0 小时
发表于 2015-11-12 09:40:42 | 显示全部楼层
回复【4楼】MickeyEX:
---------------------------------
哦,那我猜你的意思是要用计数器去捕获按键脉冲,抓到两个按键脉冲后就去控制数码管加1。
回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-11-11
在线时间
29 小时
 楼主| 发表于 2015-11-12 09:46:57 | 显示全部楼层
回复【5楼】chy712:
---------------------------------
回复【5楼】chy712:
---------------------------------
对对对,求教
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-11-12 11:14:26 | 显示全部楼层
楼主是不是这个意思,按键按两下有效,数码管加1?首先要明白这个是两件事情,按键怎么捕获按了两下这个事件,然后就见到了,一旦捕获按键按下两下事件,然后去驱动或者条用数码管加1函数。按键按下两下你要明白两次按键的时间间隔是多少,第一次按键按下后多长时间内再次按下按键才算双击,否则算是两次单击。例子参考:http://www.openedv.com/posts/list/61805.htm这个帖子,怎么区分长按和短按,原理一样。
30年众生牛马,60年诸佛龙象!
回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-11-11
在线时间
29 小时
 楼主| 发表于 2015-11-12 12:34:53 | 显示全部楼层
回复【7楼】无痕幽雨:
---------------------------------
两次单次的。
回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-11-11
在线时间
29 小时
 楼主| 发表于 2015-11-15 21:14:44 | 显示全部楼层
大神呢?
回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-11-11
在线时间
29 小时
 楼主| 发表于 2015-11-15 22:07:29 | 显示全部楼层
靠天靠地还不如靠自己
回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-11-11
在线时间
29 小时
 楼主| 发表于 2015-11-15 22:08:52 | 显示全部楼层
#include<pic.h>
__CONFIG(0X3F39);
#define ucar unsigned char 
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};
char shi,ge,num,shu;
void delay(uint x);
void scan();
void init();
void disp(uchar shi,uchar ge);
void main()
{
init();
while(1)
{
scan();
if(num==4)
{
num=0;
TMR0=255;
shu++;
shi=shu/10;
ge=shu%10;
}
disp(shi,ge);
}
}


void init()
{
TRISB=0xff;//键盘为输入
TRISA=0;//数码管位选输出
TRISD=0;//段选
PORTA=0x30;//开位选0011 0000
PORTD=0x3f;//开段选,显示0
delay(1);
TMR0=255;//按4下+1,因为4分频
OPTION=0x21;//0010 0001
INTCON=0x0a;//1010 0000
TRISA4=1;
}

void scan()
{
if(RB0==0)
{
delay(10);
if(RB0==0)
{
while(!RB0);
RA4=0;
num++;
}
}
}



void disp(uchar shi,uchar ge)//数码管动态扫描
{
PORTD=table[shi];//显示第一个数码管
PORTA=0x20;//0010 0000
delay(2);

PORTD=table[ge];//显示第二个数码管
PORTA=0x10;//0001 0000
delay(2);
}

void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}


还没烧入,不过差不多就是这样了,按键按四下,两位显示的数码管加一
回复

使用道具 举报

10

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2015-11-11
在线时间
29 小时
 楼主| 发表于 2015-11-15 22:11:46 | 显示全部楼层
求各位赐教,看看哪里还有不对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表