EMATRIX.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include <stdio.h>
  2. #include "ohos_init.h"
  3. #include "iot_gpio.h"
  4. #include "iot_gpio_ex.h"
  5. #include "iot_i2c.h"
  6. #include "cmsis_os2.h"
  7. #define IIC_SDA 0
  8. #define IIC_SCL 1
  9. #define ADDR 0x27 // 0100111
  10. #define IIC_IDX 1
  11. /*
  12. Command Register
  13. 0 Input port 0
  14. 1 Input port 1
  15. 2 Output port 0
  16. 3 Output port 1
  17. 4 Polarity Inversion port 0
  18. 5 Polarity Inversion port 1
  19. 6 Con?guration port 0
  20. 7 Con?guration port 1
  21. */
  22. #define CMD_CFG0 6
  23. #define CMD_CFG1 7
  24. #define CMD_OUT0 2
  25. #define CMD_OUT1 3
  26. int write_iic(uint8_t* data)
  27. {
  28. int ret = IoTI2cWrite(IIC_IDX, (ADDR << 1) | 0x00, data, 3);
  29. return ret;
  30. }
  31. //start
  32. uint8_t CFG0[] = {CMD_CFG0,0x0,0x0}; //配置为输出
  33. uint8_t CFG1[] = {CMD_CFG1,0x0,0x0}; //配置为输出
  34. uint8_t OUT0[] = {CMD_OUT0,0x00,0x00}; // 输出
  35. uint8_t OUT1[] = {CMD_OUT1,0x00,0x00}; // 输出
  36. char alpha[8][9] =
  37. {
  38. "11111111",
  39. "11111111",
  40. "11100000",
  41. "11111111",
  42. "11111111",
  43. "11100000",
  44. "11100000",
  45. "11111111"
  46. };
  47. void write_data(char byte1,char byte2)
  48. {
  49. //printf("write %02x ,%02x\n",byte1,byte2);
  50. uint8_t data[3] = {CMD_OUT0,0x00,0x00};
  51. data[1] = byte1;
  52. data[2] = byte2;
  53. write_iic(data);
  54. data[0] = CMD_OUT1;
  55. write_iic(data);
  56. }
  57. void iic(void* args )
  58. {
  59. printf("iic thread running...");
  60. IoTGpioInit(IIC_SDA);
  61. IoTGpioInit(IIC_SCL);
  62. IoTGpioSetFunc(IIC_SDA, IOT_GPIO_FUNC_GPIO_0_I2C1_SDA);
  63. IoTGpioSetFunc(IIC_SCL, IOT_GPIO_FUNC_GPIO_1_I2C1_SCL);
  64. IoTI2cInit(IIC_IDX, 400000);
  65. write_iic(CFG0);
  66. write_iic(CFG1);
  67. usleep(200*1000);
  68. write_iic(OUT0);
  69. write_iic(OUT1);
  70. usleep(1000*1000);
  71. while(1)
  72. {
  73. for(int i=0;i<8;i++)
  74. {
  75. unsigned char hex = 0;
  76. //将alpha第i行转换为hex
  77. for(int j=0;j<8;j++)
  78. {
  79. hex = hex <<1;
  80. if(alpha[i][j] == '1')
  81. {
  82. hex = hex | 0x1;
  83. }
  84. }
  85. OUT1[2] = hex; //设置列
  86. OUT0[1] = ~(1 << i); //选择第i行
  87. write_data(~(1 << i),hex);
  88. }
  89. }
  90. printf("set finish!\n");
  91. }
  92. void iic_entry()
  93. {
  94. printf("iic_entry called \n");
  95. osThreadAttr_t attr;
  96. attr.name = "thread_iic";
  97. attr.attr_bits = 0U; // 如果为1 ,则可以使用osThreadJoin函数
  98. attr.cb_mem = NULL; //控制快的指针
  99. attr.cb_size = 0U;
  100. attr.stack_mem = NULL; //栈内存指针
  101. attr.stack_size = 1024 * 4; //栈大小
  102. attr.priority = 25; //优先级
  103. if (osThreadNew((osThreadFunc_t)iic, NULL, &attr) == NULL)
  104. {
  105. printf("Fail to create thread!\n");
  106. }
  107. }
  108. APP_FEATURE_INIT(iic_entry);