找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1169|回复: 6
打印 上一主题 下一主题
收起左侧

MCU单片机IO口从新怎样组合?

[复制链接]
跳转到指定楼层
楼主
ID:89072 发表于 2023-9-21 09:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Modbus485通讯,把部分IO口组合在一起做一组,反复试了多次,在网上根据网上资料,还有在本网的一些帖子,都没能完成,请大佬指导下该怎么办啊,非常感谢。

单片机源程序如下:
  1. /*定义不同引脚一组*/

  2. #ifndef _USER_IO_H__
  3. #define _USER_IO_H__
  4. #include "STC8H.h"
  5. #include <intrins.h>
  6. //u8 data IONum[]=" ";//


  7. sbit IN7 = P3^5;//
  8. sbit IN6 = P3^6;
  9. sbit IN5 = P3^7;
  10. sbit IN4 = P2^0;
  11. sbit IN3 = P2^1;
  12. sbit IN2 = P2^2;
  13. sbit IN1 = P2^3;
  14. sbit IN0 = P2^4;

  15. sbit OT7 = P5^3;
  16. sbit OT6 = P1^6;
  17. sbit OT5 = P4^7;
  18. sbit OT4 = P0^5;
  19. sbit OT3 = P0^6;
  20. sbit OT2 = P0^7;
  21. sbit OT1 = P1^0;
  22. sbit OT0 = P4^3;

  23. extern unsigned char daIN;
  24. extern unsigned char daOT;

  25. extern void IOIN_Data(daIN);//输入IO定义IOIN_Data(u8 daIN)
  26. extern void IOOT_Data(daOT);//输出IO定义



  27. #endif
复制代码
  1. /*定义不同引脚一组*/
  2. #include "User_IO.h"

  3. unsigned char daIN;


  4. unsigned char daOT;


  5. /******************************************************************
  6. 功能: 系统初始化
  7. 输入:        无
  8. 输出: 无
  9. 版本: V1
  10. 作者:
  11. 修改日期:
  12. 说明:
  13. ******************************************************************/
  14. void IOinit(void)
  15. {
  16.         P0M0 = 0x00;
  17.         P0M1 = 0x00;
  18.         P1M1 = 0x06;
  19.         P1M0 = 0x00; //P1.1;P1.2为ADC输入口,设为高阻。
  20.         P2M0 = 0x00;
  21.         P2M1 = 0x00;
  22.         P3M0 = 0xb2;
  23.         P3M1 = 0x00;
  24.         P4M0 = 0x00;
  25.         P4M1 = 0x00;
  26.         P5M0 = 0x00;  //0x08  P5.3推挽输出
  27.         P5M1 = 0x00;

  28. }
  29. void IOIN_Data(daIN)
  30. {

  31.         daIN = (daIN<<8)|IN7;
  32.         daIN = (daIN<<7)|IN6;
  33.         daIN = (daIN<<6)|IN5;
  34.         daIN = (daIN<<5)|IN4;
  35.         daIN = (daIN<<4)|IN3;
  36.         daIN = (daIN<<3)|IN2;
  37.         daIN = (daIN<<2)|IN1;
  38.         daIN = (daIN<<1)|IN0;

  39. }

  40. //void IOOT_Data(void)
  41. //{
  42. //        daOT = daOT |= OT0;
  43. //        daOT = (daOT<<1)|OT0;
  44. //        daOT = (daOT<<2)|OT1;
  45. //        daOT = (daOT<<3)|OT2;
  46. //        daOT = (daOT<<4)|OT3;
  47. //        daOT = (daOT<<5)|OT4;
  48. //        daOT = (daOT<<6)|OT5;
  49. //        daOT = (daOT<<7)|OT6;
  50. //        daOT = (daOT<<8)|OT7;

  51. //}

  52. //void IOOT_Data(daOT)                        //SCAN_SEG(unsigned char show_data)
  53. //{
  54. //    OT0=1;
  55. //    if((daOT&0x01)==0){OT0=0;}
  56. //    OT1=1;
  57. //    if((daOT&0x02)==0){OT1=0;}
  58. //    OT2=1;
  59. //    if((daOT&0x04)==0){OT2=0;}
  60. //    OT3=1;
  61. //    if((daOT&0x08)==0){OT3=0;}
  62. //    OT4=1;
  63. //    if((daOT&0x10)==0){OT4=0;}
  64. //    OT5=1;
  65. //    if((daOT&0x20)==0){OT5=0;}
  66. //    OT6=1;
  67. //    if((daOT&0x40)==0){OT6=0;}
  68. //    OT7=1;
  69. //    if((daOT&0x80)==0){OT7=0;}
  70. //}

  71. //void IOOT_Data(daOT)
  72. //{
  73. //        OT7 = (bit)(daOT&0x80);
  74. //        OT6 = (bit)(daOT&0x40);
  75. //        OT5 = (bit)(daOT&0x20);
  76. //        OT4 = (bit)(daOT&0x10);
  77. //        OT3 = (bit)(daOT&0x08);
  78. //        OT2 = (bit)(daOT&0x04);
  79. //        OT1 = (bit)(daOT&0x02);
  80. //        OT0 = (bit)(daOT&0x01);
  81. //}

  82. void   IOOT_Data(daOT)
  83. {
  84.        daOT <<= 1;
  85.        OT0 = CY;
  86.        daOT <<= 1;
  87.        OT1 = CY;
  88.        daOT <<= 1;
  89.        OT2 = CY;
  90.        daOT <<= 1;
  91.        OT3 = CY;
  92.        daOT <<= 1;
  93.        OT4 = CY;
  94.        daOT <<= 1;
  95.        OT5 = CY;
  96.        daOT <<= 1;
  97.        OT6 = CY;
  98.        daOT <<= 1;
  99.        OT7 = CY;
  100. }
复制代码


  1. void display1()
  2. {
  3.         unsigned char h,z;
  4.         h=12;

  5.         delayms1(100);
  6.         daOT = 0x80;
  7. //        OT7  = OK;
  8.         delayms1(100);
  9.         daOT = 0x00;
  10. //        OT7  = OFF;
  11. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1073939 发表于 2023-9-21 14:15 | 只看该作者
extern void IOIN_Data(daIN);//输入IO定义IOIN_Data(u8 daIN)
extern void IOOT_Data(daOT);//输出IO定义


这2函数不要传递全局变量。
改成
unsigned char IOIN_Data(void);
void IOOT_Data(unsigned char out);


回复

使用道具 举报

板凳
ID:1073939 发表于 2023-9-21 14:21 | 只看该作者
2个函数的实现部分。全局变量定义在bdata区效率高。
  1. bdata unsigned char daIN;
  2.         sbit bI0 = daIN ^ 0;
  3.         sbit bI1 = daIN ^ 1;
  4.         sbit bI2 = daIN ^ 2;
  5.         sbit bI3 = daIN ^ 3;
  6.         sbit bI4 = daIN ^ 4;
  7.         sbit bI5 = daIN ^ 5;
  8.         sbit bI6 = daIN ^ 6;
  9.         sbit bI7 = daIN ^ 7;
  10. bdata unsigned char daOT;
  11.         sbit bO0 = daOT ^ 0;
  12.         sbit bO1 = daOT ^ 1;
  13.         sbit bO2 = daOT ^ 2;
  14.         sbit bO3 = daOT ^ 3;
  15.         sbit bO4 = daOT ^ 4;
  16.         sbit bO5 = daOT ^ 5;
  17.         sbit bO6 = daOT ^ 6;
  18.         sbit bO7 = daOT ^ 7;
  19. unsigned char IOIN_Data(void)
  20. {
  21.         bI0=IN0;
  22.         bI1=IN1;
  23.         bI2=IN2;
  24.         bI3=IN3;
  25.         bI4=IN4;
  26.         bI5=IN5;
  27.         bI6=IN6;
  28.         bI7=IN7;
  29.         return daIN;
  30. }
  31. void IOOT_Data(unsigned char out)
  32. {
  33.         daOT=out;
  34.         OT0=bO0;
  35.         OT1=bO1;
  36.         OT2=bO2;
  37.         OT3=bO3;
  38.         OT4=bO4;
  39.         OT5=bO5;
  40.         OT6=bO6;
  41.         OT7=bO7;
  42. }
复制代码






回复

使用道具 举报

地板
ID:1073939 发表于 2023-9-21 14:26 | 只看该作者
输出示范
  1. void display1()
  2. {
  3.         delayms1(100);
  4.         IOOT_Data(0x80);
  5.         delayms1(100);
  6.         IOOT_Data(0x00);
  7. }
复制代码
回复

使用道具 举报

5#
ID:89072 发表于 2023-9-21 14:30 | 只看该作者
ydatou 发表于 2023-9-21 14:15
这2函数不要传递全局变量。
改成
unsigned char IOIN_Data(void);

嗯嗯,谢谢我试试吧
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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