[PIC®/AVR®/dsPIC®产品] 用纯寄存器写一个LED闪烁程序

[复制链接]
1578|11
 楼主| gaoyang9992006 发表于 2020-9-22 13:05 | 显示全部楼层 |阅读模式
本帖最后由 gaoyang9992006 于 2020-9-22 13:19 编辑

用惯了库函数,或者图形化配置,你还经常看手册吗,还能记得多少个常用的寄存器?
接下来用这个例子怀旧一下。
在本教程中,我们将看到带PIC单片机的 LED闪烁的示例,LED闪烁是初学者的第一步。您将学习如何使用PIC微控制器的GPIO端口以及如何使用数据表访问GPIO寄存器。
所需材料
用于LED闪烁的PIC寄存器
  • OSCCON内部振荡器控制寄存器
  • TRICx寄存器
  • 使用PORTx寄存器和LATx寄存器
使用PIC单片机进行LED闪烁的编程步骤使用LATx寄存器
  • 将内部振荡器设置为8Mhz频率。
  • 使用TRISx寄存器将PORTC的方向设置为输出。
  • 在while循环中,使用LATx寄存器打开和关闭LED。

使用PORTx寄存器
  • 将内部振荡器设置为8Mhz频率。
  • 使用TRISx寄存器将PORTC的方向设置为输出。
  • 在while循环中,使用PORTx Reigister打开和关闭LED。
Using LATx Register
  1. /*
  2. Led blinking using PIC18F4550
  3. */

  4. #include “Configurations_Header_File.h”                     //Header file for Configuration Bits
  5. #include <pic18f4550.h>                                             //Header file PIC18f4550 definitions

  6. void MS_delay(unsigned int);

  7. void main()
  8. {
  9. OSCCON=0x72;                                                           //SET internal oscillator of 8MHz Frequency
  10. TRISC=0x00;                                                                //Set direction of PORTC as OUTPUT to which LED is connected using TRISC register
  11. while(1)
  12. {
  13. LATC = 0xFF;                                                               //Turn ON LED for 200 ms
  14. MS_delay (200);                                                          // 200 milisecond Delay
  15. LATC = 0x00;                                                              //Turn OFF LED for 200 ms
  16. MS_delay (200);                                                          // 200 milisecond Delay
  17. }
  18. }
  19. void MS_delay(unsigned int val)
  20. {
  21. unsigned int i,j;
  22. for(i=0;i<val;i++)
  23. for(j=0;j<165;j++);                                                      //This loop Provide delay of 1 ms
  24. }



Using PORTx Register
  1. /*
  2. Led blinking using PIC18F4550
  3. */

  4. #include “Configurations_Header_File.h”                     //Header file for Configuration Bits
  5. #include <pic18f4550.h>                                             //Header file PIC18f4550 definitions

  6. void MS_delay(unsigned int);

  7. void main()
  8. {
  9. OSCCON=0x72;                                                           //SET internal oscillator of 8MHz Frequency
  10. TRISCbits.TRISC0=0;                                                    //Set direction of PORTC as OUTPUT to which LED is connected
  11. while(1)
  12. {
  13. PORTCbits.RC0=1;                                                      //Turn ON LED for 200 ms
  14. MS_delay (200);                                                          // 200 milisecond Delay
  15. LATC = 0x00;                                                              //Turn OFF LED for 200 ms
  16. MS_delay (200);                                                          // 200 milisecond Delay
  17. }
  18. }
  19. void MS_delay(unsigned int val)
  20. {
  21. unsigned int i,j;
  22. for(i=0;i<val;i++)
  23. for(j=0;j<165;j++);                                                      //This loop Provide Delay of 1 ms
  24. }
使用了不同的寄存器,实现了同样的IO控制,你还知道他们的关系吗?
wahahaheihei 发表于 2020-9-22 13:27 | 显示全部楼层
好几年不这么做了。
lcczg 发表于 2020-9-22 16:18 | 显示全部楼层
数据手册要对照着看来用
CoolSilicon 发表于 2020-9-23 11:28 | 显示全部楼层
不错..
不过 void MS_delay(unsigned int val) 这个函数看起来是delay ms单位的, 这个怎么保证精度??
建议直接用库函数__delay_ms类来用..
 楼主| gaoyang9992006 发表于 2020-9-23 11:39 | 显示全部楼层
CoolSilicon 发表于 2020-9-23 11:28
不错..
不过 void MS_delay(unsigned int val) 这个函数看起来是delay ms单位的, 这个怎么保证精度??
建议 ...

这个精度还真保证不了,库函数那个用的定时器,这个跑空指令。
奔波儿熊 发表于 2020-9-23 17:22 | 显示全部楼层
很熟悉就自己写,不熟悉还是MCC节约时间. 而且MCC是经过测试的,自己写的还需要测试.
 楼主| gaoyang9992006 发表于 2020-9-23 17:34 | 显示全部楼层
奔波儿熊 发表于 2020-9-23 17:22
很熟悉就自己写,不熟悉还是MCC节约时间. 而且MCC是经过测试的,自己写的还需要测试. ...

言之有理,我就是随手水一贴。。确实,这个时代要学的东西太多,不能把精力放在这种低效率行为上。
renzheshengui 发表于 2020-10-12 10:32 | 显示全部楼层
长知识了谢谢
wakayi 发表于 2020-10-12 10:33 | 显示全部楼层
感谢楼主的分享
wowu 发表于 2020-10-12 10:34 | 显示全部楼层
开拓眼界了 谢谢
xiaoqizi 发表于 2020-10-12 10:35 | 显示全部楼层
非常不错的资料
木木guainv 发表于 2020-10-12 10:35 | 显示全部楼层
路过 学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部