matrix3.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. //printf("***@@@###$$$ ret = %d\n",ret);
  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. "11111111",
  38. "11100000",
  39. "11100000",
  40. "11111111",
  41. "11111111",
  42. "11100000",
  43. "11100000",
  44. "11111111"
  45. };
  46. // char alpha[8][9] = {
  47. // "00011111",
  48. // "11100000",
  49. // "11100000",
  50. // "00011111",
  51. // "00011111",
  52. // "11100000",
  53. // "11100000",
  54. // "00011111"
  55. // };
  56. void write_data(char byte1,char byte2){
  57. //printf("write %02x ,%02x\n",byte1,byte2);
  58. uint8_t data[3] = {CMD_OUT0,0x00,0x00};
  59. data[1] = byte1;
  60. data[2] = byte2;
  61. write_iic(data);
  62. data[0] = CMD_OUT1;
  63. write_iic(data);
  64. //printf("write %02x ,%02x\n",byte1,byte2);
  65. // printf("data[3] = %c\n",data[3]);
  66. // printf("data[2] = %c\n",data[2]);
  67. // printf("data[1] = %c\n",data[1]);
  68. // printf("data[0] = %c\n",data[0]);
  69. }
  70. void iic(void* args ){
  71. int i,j;
  72. printf("iic thread running...");
  73. IoTGpioInit(IIC_SDA);
  74. IoTGpioInit(IIC_SCL);
  75. IoTGpioSetFunc(IIC_SDA, IOT_GPIO_FUNC_GPIO_0_I2C1_SDA);
  76. IoTGpioSetFunc(IIC_SCL, IOT_GPIO_FUNC_GPIO_1_I2C1_SCL);
  77. IoTI2cInit(IIC_IDX, 400000);
  78. write_iic(CFG0);
  79. write_iic(CFG1);
  80. usleep(20);
  81. //usleep(200*1000);
  82. write_iic(OUT0);
  83. write_iic(OUT1);
  84. //usleep(1000*1000);
  85. usleep(100);
  86. while(1){
  87. for(int i=0;i<8;i++){
  88. unsigned char hex = 0;
  89. for(int j=0;j<8;j++){
  90. hex = hex <<1;
  91. if(alpha[i][j] == '1'){
  92. hex = hex | 0x1;
  93. }
  94. }
  95. OUT1[2] = hex;
  96. OUT0[1] = ~(1 << i);
  97. write_data(~(1 << i),hex);
  98. usleep(100); //延时,肉眼无法观察的速度
  99. //alpha[i][j] = 0xff; //消隐,防止给下次扫描带来影响
  100. //alpha[i][j] == '0';
  101. // char alpha[8][9] = {
  102. // "00000000",
  103. // "00000000",
  104. // "00000000",
  105. // "00000000",
  106. // "00000000",
  107. // "00000000",
  108. // "00000000",
  109. // "00000000"
  110. // };
  111. //hex = 0; //消隐,防止给下次扫描带来影响
  112. //usleep(100);
  113. // printf("OUT1[2] = %c\n",OUT1[2]);
  114. // printf("OUT1[1] = %c\n",OUT1[1]);
  115. }
  116. // usleep(10000); //延时,肉眼无法观察的速度
  117. // //alpha[i][j] = 0xff; //消隐,防止给下次扫描带来影响
  118. // alpha[i][j] == '0';
  119. }
  120. // printf("hex = %c\n",hex);
  121. // printf("OUT1[2] = %d\n",OUT1[2]);
  122. // printf("OUT1[1] = %d\n",OUT1[1]);
  123. usleep(10000); //延时,肉眼无法观察的速度
  124. //alpha[i][j] = 0xff; //消隐,防止给下次扫描带来影响
  125. alpha[i][j] == '0';
  126. // char alpha[8][9] = {
  127. // "00000000",
  128. // "00000000",
  129. // "00000000",
  130. // "00000000",
  131. // "00000000",
  132. // "00000000",
  133. // "00000000",
  134. // "00000000"
  135. // };
  136. //printf("set finish!\n");
  137. }
  138. void iic_entry(){
  139. printf("iic_entry called \n");
  140. osThreadAttr_t attr;
  141. attr.name = "thread_iic";
  142. attr.attr_bits = 0U; // 如果为1 ,则可以使用osThreadJoin函数
  143. attr.cb_mem = NULL; //控制快的指针
  144. attr.cb_size = 0U;
  145. attr.stack_mem = NULL; //栈内存指针
  146. attr.stack_size = 1024 * 4; //栈大小
  147. attr.priority = 25; //优先级
  148. if (osThreadNew((osThreadFunc_t)iic, NULL, &attr) == NULL)
  149. {
  150. printf("Fail to create thread!\n");
  151. }
  152. }
  153. APP_FEATURE_INIT(iic_entry);