bossay_release_out/vendor/bossay/dianzhen_demo1/matrix/matrix4.c

208 lines
4.5 KiB
C
Raw Normal View History

2025-09-24 11:16:14 +08:00
#include <stdio.h>
#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]);
}
//osDelay(1000);
usleep(1000); //延时,肉眼无法观察的速度
// //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);