perry_peng的个人空间 https://passport2.21ic.com/?717779 [收藏] [复制] [RSS]

日志

PIC单片机学习(3)

已有 843 次阅读2014-6-18 15:43 |系统分类:单片机| 单片机



准备好写程序了


先是用C语言写,我主要是做一个串口来接收command,然后解析它的参数,然后根据不同的命令控制I2C设备pcf8574。


比如有直接写,读+或+写, 读+异或+写,读+与+写。共四条指令。因为有多个i2c设备所有每个命令后面跟上参数指定不同的设备id即slave地址。另外还需要一个参数来指令port的值。




首先我写了一个命令解析函数。它仅接受四条指令并分析命令后的两个参数,可以接受二进制,十进制(默认),十六进制。


分别的格式是:


cmd1      port       data


setp        b0101    b10101010; 二进制表示。


setp        3             182    ;十进制表示。


setp       x1            xFF;   十六进制表示。




       
  1. uint16 getcmd()
  2. {
  3. uint8 ch = 0, bp = 0, flag;
  4. uint16 cmd = 0;

  5. while ((ch = getc()) && !isbreak(ch)) {
  6. if (isspace(ch) && bp && 
  7. isspace(buffer[bp - 1]))
  8. continue;
  9. buffer[bp++ % BSX] = ch;
  10. ///< 
  11. if (!bp)
  12. bp = BSX;
  13. }

  14. ///< 
  15. while (bp) {
  16. ch = buffer[(bp - 1) % BSX];
  17. if (!isspace(ch))
  18. break;
  19. --bp;
  20. }

  21. ///< Dosn't handles empty command.
  22. if (!bp)
  23. return ERR_EMPTY_INPUT;

  24. ///< add a space.
  25. buffer[bp % BSX] = 0x20;

  26. /// 1)
  27. break;
  28. }

  29. ///< Checks WDT.
  30. wdt_set();

  31. ///< The length of name must at least 4 chars.
  32. if (bp < 4 || flag < 2)
  33. return ERR_INVALID_FORMAT;

  34. while (bp--) {
  35. ch = buffer[bp % BSX];
  36. ///< Converts lowercase to uppercase.
  37. if (ch > 0x60)
  38. ch -= 0x20;

  39. if (ch > 0x5a)
  40. return ERR_ILLEGAL_FUNCTION;

  41. if (!cmd) {
  42. if (ch != 0x50)
  43. return ERR_ILLEGAL_FUNCTION;
  44. cmd |= 0x01;
  45. continue;
  46. }

  47. if (cmd >> 9)
  48. break;

  49. cmd <<= 8;
  50. cmd |= ch;
  51. }

  52. switch (cmd) {
  53. case 0x5445:
  54. if (ch != 0x53)
  55. return ERR_ILLEGAL_FUNCTION;
  56. flag = 0;
  57. break;
  58. case 0x4c52:
  59. if (ch != 0x58)
  60. return ERR_ILLEGAL_FUNCTION;
  61. flag = 0x10;
  62. case 0x524f:
  63. if (ch != 0x58)
  64. return ERR_ILLEGAL_FUNCTION;
  65. flag = 0x20;
  66. break;
  67. case 0x444e:
  68. if (ch != 0x41)
  69. return ERR_ILLEGAL_FUNCTION;
  70. flag = 0x30;
  71. break;
  72. default:
  73. return ERR_ILLEGAL_FUNCTION;
  74. }

  75. cmd = flag << 8;

  76. for (; ; bp++) {
  77. ch = buffer[bp % BSX];
  78. if (isspace(ch)) {
  79. ch = buffer[++bp % BSX];
  80. flag = 10;

  81. if (isnum(ch))
  82. ///< Processes dec numbers.
  83. --bp;
  84. else if (ch == 0x42 || ch == 0x62)
  85. ///< Processes binary numbers.
  86. flag = 0x02;
  87. else if (ch == 0x58 || ch == 0x78)
  88. /// 0x60)
  89. ch -= 0x20;
  90. ch -= 0x07;
  91. }
  92. }
  93. ch -= 0x30;
  94. if (cmd & 0xff) {
  95. ch = (cmd & 0xff) * flag + ch;
  96. cmd ^= (cmd & 0xff);
  97. }
  98. cmd |= ch;
  99. ch = buffer[++bp % BSX];
  100. }

  101. if (cmd & 0x8000)
  102. break;

  103. ///< pcf8574 only three address pins are valid.
  104. if (cmd & 0xf8)
  105. return ERR_DEVICE_ADDRESS_OUT_RANGE;

  106. cmd |= ((cmd & 0x07) << 8);
  107. cmd ^= (cmd & 0xff);
  108. cmd |= 0x8000;
  109. --bp;
  110. }
  111. }

  112. return cmd;
  113. }
复制代码






路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)