#include #include "ohos_init.h" #include "iot_gpio.h" #include "iot_gpio_ex.h" #include "iot_i2c.h" #include "cmsis_os2.h" #define IIC_SDA 0 #define IIC_SCL 1 #define ADDR 0x27 // 0100111 #define IIC_IDX 1 /* Command Register 0 Input port 0 1 Input port 1 2 Output port 0 3 Output port 1 4 Polarity Inversion port 0 5 Polarity Inversion port 1 6 Configuration port 0 7 Configuration port 1 */ #define CMD_CFG0 6 #define CMD_CFG1 7 #define CMD_OUT0 2 #define CMD_OUT1 3 int write_iic(uint8_t* data){ int ret = IoTI2cWrite(IIC_IDX, (ADDR << 1) | 0x00, data, 3); //printf("***@@@###$$$ ret = %d\n",ret); return ret; } //start uint8_t CFG0[] = {CMD_CFG0,0x0,0x0}; //配置为输出 uint8_t CFG1[] = {CMD_CFG1,0x0,0x0}; //配置为输出 uint8_t OUT0[] = {CMD_OUT0,0x00,0x00}; // 输出 uint8_t OUT1[] = {CMD_OUT1,0x00,0x00}; // 输出 char alpha[8][9] = { "11111111", "11100000", "11100000", "11111111", "11111111", "11100000", "11100000", "11111111" }; // char alpha[8][9] = { // "00011111", // "11100000", // "11100000", // "00011111", // "00011111", // "11100000", // "11100000", // "00011111" // }; void write_data(char byte1,char byte2){ //printf("write %02x ,%02x\n",byte1,byte2); uint8_t data[3] = {CMD_OUT0,0x00,0x00}; data[1] = byte1; data[2] = byte2; write_iic(data); data[0] = CMD_OUT1; write_iic(data); //printf("write %02x ,%02x\n",byte1,byte2); // printf("data[3] = %c\n",data[3]); // printf("data[2] = %c\n",data[2]); // printf("data[1] = %c\n",data[1]); // printf("data[0] = %c\n",data[0]); } void iic(void* args ){ int i,j; printf("iic thread running..."); IoTGpioInit(IIC_SDA); IoTGpioInit(IIC_SCL); IoTGpioSetFunc(IIC_SDA, IOT_GPIO_FUNC_GPIO_0_I2C1_SDA); IoTGpioSetFunc(IIC_SCL, IOT_GPIO_FUNC_GPIO_1_I2C1_SCL); IoTI2cInit(IIC_IDX, 400000); write_iic(CFG0); write_iic(CFG1); usleep(20); //usleep(200*1000); write_iic(OUT0); write_iic(OUT1); //usleep(1000*1000); usleep(100); while(1){ for(int i=0;i<8;i++){ unsigned char hex = 0; for(int j=0;j<8;j++){ hex = hex <<1; if(alpha[i][j] == '1'){ hex = hex | 0x1; } } OUT1[2] = hex; OUT0[1] = ~(1 << i); write_data(~(1 << i),hex); usleep(100); //延时,肉眼无法观察的速度 //alpha[i][j] = 0xff; //消隐,防止给下次扫描带来影响 //alpha[i][j] == '0'; // char alpha[8][9] = { // "00000000", // "00000000", // "00000000", // "00000000", // "00000000", // "00000000", // "00000000", // "00000000" // }; //hex = 0; //消隐,防止给下次扫描带来影响 //usleep(100); // printf("OUT1[2] = %c\n",OUT1[2]); // printf("OUT1[1] = %c\n",OUT1[1]); } // usleep(10000); //延时,肉眼无法观察的速度 // //alpha[i][j] = 0xff; //消隐,防止给下次扫描带来影响 // alpha[i][j] == '0'; } // printf("hex = %c\n",hex); // printf("OUT1[2] = %d\n",OUT1[2]); // printf("OUT1[1] = %d\n",OUT1[1]); usleep(10000); //延时,肉眼无法观察的速度 //alpha[i][j] = 0xff; //消隐,防止给下次扫描带来影响 alpha[i][j] == '0'; // char alpha[8][9] = { // "00000000", // "00000000", // "00000000", // "00000000", // "00000000", // "00000000", // "00000000", // "00000000" // }; //printf("set finish!\n"); } void iic_entry(){ printf("iic_entry called \n"); osThreadAttr_t attr; attr.name = "thread_iic"; attr.attr_bits = 0U; // 如果为1 ,则可以使用osThreadJoin函数 attr.cb_mem = NULL; //控制快的指针 attr.cb_size = 0U; attr.stack_mem = NULL; //栈内存指针 attr.stack_size = 1024 * 4; //栈大小 attr.priority = 25; //优先级 if (osThreadNew((osThreadFunc_t)iic, NULL, &attr) == NULL) { printf("Fail to create thread!\n"); } } APP_FEATURE_INIT(iic_entry);