v3S驱动gt911触摸

article/2025/8/22 13:08:09

文章目录

  • 一、修改设备树
  • 二、编写驱动
  • 三、运行测试
  • 四、编译进内核
    • 1. 拷贝文件
    • 2. 修改对应的 Makefile
    • 3. 编译运行
    • 4.测试
      • 1.注释掉坐标信息
  • 五、移植tslib
    • 1. buildroot配置tslib
    • 2. 配置tslib
    • 3. 测试

一、修改设备树

在sun8i-v3s-licheepi-zero-dock.dts中添加pio节点(其实经过测试不添加也是可以的,后面会说)

&pio{/* 按键 */key_pins:key_pins@0{pins = "PG2";function = "gpio_in";bias-pull-up;};/* 触摸复位 */ts_reset_pin: ts_reset_pin@0 {pins = "PB3";function = "gpio_out";};	
};

在这里插入图片描述

在&i2c节点下添加

	/*  触摸 */gt911:gt911@5d {compatible = "goodix,gt911","goodix,gt9xx";reg = <0x5d>;pinctrl-names = "default";/*pinctrl-0 = <&ts_reset_pin>; 				*/	interrupt-parent = <&pio>;interrupts = <1 2 IRQ_TYPE_EDGE_FALLING>; /* (PB2) */irq-gpio = <&pio 1 2 GPIO_ACTIVE_HIGH>; /* (PB2) */rst-gpio = <&pio 1 3 GPIO_ACTIVE_HIGH>; /* RST (PB3) */status = "okay";};

在这里插入图片描述
然后编译设备树,下载到开发板运行。

二、编写驱动

gt911.c

#include <linux/module.h>
#include <linux/regmap.h>
#include <linux/gpio/consumer.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>
#include <linux/input.h>
#include <linux/input/mt.h>
#include <linux/debugfs.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
#include <linux/input/mt.h>
#include <linux/input/touchscreen.h>
#include <linux/i2c.h>/*** file name:gt9xx* date: 2021-09-01  15:04* version:1.0* author:luatao* describe:gt9xx device drive*/
#define GT_CTRL_REG 	            0X8040  /* GT9147控制寄存器         */
#define GT_MODSW_REG 	        0X804D  /* GT9147模式切换寄存器        */
#define GT_CFGS_REG 	        0X8047  /* GT9147配置起始地址寄存器    */
#define GT_CHECK_REG 	        0X80FF  /* GT9147校验和寄存器       */
#define GT_PID_REG 		        0X8140  /* GT9147产品ID寄存器       */#define GT_GSTID_REG 	        0X814E  /* GT9147当前检测到的触摸情况 */
#define GT_TP1_REG 		        0X814F  /* 第一个触摸点数据地址 */
#define GT_TP2_REG 		        0X8157	/* 第二个触摸点数据地址 */
#define GT_TP3_REG 		        0X815F  /* 第三个触摸点数据地址 */
#define GT_TP4_REG 		        0X8167  /* 第四个触摸点数据地址  */
#define GT_TP5_REG 		        0X816F	/* 第五个触摸点数据地址   */
#define MAX_SUPPORT_POINTS      5       /* 最多5点电容触摸 *//* 设备结构体 自定义 */
struct gt911_dev{int irq_pin, reset_pin;   /* 中断和复位IO */int irqnum;   /* 中断号 *///  void *private_date;  /* 私有数据 */struct input_dev *input;  /* input结构体 */struct i2c_client *client; /* i2c客户端 */};/* 定义一个设备结构体 */
struct gt911_dev gt911;   /*gt911 设备 */
/*
const unsigned char GT911_CT[]=
{0x5A,0x20,0x03,0xE0,0x01,0x05,0x3D,0x00,0x02,0x08,0x28,0x08,0x5A,0x46,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x03,0x88,0x29,0x0A,0x4B,0x4D,0x0C,0x08,0x00,0x00,0x00,0x21,0x02,0x1D,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x64,0x94,0xD5,0x02,0x07,0x00,0x00,0x04,0x83,0x48,0x00,0x77,0x4D,0x00,0x6D,0x53,0x00,0x64,0x59,0x00,0x5A,0x60,0x00,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,0x12,0x14,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0F,0x10,0x12,0x16,0x18,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD6,0x01,
};*//* 从gt911读取多个寄存器数据 @param - *dev        : gt911设备 @param - reg           : 要读取的寄存器首地址@param - *buf         : 读取到的数据 @param - len          : 要读取的数据长度 @return                    :操作结果
*/
static int gt911_read_regs(struct gt911_dev *dev, u16 reg, u8 *buf, int len)
{int ret = 0;u8 regdata[2]; // 寄存器数据struct i2c_msg msg[2];   /* 传输的消息 读的命令 */struct i2c_client *client = (struct i2c_client *)dev->client;  /* 私有数据 *//* gt911 寄存器长度为2个字节 */regdata[0] = (reg >> 8) & 0xFF;  // 高8位regdata[1] = reg & 0xFF;  // 低8位 /* msg[0] 为发送要读取的首地址 */msg[0].addr = client->addr;  /* 器件地址 */msg[0].flags = 0;                       /* 标记为发送数据 */msg[0].buf = &regdata[0];              /* 要读取数据的首地址 */msg[0].len = 2;                     /* reg长度 *//* msg[1]读取数据 */msg[1].addr = client->addr;  /* 器件地址 */msg[1].flags = I2C_M_RD;    /* 标记为读取数据 */msg[1].buf = buf;              /* 读取数据缓冲区  */msg[1].len = len;                     /* 读取数据长度 */ret = i2c_transfer(client->adapter, msg, 2);  /* 向总线发送2个消息 */if(ret == 2){  /* 传输成功 */ret = 0;}else{printk("i2c_transfer failed!\r\n");return -EREMOTEIO;}return ret;
}/* 从gt911多个寄存器写入数据 @param - *dev        : gt911设备 @param - reg           : 要写入的寄存器首地址@param - *buf         : 写入的数据缓冲区@param - len          : 要写入的数据长度 @return                    :操作结果
*/
static s32 gt911_write_regs(struct gt911_dev *dev, uint16_t reg, uint8_t *buf, int len)
{uint8_t buf1[256];struct i2c_msg msg;   /* 传输的消息 */struct i2c_client *client = (struct i2c_client *)dev->client;  buf1[0] = (reg >> 8) & 0xFF;  /* 寄存器首地址 */buf1[1] = reg & 0xFF;  memcpy(&buf1[2], buf, len);  /* 要写入的数据拷贝到数据buf1中 *//* msg处理数据 */msg.addr = client->addr;  /* 器件地址 */msg.flags = 0;    /* 标记为写入数据 */msg.buf = buf1;              /* 要写入的数据缓冲区  */msg.len = len + 2;                     /* 写入的数据长度 */return  i2c_transfer(client->adapter, &msg, 1);  /* 向总线发送1个消息 */
}/* 从gt911读取指定寄存器值 读取一个寄存器@param - *dev        : ap3216设备 @param - reg           : 要读取的寄存器@return                    :读取到的寄存器值
*///static unsigned char  gt911_read_reg(struct gt911_dev *dev, u8 reg)
//{// struct i2c_client *client = (struct i2c_client *)dev->client;  /* 私有数据 *///return i2c_smbus_read_byte_data(client, reg);  /* 读取一个字节数据 */
//}/* 向gt911指定寄存器写入指定的值,写一个寄存器 @param - *dev        : ap3216设备 @param - reg           : 要写入的寄存器@param - data         : 要写入的值 @return                    :无
*/
static void gt911_write_reg(struct gt911_dev *dev, uint16_t reg, uint8_t data)
{uint8_t buf = 0;buf = data;gt911_write_regs(dev, reg, &buf, 1);  /* 调用写入多个寄存器的方法 */
}/* 触摸中断处理函数 */
static irqreturn_t gt911_irq_handler(int irq, void *dev_id)
{u8 touch_num = 0, status, havakey ; // 触摸点的数量最大5点触摸  数据是否准备好  是否有按键按下 int input_x, input_y, id = 0;  // x,y坐标  触摸IDint ret = 0;  // 返回值u8 data,touch_data[5];  // 触摸数据struct gt911_dev *dev = dev_id; // 触摸设备结构体/* 判断是否进入中断 *///printk("cd %s\r\n",__FUNCTION__);/* 读取坐标点寄存器 */ret = gt911_read_regs(dev, GT_GSTID_REG, &data, 1); /* 这一位数据的表示:bit7:1表示坐标(或按键)已经准备好,主控可以读取  0 表示未就绪,数据无效bit4:1表示有按键 0表示无按键(已经松开)bit3~0:屏上的坐标点个数  */if(data == 0x00){  /* 没有触摸数据*/goto fail;}else{  /* 统计触摸信息 */status = data >> 7;  // 取最高位 havakey = (data >> 4) & 0x01; touch_num = data & 0x0f;  // 只取低4位 }/* 单点触摸 不适用于多点触摸*/if(touch_num){  /* 有触摸按下   */gt911_read_regs(dev, GT_TP1_REG, touch_data, 5);  // 读取第一个触摸点 连续读5个数据 id = touch_data[0] & 0x0F; if(id == 0){input_x = (touch_data[1] | (touch_data[2] << 8)) & 0x0fff;  // x坐标input_y = (touch_data[3] | (touch_data[4] << 8)) & 0x0fff;  // y坐标input_mt_slot(dev->input, id); // 产生ABS_MT_SLOT 事件 报告是哪个触摸点的坐标 input_mt_report_slot_state(dev->input, MT_TOOL_FINGER, true);   // 指定手指触摸  连续触摸input_report_abs(dev->input, ABS_MT_POSITION_X, input_x);   // 上报触摸点坐标信息 input_report_abs(dev->input, ABS_MT_POSITION_Y, input_y);   // 上报触摸点坐标信息 printk("x = %d, y = %d\r\n", input_x, input_y);  //打印坐标信息 }}else if(touch_num == 0){  // 单点触摸释放 input_mt_slot(dev->input, id); /* 上报触摸点 */input_mt_report_slot_state(dev->input, MT_TOOL_FINGER, false); // 关闭手指触摸 }input_mt_report_pointer_emulation(dev->input, true); input_sync(dev->input);   /* 同步数据 数据上报完成 */data = 0x00;  /* 向0x814E寄存器写0  不然就会一直进入中断 */gt911_write_regs(dev, GT_GSTID_REG, &data, 1);   //写入fail:return IRQ_HANDLED;
}/* 申请IO并复位gt911 @param - *client           : i2C控制器@param - *dev         : 自定义的触摸设备@return                    :0:成功             其他负值 :失败
*/
static int gt911_ts_reset(struct i2c_client * client, struct gt911_dev *dev)
{int ret = 0;printk("cd %s\r\n",__FUNCTION__);/* 申请复位IO */if(gpio_is_valid(dev->reset_pin)){  // 判断gpio是否合法/* 申请复位 IO  并且默认输出高电平 */ret = devm_gpio_request_one(&client->dev,     dev->reset_pin,GPIOF_OUT_INIT_LOW,"gt911 reset");if(ret){  // 申请失败printk("request reset_pin failed!\r\n");return ret;}}/* 申请中断IO*/if(gpio_is_valid(dev->irq_pin)){  // 判断gpio是否合法/* 申请复位 IO  并且默认输出高电平 */ret = devm_gpio_request_one(&client->dev,     dev->irq_pin,   //  引脚编号GPIOF_OUT_INIT_LOW,   // 默认的电平状态 "gt911 irq");  // 名字 随便if(ret){  // 申请失败printk("request irq_pin failed!\r\n");return ret;}}/* 初始化gt911  */gpio_set_value(dev->reset_pin, 0); /* 复位 */msleep(10);gpio_set_value(dev->reset_pin, 1); /* 停止复位 */msleep(10);gpio_set_value(dev->irq_pin, 0);    /* 拉低INT引脚 */msleep(50);gpio_direction_input(dev->irq_pin); /* INT引脚设置为输入 *//* 有一个地址的判断 */return 0;
}/* gt911 中断初始化 @param - *client           : i2C控制器@param - *dev         : 自定义的触摸设备@return                    :0:成功             其他负值 :失败
*/
static int gt911_ts_irq(struct i2c_client * client, struct gt911_dev *dev)
{int ret = 0; // 返回值/* 申请中断  */ret = devm_request_threaded_irq(&client->dev,client->irq,NULL,gt911_irq_handler,IRQF_TRIGGER_FALLING | IRQF_ONESHOT,client->name,&gt911);if(ret){dev_err(&client->dev, "Unable to request touchscreen IRQ.\r\n");return ret;}printk("gt911 handler irq number: %d\r\n", client->irq);  // 打印出中断号return 0;
}/* 发送gt911配置参数 @param - *dev           : 自定义的触摸设备@param - mode         : 0 :参数不保存到flash  1:参数保存到flash@return                    :无
*/
/* 屏幕配置信息  */
/*
void gt911_send_cfg(void)
{u8 regdata[186] = {0};unsigned int i = 0,ret = 0;u8 softVersion = 0;  // 软件版本号 u8 gt911_id[6] = {0}; // 产品IDu8 irqmode = 0;  // 中断触发方式u8 crc = 0;  // 校验和 //  读软件版本号 gt911_read_regs(&gt911, GT_CFGS_REG, &softVersion,1); printk("soft version:%d\r\n", softVersion);// 读取产品ID printk("ID: ");gt911_read_regs(&gt911, GT_PID_REG, gt911_id,6); for(i = 0; i< 6;i++)printk("%d ", gt911_id[i]);printk("\r\n");// 读中断触发方式 gt911_read_regs(&gt911, GT_MODSW_REG, &irqmode,1); printk("irqmode:%d\r\n", irqmode);// 读取184个寄存器 gt911_read_regs(&gt911, GT_CFGS_REG, regdata,184); for(i= 0; i < 186; i++){printk("%#X ", regdata[i]);if(i < 184){crc += regdata[i];  // 校验和 }}printk("\r\n");crc = (~crc) + 1;printk("crc:%d\r\n", crc);// 软件复位 gt911_write_reg(&gt911, GT_CTRL_REG, 2);// 配置186个寄存器 // 获取设备树的配置信息 ret = of_property_read_u8_array(gt911.client->dev.of_node, "goodix,cfg-group0", regdata, 186);if (ret < 0) {printk("goodix,cfg-group0 property read failed\r\n");} else {printk("reg data:\r\n");for(i = 0; i < 186; i++){printk("%X ", regdata[i]);}printk("\r\n");}gt911_write_regs(&gt911, GT_CFGS_REG, regdata, sizeof(regdata));  gt911_write_reg(&gt911,GT_CTRL_REG,2);msleep(100);
}
*//* i2C驱动的probe函数 ,当驱动与设备匹配以后此函数就会执行 */
static int gt911_probe(struct i2c_client *client, const struct i2c_device_id *id)
{u8 ret = 0; gt911.client = client; printk("gt911 driver and device has match!\r\n");  // 提示信息 /* 1. 获取设备树中的中断和复位引脚 */gt911.irq_pin = of_get_named_gpio(client->dev.of_node, "irq-gpio", 0);gt911.reset_pin = of_get_named_gpio(client->dev.of_node, "rst-gpio", 0);printk("get gpios success!\r\n");/* 2. 复位gt911 申请GPIO并复位 */ret = gt911_ts_reset(client, &gt911);if(ret < 0){printk("gt911 reset failed!\r\n");goto fail;}/* 3. 初始化gt911 */gt911_write_reg(&gt911, GT_CTRL_REG, 2);  /* 软复位 */mdelay(100);gt911_write_reg(&gt911, GT_CTRL_REG, 0);  /* 停止软复位 */mdelay(100);/* 4. input 注册设备*/gt911.input  = devm_input_allocate_device(&client->dev);if(!gt911.input){return -ENOMEM;}/* 初始化input */gt911.input->name = client->name;gt911.input->id.bustype = BUS_I2C;gt911.input->dev.parent = &client->dev;/* 设置input设备需要上报事件类型和按键值*/__set_bit(EV_KEY, gt911.input->evbit);__set_bit(EV_ABS, gt911.input->evbit);__set_bit(BTN_TOUCH, gt911.input->keybit);/* 设置input设备 需要上报的绝对坐标 */input_set_abs_params(gt911.input, ABS_X, 0, 800, 0, 0);input_set_abs_params(gt911.input, ABS_Y, 0, 480, 0, 0);input_set_abs_params(gt911.input, ABS_MT_POSITION_X,0, 800, 0, 0);input_set_abs_params(gt911.input, ABS_MT_POSITION_Y,0, 480, 0, 0);	     /* 初始化多点电容触摸的slots*/ret = input_mt_init_slots(gt911.input, MAX_SUPPORT_POINTS, 0);  // 初始化 MT 的输入 slots  触摸点的数量if(ret != 0){printk("MT init failed!\r\n");goto fail;}/* 注册input */ret = input_register_device(gt911.input);if(ret){printk("input register failed!\r\n");goto fail;}/* 最后初始化中断 */ret = gt911_ts_irq(client, &gt911);if(ret < 0){printk("init irq failed!\r\n");goto fail;}return 0;fail:return ret;
}/* i2c驱动后的remove函数 */
int gt911_remove(struct i2c_client *client)
{/* 释放输入设备 */input_unregister_device(gt911.input);printk("gt911 drive unregsister ok !\r\n");return 0;
}/* 传统匹配方式ID列表 */
static const struct i2c_device_id gt911_id[] = {{"goodix,gt911", 0},{}
};
/* 匹配列表 */
static const struct of_device_id gt911_of_match[] = {{.compatible = "goodix,gt911"},{/* Sentinel */}
};/* i2c驱动结构体 */
struct i2c_driver gt911_i2c_driver = {.driver = {.owner = THIS_MODULE,.name = "gt911",   /* 驱动名字 用于和设备匹配  适用于没有设备树的情况*/.of_match_table =gt911_of_match,  /* 设备树匹配列表 */},.probe =gt911_probe,.remove =gt911_remove,.id_table = gt911_id, /* id配置列表 */
};module_i2c_driver(gt911_i2c_driver);/* LICENSE 和 AUTHOR 信息*/
MODULE_LICENSE("GPL");
MODULE_AUTHOR("luatao");

三、运行测试

这里讲一下调试过程中遇到的问题:
如果在设备树中不注释掉

/*pinctrl-0 = <&ts_reset_pin>; 				*/	

那么加载之后会报下面的错误
在这里插入图片描述
这里也就是说这个PB3引脚已经被注册过,但是我查找了设备树也没找到在哪里注册的(目前也不知道),把这个注释掉就可以了。

加载运行
在这里插入图片描述
加载过后,手指按压屏幕会打印坐标信息。

四、编译进内核

1. 拷贝文件

将gt911.c拷贝drivers/input/touchscreen 目录下

cp gt911.c /home/luatao/linux/zero/linux-zero-5.2.y/drivers/input/touchscreen/

2. 修改对应的 Makefile

修改 drivers/input/touchscreen 目录下的 Makefile,在最下面添加下面一行:

obj-y += gt911.o

在这里插入图片描述

3. 编译运行

修改完成以后重新编译 linux 内核,然后用新的 zImage 启动开发板。
在这里插入图片描述
如果驱动添加成功的话系统启动的时候就会输出如图

在这里插入图片描述

4.测试

当我们点击屏幕的时候,会打印
在这里插入图片描述
到这就说明驱动没有问题了。

1.注释掉坐标信息

但是这个每次按下都会打印坐标在操作的时候不好应用,我们需要在驱动中注释掉,
在kernel中打开gt911.c文件
在这里插入图片描述
注释掉上面红框的信息,然后编译内核下载开发板就ok了。

五、移植tslib

1. buildroot配置tslib

执行make menuconfig

Target packages —>
Graphic libraries and applications (graphic/text) —>
[] Qt5 —>
[] Enable Tslib support

在这里插入图片描述
在这里插入图片描述

然后保存退出,编译,下载开发板

2. 配置tslib

buildroot 配置中tslib使能后,在 /etc/profile中加入以下内容。

export T_ROOT=/usr/tslib4arm
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts/
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0

在这里插入图片描述
使能生效

source /etc/profile

3. 测试

输入

ts_test_mt

此命令会打开一个触摸测试界面
在这里插入图片描述
在图上有三个按钮“Drag”、“Draw”和“Quit”,这三个按钮的功能如下:

Drag: :拖拽按钮,默认就是此功能,大家可以看到屏幕中间有一个十字光标,我们可以通过触摸屏幕来拖拽此光标。一个触摸点一个十字光标,对于 5 点电容触摸屏,如果 5 个手指都放到屏幕上,那么就有 5 个光标,一个手指一个。
Draw: :绘制按钮,按下此按钮我们就可以在屏幕上进行简单的绘制,可以通过此功能检测多点触摸工作是否正常。
Quit :退出按钮,退出 ts_test_mt 测试软件。

我们可以自行测试、


http://chatgpt.dhexx.cn/article/HbHCufbu.shtml

相关文章

gt911多点触摸实验

文章目录 一、设备树二、驱动程序三、测试四、编译进内核1. 拷贝文件2. 修改对应的 Makefile3. 编译运行4.测试 一、设备树 记得注释掉共用的引脚&#xff08;有好几处&#xff09; 在pinctrl_tsc节点下添加&#xff1a; pinctrl_tsc: tscgrp {fsl,pins <MX6UL_PAD_GPIO1_…

野火STM32F103驱动GT911触摸芯片

GT911触摸芯片 芯片介绍 GT911 是专为 7”~8”设计的新一代 5 点电容触控方案&#xff0c;拥有 26 个驱动通道和 14 个感 应通道&#xff0c;以满足更高的 touch 精度要求。 GT911 可同时识别 5 个触摸点位的实时准确位置&#xff0c;移动轨迹及触摸面积。并可根据主控需要&…

电容触摸屏控制芯片GT911

1.接口说明 GT9 非单层多点系列&#xff08;以下简称 GT9 系列&#xff09; 与主机接口共有 6 PIN&#xff0c;分别为&#xff1a; VDD、 GND、 SCL、SDA、 INT、 RESET。 主控的 INT 口线需具有上升沿或下降沿中断触发功能&#xff0c;并且当其在输入态时&#xff0c; 主控端必…

电容触摸屏GT911、GT928、GT9147的使用

一、介绍与硬件连接 GT911、GT928、GT9147都属于GT9系列非单层多点触控芯片&#xff0c;他们支持的触控点数不同&#xff08;GT928支持10个点、GT911支持5个点&#xff09;、驱动和感应通道也可能不同。可是他们的寄存器和IIC通讯时序是相同的&#xff0c;也就是说驱动程序是兼…

29-2-电容触摸屏控制芯片GT911

1.接口说明 GT9 非单层多点系列&#xff08;以下简称 GT9 系列&#xff09; 与主机接口共有 6 PIN&#xff0c;分别为&#xff1a; VDD、 GND、 SCL、SDA、 INT、 RESET。 主控的 INT 口线需具有上升沿或下降沿中断触发功能&#xff0c;并且当其在输入态时&#xff0c; 主控端…

hal编程 gt911 触摸芯片驱动 ( 枚举 结构体 熟用)( 安富莱 f429 4.3寸电容屏 )

使用板子类型以及屏幕类型 本文使用的是安富莱的板子stm32f429, 屏幕是TR433C1的4.3寸TFT显示屏, 480*272 RGB接口, 电容触摸 . I2C I2C简介、原理、时序请看这篇文章 使用cubemx工具的stm32用AT24C02实现简单密码(一点点面向对象的思想编程) gt911 gt911简介 gt911是深圳市…

python 倒计时手机app打卡_python 实现倒计时功能(gui界面)

运行效果&#xff1a; 完整源码&#xff1a; ##import library from tkinter import * import time from playsound import playsound ## display window root tk() root.geometry(400x300) root.resizable(0,0) root.config(bg blanched almond) root.title(techvidvan - cou…

桌面美化 Python tkinter倒计时工具

桌面美化 Python tkinter倒计时工具 效果一、壁纸设计二、倒计时小工具实现1.引入库2.倒计时函数3.绘制UI载入数据以及创建窗口创建Label控件控件布局绘制分割线绘制子窗口&#xff0c;用于修改倒计时目标其它设置 完整代码打包并开机自启动打包成EXE开机自启动 效果 使用tkin…

Python 内置模块tkinter —— 秒表计时器

# 秒表计时器""" 思考&#xff1a;1、怎么创建一个最简单的窗口&#xff1f;2、怎么保持窗口一直运行&#xff1f;3、不用方法mainloop&#xff08;&#xff09;怎么实现窗口一直运行&#xff1f;4、请问窗口的宽度*高度默认值为多少个像素点&#xff1f;5、利用…

Python-桌面计时器程序设计

该程序是我个人去年学习之初练习设计&#xff0c;程序功能并没有很完善和简便。设计想法是为了能够有一个可观性高的时间报时器&#xff0c;程序设计耗时2天&#xff0c;程序分成三个部分&#xff1a;主窗体、设置窗口、运行程序。 效果展示图 功能 正/反计时功能 到时提醒/关…

专利的写作

关于专利&#xff0c;由于是研究生阶段&#xff0c;发表专利有和学校合作的机构&#xff0c;支付2000给代理人&#xff0c;只需要将想法写明白&#xff0c;和代理人沟通好&#xff0c;受理那必然是有手就行。关于研究点&#xff0c;我已经推导完毕两个月了&#xff0c;因为要做…

手把手教你如何写专利申请书

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。众所周知&#xff0c;专利是最重要的一种知识产权&#xff0c;专利制度有利于保护技术创新&#xff0c;保护专利权人的利益&#xff0c;促进社会发展&#xff0c;把我国建设成一个科技强国&#xff0c;创新大国。对于企业而…

实用新型专利撰写

文件下载 表格可在国家知识产权网下载 直达地址 说明书摘要 1、文件写法 本实用新型公开了&#xff0c;其特征在于&#xff1a;______。主要组成部分&#xff1b;主要组成部分又由哪些部分组成&#xff1b;并说明位置关系&#xff08;位于xxx一侧&#xff0c;位于顶角处…&…

专利写法与相关知识

原文&#xff1a;https://www.cnblogs.com/bozhicheng/p/7204693.html by 薄小成 https://www.jianshu.com/p/4f48add262c1 这也是一个比较好的链接 从你幸运的进入大棚124实验室那刻起&#xff0c;发论文和写专利将贯穿你整个研究生生涯。相比于发论文&#xff0c;写专利这项工…

【数据库】简介

目录 0. 文章脉络 1. 信息和数据 2. 数据处理 3. 数据库管理数据的特点 4. 数据库系统 5. 数据库管理系统 6. 数据库的三级模式 0. 文章脉络 1. 信息和数据 信息是生活中能获取的一切事物的相关描述。用书上的话来说&#xff0c;信息就是一切新的&#xff0c;有用的事实…

数据库介绍之MySQL

文章目录 数据库优点分类常见数据库RDBMSSQL定义分类sql 脚本sql 语句规范 CRUD MySQL启动连接修改密码忘记密码三层结构结构表 三范式关系数据库设计三范式经典设计多对多一对多一对一 数据库 用来存储和管理数据的仓库 优点 可存储大量数据&#xff0c;方便检索保持数据的…

Cassandra数据库介绍

Cassandra 数据库&#xff0c;值得介绍的技术细节其实挺多的。因为它很多实现思路和关系型数据库或者其他的 NoSQL 数据库&#xff0c;是有一些不同的。这种不同是在数据库设计实现思路上也是根源上的。所以衍生开来的诸多特点&#xff0c;在介绍起来就不太容易和其他数据库去类…

MySQL入门之数据库介绍及MySQL介绍

------------------------------------------------------------------------------------------------------------- 教程大纲: http://blog.csdn.net/qq78442761/article/details/76018310 ------------------------------------------------------------------------------…

数据库概述与常见数据库介绍

前言 本栏目会从数据库概念开始到数据库的SQL优化持续更新&#xff08;站在Java开发的角度&#xff0c;不站在数据库管理员&#xff08;DBA&#xff09;角度&#xff09;&#xff0c;本篇是第一篇《数据库常用概念》以开启我的数据库之旅&#xff0c;主要是讲述MySQL 8.0数据库…

ORACLE数据库介绍

什么是 ORACLE? ORACLE数据库系统是美国ORACLE公(甲骨文)提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。 ORACLE通常应用于大型系统的数据库产品。 ORACLE数据库是目前世界上使用最为广泛的数…