OpenEdv-开源电子网

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

pic单片机好像进不了中断 同志们帮看看,只想显示1234

[复制链接]

37

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
306
金钱
306
注册时间
2012-9-27
在线时间
19 小时
发表于 2013-8-29 12:27:51 | 显示全部楼层 |阅读模式

如果我在主程序写b=1234,数码管就能显示1234.所以我想应该没进中断,但都按照书上的步骤都设置了,不知道哪错了。用的是20M晶振  想定时1ms,所以定时器TMR0的初值写的是96(设置的是32分频)定时器每加1的时间((1/20000000)*4*32)=0.0000064=6.4us    若定时1ms,定时器增加的数=1024us/6.4us=160   TMR0 的初值为256-160=96
#include<pic.h>
 __CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);
#define uchar unsigned char
#define uint unsigned int
uchar disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uint one,ten,hundred,thousand,b;
void delayms(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<454;j++);
}



void display(uint data)
{
while(1)
{
PORTA=0X0C;
thousand=data/1000;
PORTD=disp[thousand];
delayms(1);
PORTA=0X10;
hundred=data%1000/100;
PORTD=disp[hundred];
delayms(1);
PORTA=0X14;
ten=data%100/10;
PORTD=disp[ten];
delayms(1);
PORTA=0X18;
one=data%10;
PORTD=disp[one];
delayms(1);
}
}

main()
{
TRISD=0;
TRISA=0XE3;
T0CS=0;
PSA=0;
PS2=1;
PS1=0;
PS0=0;
T0IF=0;
T0IE=1;
GIE=1;
TMR0=96;//此处再加一句b=1234,则数目管则显示1234
while(1)
{
display(b);
}
}

void interrupt TIMER0()

{
if(T0IE&&T0IF)
{
T0IF=0;
b=1234;
}
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-8-29 14:29:42 | 显示全部楼层
没搞过PIC,呵呵。帮顶。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-8-29 16:38:31 | 显示全部楼层
enum    _T0MODE{   TOMODE_Timer=0 ,   T0MODE_Counter= (1<<5) };

void Timer0_Ini(u8 mode, u8 div, FunctionalStatus irEN)
{
OPTION_REG &= 0xc0; //预分配给Timer0
OPTION_REG |= mode;
OPTION_REG |= div;
T0IF = 0;
T0IE = (DISABLE==irEN)?0:1;
}

回复 支持 反对

使用道具 举报

37

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
306
金钱
306
注册时间
2012-9-27
在线时间
19 小时
 楼主| 发表于 2013-8-30 11:08:55 | 显示全部楼层
您帮我看看这两个程序有什么区别   我感觉都一样呢  但执行的效果就不一样
void interrupt TIMER0()

{
GIE=0;
if(T0IE&&T0IF)
{
T0IF=0;
for(count=0;count<10000;count++)


count=0;
if(b==0)
{
b=10000;
}
b--;
TMR0 = 0x05;
}

GIE=1;
}



void interrupt Time0(void)
{
GIE = 0; //关总中断
if(T0IF) //定时器0计数溢出
{
T0IF = 0; //清中断标志
count++; //计数器加1
if(count >= 10000) //计数器到10000,即1s
{
count = 0;
if(b== 0)
{
b= 100;
}
b--; //时间减1
}
TMR0 = 0x05;
}
GIE = 1; //开总中断
}
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 21:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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