Arduino 项目笔记 |TH1621 LCD液晶显示屏驱动(SSOP-24封装)

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


LCD液晶屏资料

LCD液晶屏资料

在这里插入图片描述

重要参数:

  • 工作电压: 3V
  • 可视角度:120°
  • 1/4 ,1/3

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


TH1621 驱动

HT1621 LCD控制驱动芯片介绍

VLCD 和 VCC 电压符合规格书,最好都取3.3V 。电压太高或太低都会出现段码液晶屏乱码的情况,要么多一笔,要么若隐若现的显示一笔。

在这里插入图片描述

TH1621.h

/*******************************************************************************
Copyright 2016-2018 anxzhu (github.com/anxzhu)
Copyright 2018-2020 Valerio Nappi (github.com/valerionew) (changes)
Based on segment-lcd-with-ht1621 from anxzhu (2016-2018)
(https://github.com/anxzhu/segment-lcd-with-ht1621)

Partially rewritten and extended by Valerio Nappi (github.com/valerionew) in 2018

This file is part of the HT1621 arduino library, and thus under the MIT license.
More info on the project and the license conditions on :
https://github.com/valerionew/ht1621-7-seg

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

*******************************************************************************/

#ifndef HT1621_H_
#define HT1621_H_   //防止重复包含

const unsigned char  LCDCODE[11]={0xFA,0x0A,0xBC,0x9E,0x4E,0xD6,0xF6,0x8A,0xFE,0xDE,0x00};  // LCDCODE[10] = 0x00  不显示任何东西


#define  BIAS     0x52             //0b1000 0101 0010  1/3duty 4com
#define  SYSDIS   0X00             //0b1000 0000 0000  关振系统荡器和LCD偏压发生器
#define  SYSEN    0X02             //0b1000 0000 0010 打开系统振荡器
#define  LCDOFF   0X04             //0b1000 0000 0100  关LCD偏压
#define  LCDON    0X06             //0b1000 0000 0110  打开LCD偏压
#define  XTAL     0x28             //0b1000 0010 1000 外部接时钟
#define  RC256    0X30             //0b1000 0011 0000  内部时钟
#define  TONEON   0X12             //0b1000 0001 0010  打开声音输出
#define  TONEOFF  0X10             //0b1000 0001 0000 关闭声音输出
#define  WDTDIS1  0X0A             //0b1000 0000 1010  禁止看门狗
#define  BUFFERSIZE 12

// #define HT1621_DEBUG


class  HT1621
{
public:
	HT1621();
	void begin(int cs_p, int wr_p, int data_p, int backlight_p);
	void begin(int cs_p, int wr_p, int data_p);
	void clear();
	void backlight();
	void noBacklight();
	void setBatteryLevel(int level,unsigned char *s);
	void print(long num, const char* flags="%6li", int precision = 0);
	void print(double num, int precision = 3);
	void printCelsius(double num); // precision is always 1
	void print(const char* str, bool leftPadded = false);
	void display();
	void noDisplay();
private:
	int _cs_p;
	int _wr_p;
	int _data_p;
	int _backlight_p;
	bool _backlight_en;
	char _buffer[BUFFERSIZE];
	unsigned char _battery[3];
	void wrone(unsigned char addr, unsigned char sdata);
	void wrclrdata(unsigned char addr, unsigned char sdata);
	void wrCLR(unsigned char len);
	void wrDATA(unsigned char data, unsigned char cnt);
	void wrCMD(unsigned char CMD);
	void setdecimalseparator(int dpposition);
	void config(); // legacy: why not in begin func
	void update();
	char charToSegBits(char character);
};
#endif

HT1621.cpp

/*******************************************************************************
Copyright 2016-2018 anxzhu (github.com/anxzhu)
Copyright 2018-2020 Valerio Nappi (github.com/5N44P) (changes)
Based on segment-lcd-with-ht1621 from anxzhu (2016-2018)
(https://github.com/anxzhu/segment-lcd-with-ht1621)

Partially rewritten and extended by Valerio Nappi (github.com/5N44P) in 2018

This file is part of the HT1621 arduino library, and thus under the MIT license.
More info on the project and the license conditions on :
https://github.com/5N44P/ht1621-7-seg

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

*******************************************************************************/

#include <Arduino.h>
#include "HT1621.h"

HT1621::HT1621(){
	_buffer[0] = 0x00;
	_buffer[1] = 0x00;
	_buffer[2] = 0x00;
	_buffer[3] = 0x00;
	_buffer[4] = 0x00;
	_buffer[5] = 0x00;
	_buffer[6] = 0x00;
}

void HT1621::begin(int cs_p, int wr_p, int data_p, int backlight_p)
{
	pinMode(cs_p, OUTPUT);
	pinMode(wr_p, OUTPUT);
	pinMode(data_p, OUTPUT);
	pinMode(backlight_p, OUTPUT);
	_cs_p=cs_p;
	_wr_p=wr_p;
	_data_p=data_p;
	_backlight_p=backlight_p;
	_backlight_en=true;
	config();
}

void HT1621::begin(int cs_p, int wr_p, int data_p)
{
	pinMode(cs_p, OUTPUT);
	pinMode(wr_p, OUTPUT);
	pinMode(data_p, OUTPUT);
	_cs_p=cs_p;
	_wr_p=wr_p;
	_data_p=data_p;
	_backlight_en = false;
	config();
}

void HT1621::wrDATA(unsigned char data, unsigned char cnt) {
	unsigned char i;
	for (i = 0; i < cnt; i++) {
		digitalWrite(_wr_p, LOW);
		delayMicroseconds(4);
		if (data & 0x80) {
			digitalWrite(_data_p, HIGH);
		}
		else {
			digitalWrite(_data_p, LOW);
		}
		digitalWrite(_wr_p, HIGH);
		delayMicroseconds(4);
		data <<= 1;
	}
}
void HT1621::wrclrdata(unsigned char addr, unsigned char sdata)
{
	addr+=9;
	addr <<= 2;
	digitalWrite(_cs_p, LOW);
	wrDATA(0xa0, 3);
	wrDATA(addr, 6);
	wrDATA(sdata, 8);
	digitalWrite(_cs_p, HIGH);
}

void HT1621::display()
{
	wrCMD(LCDON);
}

void HT1621::noDisplay()
{
	wrCMD(LCDOFF);
}

// 写数据到RAM命令格式为:101+6位RAM地址+4位数据,其中RAM地址为SEG序号 (参考:https://blog.csdn.net/qq_36347513/article/details/107330387)
// 
void HT1621::wrone(unsigned char addr, unsigned char sdata)// 101 数据模式  读写之间变换
{
	addr+=9;// HT1621 SSOP-24 芯片的SEG脚从SEG9开始的 ,所以addr+9;
	addr <<= 2;
	digitalWrite(_cs_p, LOW);
	wrDATA(0xa0, 3);// 101 
	wrDATA(addr, 6);
	wrDATA(sdata, 8);   // 0XF7  "8"  
	digitalWrite(_cs_p, HIGH);
}

// void HT1621::update(){
	 the buffer is backwards with respect to the lcd. could be improved
	// wrone(0, _buffer[5]);
	// wrone(2, _buffer[4]);
	// wrone(4, _buffer[3]);
	// wrone(6, _buffer[2]);
	// wrone(8, _buffer[1]);
	// wrone(10,_buffer[0]);
// }
void HT1621::backlight()
{
	if (_backlight_en)
		digitalWrite(_backlight_p, HIGH);
	delay(1);
}

void HT1621::noBacklight()
{
	if(_backlight_en)
		digitalWrite(_backlight_p, LOW);
	delay(1);
}

void HT1621::wrCMD(unsigned char CMD) {  //100 命令模式
	digitalWrite(_cs_p, LOW);
	wrDATA(0x80, 4);
	wrDATA(CMD, 8);
	digitalWrite(_cs_p, HIGH);
}

void HT1621::config()
{
	wrCMD(BIAS);
	wrCMD(RC256);
	wrCMD(SYSDIS);
	wrCMD(WDTDIS1);
	wrCMD(SYSEN);
	wrCMD(LCDON);
}

// #define  BIAS     0x52             //0b1000 0101 0010  1/3duty 4com  
/*
1000 010abXcX 
c=0:1/2 偏置
c=1:1/3 偏置
ab=00:2 COMS
ab=01:3 COMS
ab=10:4 COMS
*/
// #define  SYSDIS   0X00             //0b1000 0000 0000  关振系统荡器和LCD偏压发生器
// #define  SYSEN    0X02             //0b1000 0000 0010 打开系统振荡器
// #define  LCDOFF   0X04             //0b1000 0000 0100  关LCD偏压
// #define  LCDON    0X06             //0b1000 0000 0110  打开LCD偏压
// #define  XTAL     0x28             //0b1000 0010 1000 外部接时钟
// #define  RC256    0X30             //0b1000 0011 0000  内部时钟
// #define  TONEON   0X12             //0b1000 0001 0010  打开声音输出
// #define  TONEOFF  0X10             //0b1000 0001 0000 关闭声音输出
// #define  WDTDIS1  0X0A             //0b1000 0000 1010  禁止看门狗

void HT1621::wrCLR(unsigned char len) {
	unsigned char addr = 0;
	unsigned char i;
	for (i = 0; i < len; i++) {
		wrclrdata(addr, 0x00);
		addr = addr + 2;
	}
}

void HT1621::setBatteryLevel(int level,unsigned char *s) {
	// zero out the previous (otherwise the or couldn't be possible)
	// _buffer[0] &= 0x7F;
	// _buffer[1] &= 0x7F;
	// _buffer[2] &= 0x7F;
	unsigned char i;
	for(i=0;i<6;i++)
	{
		_buffer[i] &= 0x00;
	}



	switch(level){
		case 3: // battery on and all 3 segments
			// _buffer[0] |= 0x80;
			// _buffer[0] |= 0xFE;
			_buffer[0] |= LCDCODE[s[0]];
			_buffer[1] |= LCDCODE[s[1]];
			_buffer[2] |= LCDCODE[s[2]];
			_buffer[3] |= LCDCODE[s[3]];
			_buffer[4] |= LCDCODE[s[4]];
			// _buffer[5] |= 0xFE;
			// _buffer[6] |= 0xEF;




			
		case 2: // battery on and 2 segments
			// _buffer[1] |= 0x80;
		case 1: // battery on and 1 segment
			// _buffer[2] |= 0x80;
		case 0: // battery indication off
		default:
			break;
	}

	update();
}

void HT1621::clear(){
	wrCLR(16);
	// wrCLR(31);
}

// takes the buffer and puts it straight into the driver
void HT1621::update(){
	// the buffer is backwards with respect to the lcd. could be improved
	// wrone(0, _buffer[5]);
	wrone(0, _buffer[0]);
	wrone(2, _buffer[1]);
	wrone(4, _buffer[2]);
	wrone(6, _buffer[3]);
	wrone(8, _buffer[4]);
	// wrone(10, _buffer[5]);
	// wrone(12, _buffer[6]);

	
	// wrone(0, _buffer[5]);
	// wrone(2, _buffer[4]);
	// wrone(4, _buffer[3]);
	// wrone(6, _buffer[2]);
	// wrone(8, _buffer[1]);
	// wrone(10,_buffer[0]);
}

void HT1621::print(long num, const char* flags, int precision){
	if(num > 999999) // basic checks
		num = 999999; // clip into 999999
	if(num < -99999) // basic checks
		num = -99999; // clip into -99999

	char localbuffer[7]; //buffer to work within the function
	snprintf(localbuffer, 7, flags, num); // convert the decimal into string
	#ifdef _HTDEBUG
		Serial.begin(9600);
		Serial.print(localbuffer);
		Serial.print("\t");
	#endif

	// horrible handling but should get us working. needs refactor in next major
	if (precision > 0 && (num) < pow(10, precision)) {
		// we remove extra leading zeros
		for (int i = 0; i < (5 - precision); i++) {
			#ifdef _HTDEBUG
				Serial.print(localbuffer[1]);
			#endif // _HTDEBUG
			if(localbuffer[i+1] == '0' && localbuffer[i] != '-'){ // we remove only if there is another zero ahead AND if it's not a minus sign
				localbuffer[i] = ' ';
			}
			else{
				break;
			} 
			#ifdef _HTDEBUG
				Serial.println();buffer[1]);
			#endif // _HTDEBUG
	}
	}


	for(int i=0; i<6; i++){
		_buffer[i] &= 0x80; // mask the first bit, used by batter and decimal point
		_buffer[i] |= charToSegBits(localbuffer[i]);
	}
	update();
}

void HT1621::print(double num, int precision){
	if(num > 999999) // basic checks
		num = 999999; // clip into 999999
	if(num < -99999) // basic checks
		num = -99999; // clip into -99999

	if(precision > 3 && num > 0)
		precision = 3; // if positive max precision allowed = 3
	else if(precision > 2 && num < 0)
		precision = 2;// if negative max precision allowed = 2
	if(precision < 0)
		precision = 0; // negative precision?!

	const char* flags = (precision > 0 && abs(num) < 1) ? "%06li" : "%6li";

	long integerpart;
	integerpart = ((long)(num*pow(10,precision)));

	print(integerpart, flags, precision); // draw the integerized number
	setdecimalseparator(precision); // draw the decimal point

	update();
}


void HT1621::printCelsius(double num){
	if(num > 9999) // basic checks
		num = 9999; // clip into 999999
	if(num < -999) // basic checks
		num = -999; // clip into -99999

	int precision;
	
	if(num <= -100 || num >= 999)
		precision = 0;	// if negative max precision allowed = 0
	else 
		precision = 1;	// if positive max precision allowed = 1

	const char* flags = (precision > 0 && abs(num) < 1) ? "%04li*C" : "%4li*C";

	long integerpart;
	integerpart = ((long)(num*pow(10,precision)));


	print(integerpart, flags, precision); // draw the integerized number
	if(precision > 0)
		setdecimalseparator(precision+2); // draw the decimal point shifted by 2
	else 	
		setdecimalseparator(0); // or clear the decimal separator

	update();
}

void HT1621::print(const char* str, bool leftPadded){
	int chars = strlen(str);
	int padding = 6 - chars;

	for(int i = 0; i < 6; i++){
		_buffer[i] &= 0x80; // mask the first bit, used by batter and decimal point
		char character = leftPadded
				 		 ? i < padding ? ' ' : str[i - padding]
				 		 : i >= chars ? ' ' : str[i];
		_buffer[i] |= charToSegBits(character);
	}

	setdecimalseparator(0); // Hide decimal point
	update();
}

void HT1621::setdecimalseparator(int decimaldigits) {
	// zero out the eight bit
	_buffer[3] &= 0x7F;
	_buffer[4] &= 0x7F;
	_buffer[5] &= 0x7F;

	if( decimaldigits <= 0 || decimaldigits > 3){
		return;
	}

	// 3 is the digit offset
	// the first three eights bits in the buffer are for the battery signs
	// the last three are for the decimal point
	_buffer[6-decimaldigits] |= 0x80;
}

char HT1621::charToSegBits(char character) {
	switch (character) {
	case '*': // For degree for now
		return 0b0110011;
	case '|':
		return 0b0000101;
	case '-':
		return 0b0000010;
	case '_':
		return 0b0001000;
	case '0':
		return 0b1111101;
	case '1':
		return 0b1100000;
	case '2':
		return 0b111110;
	case '3':
		return 0b1111010;
	case '4':
		return 0b1100011;
	case '5':
		return 0b1011011;
	case '6':
		return 0b1011111;
	case '7':
		return 0b1110000;
	case '8':
		return 0b1111111;
	case '9':
		return 0b1111011;
	case 'A':
	case 'a':
		return 0b1110111;
	case 'b':
	case 'B':
		return 0b1001111;
	case 'c':
	//	return 0b0001110;
	case 'C':
		return 0b0011101;
	case 'd':
	case 'D':
		return 0b1101110;
	case 'e':
	//	return 0b0001110;
	case 'E':
		return 0b0011111;
	case 'f':
	//	return 0b0000111;
	case 'F':
		return 0b0010111;
	case 'G':
	case 'g':
		return 0b1011101;
	case 'h':
	//	return 0b1000111;
	case 'H':
		return 0b1100111;
	case 'i':
	//	return 0b1000000;
	case 'I':
		return 0b1100000;
	case 'J':
	case 'j':
		return 0b1101000;
	case 'l':
	//	return 0b1100000;
	case 'L':
		return 0b0001101;
	case 'm':
	case 'M':
		return 0b1010100;
	case 'n':
	case 'N':
		return 0b1000110;
	case 'O': // we can keep this for zero
	//	return 0b1111101;
	case 'o':
		return 0b1001110;
	case 'P':
	case 'p':
		return 0b0110111;
	case 'q':
	case 'Q':
		return 0b1110011;
	case 'r':
	case 'R':
		return 0b0000110;
	case 'S':
	case 's':
		return 0b1011011;
	case 't':
	case 'T':
		return 0b0001111;
	case 'u':
	//	return 0b1001100;
	case 'U':
		return 0b1101101;
	case 'Y':
	case 'y':
		return 0b1101011;
	case 'z':
	case 'Z':
		return 0b0111110;
	case ' ':
	default:
		return 0b0000000;
	}
}

Battery_levels.ino

/*
  Battery Levels

  Displays the various battery levels with 500ms
  pause between.

  The circuit:
  cs to pin 13
  wr to pin 12
  Data to pin 8
  backlight to pin 10

  Created 9 dec 2018
  By valerio\new (5N44P)

  https://github.com/valerionew/ht1621-7-seg

*/

#include <HT1621.h> // include our library


HT1621 lcd; // create an "lcd" object

unsigned char LCD_tmp[5];

void setup(){
  // start the lcd:
  // cs to pin 13
  // wr to pin 12
  // Data to pin 8
  // backlight to pin 10
  // you can chose whichever pin you want


  lcd.begin(13, 12, 8, 10); // (cs, wr, Data, backlight)
  // if no backlight control is given, you can also use:
  // lcd.begin(13, 12, 8); // (cs, wr, Data)

  lcd.backlight(); // turn on the backlight led

  lcd.clear(); // clear the screen
}

void loop(){
  static unsigned int num = 0;
  num++;

  LCD_tmp[0] = num/10000%10; // 万位:第1位显示的内容(左->右)
  LCD_tmp[1] = num/1000%10;       // 千位
  LCD_tmp[2] = num/100%10;       // 百位
  LCD_tmp[3] = num/10%10; // 十位
  LCD_tmp[4] = num%10; // 个位
  if(num >= 100000){num = 0;}
    //设置四前面千/百/十位不要显示0
    if(LCD_tmp[0] <= 0 && num < 10000){LCD_tmp[0]=10;} 
    if(LCD_tmp[1] <= 0 && num < 1000){LCD_tmp[1]=10;} // CODE[10] 是 0X00 不显示
    if(LCD_tmp[2] <= 0 && num < 100){LCD_tmp[2]=10;}
    if(LCD_tmp[3] <= 0 && num < 10){LCD_tmp[3]=10;}
  
  lcd.setBatteryLevel(3,LCD_tmp);
  delay(100);

  
  lcd.setBatteryLevel(2);
//  delay(500);
//  lcd.setBatteryLevel(3);
//  delay(500);
}

成果展示

“Arduino UNO TH1621 LCD成果展示”



资料下载

  • 【CSDN】汇总:TH1621 LCD开发资料(20240406)

参考资料

  • [1] 【Github】ht1621-7-seg (forked from anxzhu/segment-lcd-with-ht1621)
  • [2] 【CSDN@weiDev101】LCD Glass段码屏的驱动
  • [3] 【CSDN】STM32F103学习笔记(4)——LCD段码屏HT1621使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/537818.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题---OJ题: 相交链表

片头 嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题---相交链表,准备好了吗? Ready Go! ! ! emmm,看这道题好像不怎么难,我们一起画图分析分析 上图中,A链表有5个结点,分别为 a1,a2,c1,c2,c3 ; B链表有6个结点,分别为 b1,b2,b3,c1,c2,c3 ; A链表和B链表在c1结点相交 …

(Java)数据结构——图(第六节)Dijkstra实现单源最短路径

前言 本博客是博主用于复习数据结构以及算法的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 Dijkstra算法&#xff08;Dijkstra的实现原理&#xff09; 迪杰斯特拉算法的实现&#xff0c;很像Prim&#xff0c;基本原理是&#xff1a; 我先找到距离集合路径…

java:字符集和字符流

字符集 规定了字符和二进制之间对应关系的一张表 字节是计算机最基本的存储单位 字符则是通过字符组成和编码而成的文本 常见字符集 1,ASCII字符集 基础字符编码标准,包含128个字符,只包括英文字母,数字和一些常见的符号 一个字节表示一个字符 所有的字符集均兼容ASCII…

Oracle 正则表达式

一、Oracle 正则表达式相关函数 (1) regexp_like &#xff1a;同 like 功能相似&#xff08;模糊 匹配&#xff09; (2) regexp_instr &#xff1a;同 instr 功能相似&#xff08;返回字符所在 下标&#xff09; (3) regexp_substr &#xff1a; 同 substr 功能相似&…

七项上榜!通付盾十一度荣登安全牛《中国网络安全行业全景图》

2024年4月12日&#xff0c;安全牛第十一版《中国网络安全行业全景图》&#xff08;以下简称“全景图”&#xff09;正式发布。通付盾凭借领先的技术实力与优秀的市场表现&#xff0c;成功入选身份与访问安全、应用与业务安全、移动安全、安全支撑技术与体系四大安全领域。 身份…

宝塔面板部署腾讯云的域名

一、腾讯云&#xff0c;搜索我的证书&#xff0c;点击打开如图所示&#xff0c;点击下砸 二、点击宝塔的证书&#xff0c;然后下载到桌面 三、解压 四、打开宝塔&#xff0c;网站》自己的项目列表中要绑定的ssl 五、对应的文件内容复制进去&#xff0c;保存并启用证书 六、有了…

基于SSM校园招聘信息管理系统的设计与实现说明(内附设计LW + PPT+ 源码下载)

摘 要 随着我国近年来高校不断的进行扩招&#xff0c;2022年全国高校的毕业生人数已经超过一千万人&#xff0c;而在这个时代的大学生早已不像上世纪八九十年代一样&#xff0c;毕业就可以分配工作&#xff0c;所以在当今这个时代毕业生找工作是个非常困难的事情。再加上近几…

[管理者与领导者-158] :团队管理 - 高效执行力 -1- 总体架构、策略、方法、情与法

目录 一、总体架构 二、管理者目标&#xff1a;管理者通过团队获得结果 2.1 考核目标 2.2 高效执行力的指标&#xff1a;时间、成本、质量、数量、满意度 三、管理者的管理策略&#xff1a;结果&#xff08;头与尾&#xff09; VS 过程 四、管理手段和方法 五、关于情与…

TinyEMU源码分析之中断处理

TinyEMU源码分析之中断处理 1 触发中断2 查询中断2.1 查询中断使能与pending状态&#xff08;mie和mip&#xff09;2.2 查询中断总开关与委托&#xff08;mstatus和mideleg&#xff09;2.2.1 M模式2.2.2 S模式2.2.3 U模式 3 处理中断3.1 获取中断编号3.2 检查委托3.3 进入中断3…

【教程】7代核显直通HDMI成功输出 PVE下玩AIO最有性价比的机器

大家好&#xff0c;我是村雨Mura&#xff0c;好久没写教程了&#xff0c;本期是7代核显直通&#xff0c;重点在于HDMI输出画面 本教程理论上适用于4代以后intel带核显CPU&#xff0c;如果你有直通成功经验欢迎评论区分享 前面有点啰嗦&#xff0c;想直接看教程&#xff0c;直…

【每日练习】二叉树

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;二叉树 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 文章目录 一、100. 相同的树1. 题目简介2.…

Go语言中channel和互斥锁的应用场景

面对一个并发问题,我们的解决方案是使用channel还是互斥锁来实现并不总是很清晰。因为Go提倡使用通信来共享内存,所以一个常见的错误就是总是强制使用channel,不管实际情况如何。但是我们应该把这两种选择作为互补手段。 首先,简单回顾一下Go语言中的channel:channel是一种交…

同步检查继电器DT-13/200额定电压100V柜内安装板前接线JOSEF约瑟

系列型号 DT-13/200同步检查继电器; DT-13/160同步检查继电器; DT-13/130同步检查继电器; DT-13/120同步检查继电器; DT-13/90同步检查继电器; DT-13/254同步检查继电器; 同步检查继电器DT-13/200 用途 DT-13型同步检查继电器用于两端供电线路的自动重合闸线路中&…

2024 年第十四届 Mathorcup 数学应用挑战赛题目C 题 物流网络分拣中心货量预测及人员排班完整思路以及源代码分享,仅供学习

电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同流向进行分拣并发往下一个场地&#xff0c;最终使包赛到达消费者手中。分拣中心管理效率的提升&#xff0c;对整…

物联网SaaS平台

在信息化、智能化浪潮席卷全球的今天&#xff0c;物联网SaaS平台作为推动工业数字化转型的重要工具&#xff0c;正日益受到广泛关注。那么&#xff0c;物联网SaaS平台究竟是什么&#xff1f;HiWoo Cloud作为物联网SaaS平台又有哪些独特优势&#xff1f;更重要的是&#xff0c;它…

使用unicloud-map 无法展示poi的天坑

天坑&#xff01;天坑&#xff01;天坑 使用unicloud-map的天坑 202404121722&#xff0c;昨天晚上发现uni-admin中导入了unicloud-map管理端之后在chrome浏览器由于地图定位失败&#xff0c;一直没有办法新增poi,不过后面发现safari浏览器是可以定位出来的&#xff0c;所以今…

上网行为管理软件怎么选择?哪个软件好?| 三款热门行为审计软件分享

上网行为监控系统是一种用于监控和管理互联网使用行为的系统。 这种系统主要用于企业和学校等机构&#xff0c;以控制和管理员工或学生在工作时间或学习时间内对互联网的使用。 而现在的企业越来越信息化&#xff0c;随之而来的信息危机也丛生不断&#xff0c;企业管理软件也…

VXWorks6.9 + Workbench3.3 Simulation 代码调试

VxWorks系列传送门 本章是基于前一篇《VXWorks6.9 Workbench3.3 开发环境部署》来进行讲解的&#xff0c;在上一篇我们创建了一个Hello World 的项目&#xff0c;并将编译后的可执行文件放到了VxWorks - FTP共享文件目录下&#xff0c;顺利的在VxWin 系统中跑起来。 本篇着重讲…

【学习】Spring IoCDI

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 Spring 是什么&#xff1f; 什么是 IoC容器&#xff1f; 传统开发模式 loC开发模式 IoC的优势 IoC 的使用 Bean的…

TMS320F280049 EPWM模块--ET子模块(7)

下图是ET子模块在EPWM中的位置。可以看到ET子模块相对较独立。接收多种信号&#xff0c;处理后传递给PIE和ADC。 下图是ET的内部框图&#xff0c;可以更具体的看到输入和输出信号。 ET内部也可以软件force产生事件信号。ET输出时可以做分频&#xff0c;也就是接收n次输入后才输…