找回密码
 立即注册
查看: 67|回复: 1

今天拿出来Ai8051U最小开发板写一个函数指针的流水灯

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:40
  • 最近打卡:2026-03-12 21:57:50

17

主题

33

回帖

127

积分

注册会员

积分
127
发表于 2026-3-12 22:06:36 | 显示全部楼层 |阅读模式
使用AiCube创建工程,将LED的P2端口设置为开漏模式,将按钮P32引脚设置为内部上拉电阻。并设置P32引脚上的INT0外部中断模式为下降沿中断,这样按下就可以触发中断。
接下来编写代码



  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用户文件头说明信息  
  4. // 文件名称: main.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改记录:
  8. //   1. (2026-03-11) 创建文件
  9. ////////////////////////////////////////
  10. //<<AICUBE_USER_HEADER_REMARK_END>>
  11. #include "config.h"                     //默认已包含stdio.h、intrins.h等头文件
  12. //<<AICUBE_USER_INCLUDE_BEGIN>>
  13. // 在此添加用户头文件包含  
  14. //<<AICUBE_USER_INCLUDE_END>>
  15. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  16. // 在此添加用户全局变量定义、用户宏定义以及函数声明  
  17. u8 code ledNum[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  18. u8 ledIndex;
  19. u8 funindex=0;
  20. void led1(void);
  21. void led2(void);
  22. void (*fun[2])(void);
  23. //<<AICUBE_USER_GLOBAL_DEFINE_END>>
  24. ////////////////////////////////////////
  25. // 项目主函数
  26. // 入口参数: 无
  27. // 函数返回: 无
  28. ////////////////////////////////////////
  29. void main(void)
  30. {
  31.   //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
  32.   // 在此添加用户主函数初始化代码
  33.   //<<AICUBE_USER_MAIN_INITIAL_END>>
  34.   SYS_Init();
  35.   //<<AICUBE_USER_MAIN_CODE_BEGIN>>
  36.   // 在此添加主函数中运行一次的用户代码  
  37.   fun[0]=led1;
  38.   fun[1]=led2;
  39.   //<<AICUBE_USER_MAIN_CODE_END>>
  40.   while (1)
  41.   {
  42.     //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
  43.     // 在此添加主函数中用户主循环代码
  44.     fun[funindex]();
  45.     //<<AICUBE_USER_MAIN_LOOP_END>>
  46.   }
  47. }
  48. ////////////////////////////////////////
  49. // 系统初始化函数
  50. // 入口参数: 无
  51. // 函数返回: 无
  52. ////////////////////////////////////////
  53. void SYS_Init(void)
  54. {
  55.     EnableAccessXFR();                  //使能访问扩展XFR
  56.     AccessCodeFastest();                //设置最快速度访问程序代码
  57.     AccessIXramFastest();               //设置最快速度访问内部XDATA
  58.     IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基
  59.     //<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
  60.     // 在此添加用户预初始化代码  
  61.     //<<AICUBE_USER_PREINITIAL_CODE_END>>
  62.     PORT2_Init();                       //P2口初始化
  63.     PORT3_Init();                       //P3口初始化
  64.     EXTI0_Init();                       //INT0初始化
  65.     //<<AICUBE_USER_INITIAL_CODE_BEGIN>>
  66.     // 在此添加用户初始化代码  
  67.     //<<AICUBE_USER_INITIAL_CODE_END>>
  68.     EnableGlobalInt();                  //使能全局中断
  69. }
  70. ////////////////////////////////////////
  71. // 微秒延时函数
  72. // 入口参数: us (设置延时的微秒值)
  73. // 函数返回: 无
  74. ////////////////////////////////////////
  75. void delay_us(uint16_t us)
  76. {
  77.     do
  78.     {
  79.         NOP(34);                        //(MAIN_Fosc + 500000) / 1000000 - 6
  80.     } while (--us);
  81. }
  82. ////////////////////////////////////////
  83. // 毫秒延时函数
  84. // 入口参数: ms (设置延时的毫秒值)
  85. // 函数返回: 无
  86. ////////////////////////////////////////
  87. void delay_ms(uint16_t ms)
  88. {
  89.     uint16_t i;
  90.     do
  91.     {
  92.         i = MAIN_Fosc / 6000;
  93.         while (--i);
  94.     } while (--ms);
  95. }
  96. //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
  97. // 在此添加用户函数实现代码  
  98. void led1(void)
  99. {
  100.       delay_ms(250);
  101.       P2 = ~ledNum[ledIndex];    //输出低驱动      
  102.       ledIndex++;
  103.       if(ledIndex > 7)
  104.       {
  105.           ledIndex = 0;
  106.       }
  107. }
  108. void led2(void)
  109. {
  110.       delay_ms(250);
  111.       P2 = ledNum[ledIndex];    //输出低驱动      
  112.       ledIndex++;
  113.       if(ledIndex > 7)
  114.       {
  115.           ledIndex = 0;
  116.       }
  117. }
  118. //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
复制代码
然后在exit.c修改中断函数

  1. //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
  2. ////////////////////////////////////////
  3. // 在此添加用户文件头说明信息  
  4. // 文件名称: exti.c
  5. // 文件描述:
  6. // 文件版本: V1.0
  7. // 修改记录:
  8. //   1. (2026-03-12) 创建文件
  9. ////////////////////////////////////////
  10. //<<AICUBE_USER_HEADER_REMARK_END>>
  11. #include "config.h"
  12. //<<AICUBE_USER_INCLUDE_BEGIN>>
  13. // 在此添加用户头文件包含  
  14. //<<AICUBE_USER_INCLUDE_END>>
  15. //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
  16. // 在此添加用户全局变量定义、用户宏定义以及函数声明  
  17. extern u8 funindex;
  18. //<<AICUBE_USER_GLOBAL_DEFINE_END>>
  19. ////////////////////////////////////////
  20. // 外部中断INT0初始化函数
  21. // 入口参数: 无
  22. // 函数返回: 无
  23. ////////////////////////////////////////
  24. void EXTI0_Init(void)
  25. {
  26.     INT0_FallingInt();                  //设置外部中断为下降沿中断
  27.     INT0_SetIntPriority(0);             //设置中断为最低优先级
  28.     INT0_EnableInt();                   //使能外部中断
  29.     //<<AICUBE_USER_EXTI0_INITIAL_BEGIN>>
  30.     // 在此添加用户初始化代码  
  31.     //<<AICUBE_USER_EXTI0_INITIAL_END>>
  32. }
  33. ////////////////////////////////////////
  34. // 外部中断INT0中断服务程序
  35. // 入口参数: 无
  36. // 函数返回: 无
  37. ////////////////////////////////////////
  38. void EXTI0_ISR(void) interrupt INT0_VECTOR
  39. {
  40.     //<<AICUBE_USER_EXTI0_ISR_CODE1_BEGIN>>
  41.     // 在此添加中断函数用户代码  
  42.    funindex++;
  43.   if(funindex>=2) funindex=0;
  44.     //<<AICUBE_USER_EXTI0_ISR_CODE1_END>>
  45. }
  46. //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
  47. // 在此添加用户函数实现代码  
  48. //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
复制代码
这样在中断函数里就可以快速修改索引序号,因为只有2个流水灯花样函数,这里就让这个变量只可以是0或者1,如果有更多花样可以继续添加。
现在编译烧录,单片机就默认单个点亮流动,按下后会立马触发中断进入第二种花样单个熄灭流动。
20260312220547.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:841
  • 最近打卡:2026-03-23 07:51:55
已绑定手机

58

主题

2015

回帖

3627

积分

论坛元老

积分
3627
发表于 2026-3-13 08:01:31 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-23 23:09 , Processed in 0.110674 second(s), 50 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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