matrix2.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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 Configuration port 0
  20. 7 Configuration 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. int ret = IoTI2cWrite(IIC_IDX, (ADDR << 1) | 0x00, data, 3);
  28. return ret;
  29. }
  30. //start
  31. uint8_t CFG0[] = {CMD_CFG0,0x0,0x0}; //配置为输出
  32. uint8_t CFG1[] = {CMD_CFG1,0x0,0x0}; //配置为输出
  33. uint8_t OUT0[] = {CMD_OUT0,0x00,0x00}; // 输出
  34. uint8_t OUT1[] = {CMD_OUT1,0x00,0x00}; // 输出
  35. char alpha[8][9] = {
  36. "11111111",
  37. "11100000",
  38. "11100000",
  39. "11111111",
  40. "11111111",
  41. "11100000",
  42. "11100000",
  43. "11111111"
  44. };
  45. void write_data(char byte1,char byte2){
  46. //printf("write %02x ,%02x\n",byte1,byte2);
  47. uint8_t data[3] = {CMD_OUT0,0x00,0x00};
  48. data[1] = byte1;
  49. data[2] = byte2;
  50. write_iic(data);
  51. data[0] = CMD_OUT1;
  52. write_iic(data);
  53. }
  54. void iic(void* args ){
  55. printf("iic thread running...");
  56. IoTGpioInit(IIC_SDA);
  57. IoTGpioInit(IIC_SCL);
  58. IoTGpioSetFunc(IIC_SDA, IOT_GPIO_FUNC_GPIO_0_I2C1_SDA);
  59. IoTGpioSetFunc(IIC_SCL, IOT_GPIO_FUNC_GPIO_1_I2C1_SCL);
  60. IoTI2cInit(IIC_IDX, 400000);
  61. write_iic(CFG0);
  62. write_iic(CFG1);
  63. usleep(200*1000);
  64. write_iic(OUT0);
  65. write_iic(OUT1);
  66. usleep(1000*1000);
  67. while(1){
  68. for(int i=0;i<8;i++){
  69. unsigned char hex = 0;
  70. for(int j=0;j<8;j++){
  71. hex = hex <<1;
  72. if(alpha[i][j] == '1'){
  73. hex = hex | 0x1;
  74. }
  75. }
  76. OUT1[2] = hex;
  77. OUT0[1] = ~(1 << i);
  78. write_data(~(1 << i),hex);
  79. }
  80. }
  81. printf("set finish!\n");
  82. }
  83. void iic_entry(){
  84. printf("iic_entry called \n");
  85. osThreadAttr_t attr;
  86. attr.name = "thread_iic";
  87. attr.attr_bits = 0U; // 如果为1 ,则可以使用osThreadJoin函数
  88. attr.cb_mem = NULL; //控制快的指针
  89. attr.cb_size = 0U;
  90. attr.stack_mem = NULL; //栈内存指针
  91. attr.stack_size = 1024 * 4; //栈大小
  92. attr.priority = 25; //优先级
  93. if (osThreadNew((osThreadFunc_t)iic, NULL, &attr) == NULL)
  94. {
  95. printf("Fail to create thread!\n");
  96. }
  97. }
  98. APP_FEATURE_INIT(iic_entry);