|
【练习】PIC 编程 - LED闪灯 (功力挑战)
[复制链接]
|
|
发表于 7-9-2010 11:23 PM
|
显示全部楼层
本帖最后由 qweeer 于 7-9-2010 11:24 PM 编辑
我第3题的方法:
Device 16F877A
XTAL = 4
ALL_DIGITAL = TRUE
TRISB = %00000000
Start: Gosub LEDB1A
Gosub LEDB1B
Goto Start
'============ SUB PROGRAM ========================
'============ LED B2 (High Speed Flashing)========
'============ on 10ms ========================
'============ off 90ms ========================
LEDB2A: PortB.2 = 1 'LED B2 1st Part 50ms
Delayms 10 'LED B2 on 10ms
PortB.2 = 0 'LED B2 off 40ms
Delayms 40
Return
LEDB2B: PortB.2 = 0 'LED B2 2nd part 50ms
Delayms 50 'LED B2 off 50ms
Return
LEDB2: Gosub LEDB2A 'LED B2 1st Part 50ms
Gosub LEDB2B 'LED B2 2nd Part 50ms
Return 'LED B2 Total 100ms
'============ LED B0 (Medium speed) ===============
'============ on 50ms ========================
'============ off 950ms ========================
LEDB0A: PortB.0 = 1 'LED B0 1st Part 100ms
Gosub LEDB2A 'LED B0 on 50ms
PortB.0 = 0
Gosub LEDB2B 'LED B0 off 50ms
Return
LEDB0C: PortB.0 = 0 'LED B0 3rd Part 700ms
Gosub LEDB2 'LED B0 2nd 100ms
Gosub LEDB2 'LED B0 3nd 100ms '
Gosub LEDB2 'LED B0 2nd 100ms
Gosub LEDB2 'LED B0 3nd 100ms
Gosub LEDB2 'LED B0 2nd 100ms
LEDB0B: PortB.0 = 0 'LED Bo 2nd Part 200ms
Gosub LEDB2 'LED B0 3nd 100ms
Gosub LEDB2 'LED B0 3nd 100ms
Return
LEDB0: Gosub LEDB0A '100ms
Gosub LEDB0B '200ms
Gosub LEDB0C '700ms
Return 'LED B0 Total 1000ms
'============ LED B0 (LOW speed) =================
'============ on 300ms =======================
'============ off 1700ms =======================
LEDB1A: PortB.1 = 1 'LED B0 1st Part 1000ms
Gosub LEDB0A 'LED B0 on 100ms
Gosub LEDB0B 'LED B0 on 200ms
PortB.1 = 0
Gosub LEDB0c 'LED B0 off 700ms
Return
LEDB1B: PortB.1 = 0 'LED B0 2nd Part 1000ms
Gosub LEDB0
Return |
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 10-9-2010 12:04 PM
|
显示全部楼层
回复 181# qweeer
做得不错。 论坛开始比较多人了。呵呵
你simulate了,看起还应该没问题。
basic我就不是很懂, 不过看起来你一直call sub,在sub call sub.这样的话program 不会很复杂吗? |
|
|
|
|
|
|
|
发表于 13-9-2010 11:22 PM
|
显示全部楼层
谢谢你的分数
只要有logic,是不会复杂的
我也只是跟着logic 走,从最快变化的led开始做起,然后才在最小变化的led call 回最快变化的sub led , 时间算得刚刚好,是没问题的。
在 pic 和 basic,我还是小学生,还不懂如何使用 interrupt, 所以我觉得,一直call sub,在sub call sub是最容易,最简单的。
pic BZ 说还没见过有人用basic,所以我就尝试用 basic 最简单,最容易明白的方法来达成这任务。
希望小学生的作品,大家不会嫌弃。 |
|
|
|
|
|
|
|
发表于 27-3-2012 08:42 AM
|
显示全部楼层
本帖最后由 longcrystal 于 27-3-2012 08:56 AM 编辑
回复 1# pic
版主请问你给的 第二题 题目 我不是很会做~~~想请教关于 INTERRUPT 和TMR0 的用法~~~~我自己也有尝试做~~~~但是我还不是很会运用~~~我希望能明白 第二题怎么做~~~~我POST我的CODE 给你看看~~~~~请版主能教我~~~怎么在INTERRUPT和TMR0 这个FUNCTION 调整 延时~~~~~很想做到 同时LED 亮~~~但是LED 不同DELAY ~~~然后又不要用FOR 来完成这种情况~~~~~
不知道能在这个贴请教你嘛
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3B31);
#define BLINK_1 50
unsigned char g_TMR0=0;
unsigned char g_TMR1=0;
unsigned char i=0;
unsigned char b=0;
unsigned char j=0;
void interrupt ISR(void)
{
if(T0IE && T0IF )
{
T0IF=0;
g_TMR0++;
g_TMR1++;
if(g_TMR0 == 1000)
{
RD0=!RD0;
g_TMR0=0;
}
if(g_TMR1 == 8000)
{
RD1=!RD1;
g_TMR1=0;
}
}
}
void Init()
{
OPTION =0X04;
T0IF=0;
T0IE=1;
GIE=1;
TMR0=0;
TRISD=0X00;
PORTD=0X00;
}
void main(void)
{
Init();
while(1)
{
RD0^=1;
RD1^=1;
}
}
这个是我的程式 但是我先大概玩 两粒LED~~~~但是我就不会让他们同时亮的时候 不同DELAY~~~请版主赐教》《
我本身有用MPLAB 来COMPILE 和用 PROTEUS 来测试~~~这个CODE是可以运行的~~~只是我不是很明白怎么样控制 1个以上的LED~~~~~很希望能学会~~~~~~~~ |
|
|
|
|
|
|
|

楼主 |
发表于 27-3-2012 09:53 AM
|
显示全部楼层
回复 pic
版主请问你给的 第二题 题目 我不是很会做~~~想请教关于 INTERRUPT 和TMR0 的用法~~~~ ...
longcrystal 发表于 27-3-2012 08:42 AM 
你是HitechC, 我不熟悉这种写法。。 可能等其他人帮你看哦~ 呵呵 |
|
|
|
|
|
|
|
发表于 27-3-2012 10:17 AM
|
显示全部楼层
回复 185# pic
可是~~~~~我看到很多人都是用HITECH来写~~~~~版主你是用什么来写~~~~~
真希望有人可以 指点!!!呵呵~~~~~~~ 卡住很久了~~~~而且也有其他功课要忙 |
|
|
|
|
|
|
|
发表于 27-3-2012 10:22 AM
|
显示全部楼层
回复 83# rothmans
rothmans 请教你指点 关于 INTERRUPT 和 TIMER0 的用法~~~在 第二题的题目~~~~~~因为我看你也是用MPLAB来写的~~~~我有尝试拿你CODE来COMPILE 和MODIFIED 但是还是没办法成功COMPILE~~~~~~然后我自己也有写一个自己的~~~
用INTERRUPT 和TIMER0 来写~~~同时亮起来了~~~~但是就是没办法 调整 2个 不一样的DELAY ~~~~所以想请你赐教~~~几招~~~~~我对INTERRUPT 和TIMER0~~~完全很新手~~~~~~~~以前都是靠DELAY FUNCTION 来弄这些 或者FOR之类的~~~~没去尝试过这种写法~~~真的希望能得到你的指点呵呵!!!~~ |
|
|
|
|
|
|
|

楼主 |
发表于 27-3-2012 11:45 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 27-3-2012 02:01 PM
|
显示全部楼层
回复 184# longcrystal
不好意思,看不明白所要求的效果!不过我可以解释一下 网友提供的代码操作模式。希望对你有帮助。
呵呵呵。。。我先声明,我本人没用过Hitech,和PIC版主一样只是用过CCS写过简易的PIC16功能而已!
- void hardware_initialize(void)
- {
- PCON = 0x0B; /* OSCF = 4MHz, Not PWR ON @ BOD Reset. */
- PORTA = 0xFF;
- PORTB = 0x00;
- CMCON = 0x07;
- INTCON = 0x20; /* Enable Timer 0 Interrupt */启动
- PIE1 = 0x00; /* Interrupt Enable Bit */启动
- OPTION = 0x05; /* Disable PORTA Pull-up */
- TRISA = 0xFF;
- TRISB = 0x00;
- TMR0 = 0x63;/* 10ms*/
- }
复制代码
IO,Timer0和Interrupt的设置。
- static void interrupt isr(void)
- {
- if(T0IE && T0IF) /*属于 timer0 的中断(Interrupt)*/
- {
- TMR0 = 0x63;/*重新设置10ms中断一次*/
- temp0++;
- temp1++;
- temp2++;
- T0IF=0;
- }
- }
复制代码
记得进入intterrupt mode后,要重新设置过下次的中断时间。
temp0++; /* 控制LED1显示时间*/
temp1++;/* 控制LED2显示时间*/
temp2++;/* 控制LED3显示时间*/
- #include <pic.h>
- #include "ledFlash.h"
- #define BLINK_0 50 /* 500mS --- 与temp比较值是否相等*/
- #define BLINK_1 100 /* 1000mS */
- #define BLINK_2 5 /* 50mS */
- unsigned char temp0=0;
- unsigned char temp1=0;
- unsigned char temp2=0;
复制代码
- if(temp0==BLINK_0)/* --- 与BLINK_0(500ms)比较值是否相等*/
- {
- PORTB_0 ^= 1;/*反向 这个IObit-如果现在状况是1,反向为0,以达到闪烁效果*/
- temp0=0;
- }
-
- if(temp1==BLINK_1)/* --- 与BLINK_1(1000ms)比较值是否相等*/
- {
- PORTB_1 ^= 1;;/*反向 这个IObit-如果现在状况是1,反向为0,以达到闪烁效果*/
- temp1=0;
- }
-
- if(temp2==BLINK_2))/* --- 与BLINK_2(50ms)比较值是否相等*/
- {
- PORTB_2 ^= 1;/*反向 这个IObit-如果现在状况是1,反向为0,以达到闪烁效果*/
- temp2=0;
- }
复制代码
这是我对这个代码的理解,希望对你有所帮助~ |
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 28-3-2012 12:19 AM
|
显示全部楼层
回复 189# wkloh
谢谢你的帮忙~~这个码我看过了~~~但是 LEDFLASH.H 我没有这个FILE~~~也不知道这个HEADER FILE 里面放了什么~~
我的HI-TECH ~~~还是COMPILE 不到~~~~不过谢谢大家好意~~~如果没办法只能靠自己学了~~和明白其他人的CODE~~~ |
|
|
|
|
|
|
|
发表于 28-3-2012 12:20 AM
|
显示全部楼层
回复 188# pic
呵呵我说话有那么色情吗@@? |
|
|
|
|
|
|
|
发表于 28-3-2012 06:49 AM
|
显示全部楼层
回复 190# longcrystal
你试看把 LEDFLASH.H这行给删掉,再compile 过。
如果再不行,请把error print screen 贴上来。 |
|
|
|
|
|
|
|
发表于 28-3-2012 10:11 AM
|
显示全部楼层
回复 192# wkloh
很多ERROR~~应该是HEADER 里面 DEFINE 了其他VARIABLE 吧~所以没有FLASH。H 就要在。C那边弄了~~~~~我不在家里COMPILE不到~~~抱歉 迟点在POST~~~~ |
|
|
|
|
|
|
|
发表于 30-3-2012 05:12 PM
|
显示全部楼层
longcrystal, 你可以post上你的error code出来.
关于INTERUPT的用法就是当你的program需要一个准确的计算时间(如时钟,alarm),如过用delay function就会被其他的function干扰而造成整个program没有个统一的计算时间.这时候你就可以interupt. 简单说就是它自己算时间到了设定的时间或外来干涉而去"干扰"你的program.时间没到或没外在干扰时就让它在角落转圈圈咯. |
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 31-3-2012 06:59 PM
|
显示全部楼层
回复 194# whitemilk
謝謝你的解釋~~~等我得空了才繼續寫~~~或我直接 寄去你的信箱問你~~~~謝謝~~~~~~ |
|
|
|
|
|
|
|
发表于 8-6-2012 05:40 PM
|
显示全部楼层
回复 195# longcrystal
问题出在你的 main function.
while (1){
RD0 ^=1;
RD1^=1;
}
这两个pin会不断地自我toggle.看起来好像一直亮着。其实是很快的on->off->on->off.
你现在用interrupt来blink一个led.做到后,再教你怎样blink 两个led. |
|
|
|
|
|
|
|
发表于 13-6-2013 01:21 AM
|
显示全部楼层
pic 发表于 10-11-2007 12:54 PM 
不对哦, 3个LED 要同时进行, 并重复, 不是一个一个处理。
在试试看。。。
是所谓的multi tasking吗?
|
|
|
|
|
|
|
|

楼主 |
发表于 13-6-2013 07:45 AM
|
显示全部楼层
修止符 发表于 13-6-2013 01:21 AM 
是所谓的multi tasking吗?
类似吧。。
|
|
|
|
|
|
|
|
发表于 13-6-2013 12:18 PM
|
显示全部楼层
pic 发表于 13-6-2013 07:45 AM 
类似吧。。
可惜我没学过PIC,哈哈。。
|
|
|
|
|
|
|
|

楼主 |
发表于 13-6-2013 01:01 PM
|
显示全部楼层
|
|
|
|
|
|
| |
本周最热论坛帖子
|