51单片机1-6

目录

单片机介绍

点亮一个LED

流水灯参考代码

点亮流水LEDplus版本

独立按键

 独立按键控制LED亮灭

静态数码管

静态数码管显示

动态数码管显示

模块化编程

调试工具

矩阵键盘

矩阵键盘显示数据

矩阵键盘密码锁

学习B站江协科技课程笔记。

安装keil,下载大佬简介内的应用,注意注册机是keygen那个文件,解压前先关闭防火墙。

单片机介绍

单片机,Micro Controller Unit,简称MCU

内部集成了CPU、ARM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能

单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机、LED等)的控制

单片机跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但性能上,与计算机相差甚远,但单片机成本低,体积小,结构简单,在生活和工业控制领域大有所用

同时,学习使用单片机是了解计算机原理与结构的最佳选择

STC89C52单片机

所属系列:51单片机系列

公司:STC公司

位数:8位

RAM:512字节

ROM:8k(flash)

工作频率:12MHz(本开发板使用)

LED介绍

中文名:发光二极管

外文名:Light Emitting Diode

简称:LED

用途:照明、广告灯、指引灯、屏幕

keil中新建文件选择CPU:Atmel ->at89c52

本想使用proteus进行模拟实验,技术力不太足够。只好浅浅投资了

点亮一个LED

先进行编程

注意:P2 端口大写,为什么是P2

P21到P27都由P2.X进行控制,为什么亮的位置置零,设置低电平才会有电流流过,要用16进制数进行设置,0x...。烧录时注意单片机型号在上面有写,打开生成的.hex文件,点击下载/编程。然后重启单片机。右下角显示

keil编辑新项目:

1.创建项目

2.选择芯片类型

3.添加主函数

4.编入程序

延时函数:

void Delay500ms()        //@12.000MHz
{
    unsigned char i, j, k;

    _nop_();//¿ÕÓï¾ä
    i = 4;
    j = 205;
    k = 187;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

使其能够进行亮灭控制,注意加入 INTRINS.H   头函数,以及每写一句记得加 ; 

流水灯参考代码
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main(){
	
	while(1){
		P2 = 0xFE;//1111 1110
		Delay500ms();
		P2 = 0xFD;//1111 1101
		Delay500ms();
		P2 = 0xFB;//1111 1011
		Delay500ms();
		P2 = 0xF7;//1111 0111
		Delay500ms();
		P2 = 0xEF;//1110 1111
		Delay500ms();
		P2 = 0xDF;//1101 1111
		Delay500ms();
		P2 = 0xBF;//1011 1111
		Delay500ms();
		P2 = 0x7F;//0111 1111
		Delay500ms();
	}
}
点亮流水LEDplus版本
#include <REGX52.H>
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	while (xms) {
		unsigned char i, j;

		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms --;
	}
	
}

void main(){
	while(1){
		P2 = 0xFE;//1111 1110
		Delay1ms(500);
		P2 = 0xFD;//1111 1101
		Delay1ms(500);
		P2 = 0xFB;//1111 1011
		Delay1ms(500);
		P2 = 0xF7;//1111 0111
		Delay1ms(500);
		P2 = 0xEF;//1110 1111
		Delay1ms(500);
		P2 = 0xDF;//1101 1111
		Delay1ms(500);
		P2 = 0xBF;//1011 1111
		Delay1ms(500);
		P2 = 0x7F;//0111 1111
		Delay1ms(500);
	}
}

独立按键

 独立按键控制LED亮灭
#include <REGX52.H>
void main(){
	//P2 = 0xFE;//1111 1110操作八位寄存器给八位
	P2_0 = 0;//操作一位寄存器给一位赋值即可,控制其亮
	P2_0 = 1;//控制其灭
	while(1){
		if(P3_1 == 0){
			P2_0 = 0;
		}else{
			P2_0 = 1;
		}
	}
}

为什么是P3_1        

独立按键控制LED状态

#include <REGX52.H>
void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;

	while(xms){
		
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

void main(){

	while(1){
		//按下过后弹起才变化电平
		if(P3_1 == 0){//按下按键
			Delay(20);//除抖,这段时间都是低电平
			while(P3_1 == 0);//再次判断,这时是低电平,是否是持续按下的
			//如果是真的是就什么都不做。等待弹起
			Delay(20);//除抖,这段时间变为高电平
			//按下并弹起后引起灯灭灯亮
			P2_0 = ~P2_0;
		}
	}
}

独立按键控制二进制输出

#include <REGX52.H>

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;

	while(xms--){
		
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main(){
	unsigned char LEDNum = 0;
	while(1){
		if(P3_1 == 0){
			Delay(20);
			while(P3_1 == 0);
			Delay(20);
			
			LEDNum ++;//
			P2 = ~LEDNum;//按位取反
		}
	}
}

多个按键实现移位

#include <REGX52.H>

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;

	while(xms--){
		
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}
unsigned char LEDNum;
void main(){
	P2 =~0x01;
	
	while (1){
		if ( P3_1 == 0 ){
			Delay(20);
		while ( P3_1 == 0 )
		Delay(20);
		
		LEDNum ++ ;
		if( LEDNum >= 8 )
			LEDNum = 0;
		P2 = ~( 0x01 << LEDNum );
		}
		
		if ( P3_0 == 0 ){
			Delay(20);
		while ( P3_0 == 0 )
		Delay(20);
		
		if(LEDNum == 0){
			LEDNum = 7 ;
		
		}else{
			LEDNum --;
		}
		P2 = ~( 0x01 << LEDNum );
		}
	}

}

对固定值进行位移时,选择同一方向。

静态数码管

公用引脚

共阴极(上)与共阳极连接(下),想选中该数码管就要赋值0,反之1,共阴极要想亮就设置高电平(为公共的地方是接地的,需要高电平流过),共阳极要想亮就设置低电平(公共的地方是接电的,需要低电平流过)

共阴极(上)与共阳极(下)连接方式。与上同理

静态数码管显示

电容单位,进率为1000

输出静态数字

例如选择第三个数码管显示6;

#include <REGX52.H>
void main(){
	
	P2_4 = 1;//101
	P2_3 = 0;
	P2_2 = 1;
	
	P0 = 0x7D;
	while(1){
		
	
	}

}

其中为什么是P2_2~P2_4进行赋值,因为数码管连接译码器,由译码器输入高低电平进行显示,这里赋值是为了选择第几个led亮,从左往右的第三个代表着LED6,而LED6需要Y5进行输入,需要三位二进制数代表5,从而使其被选择,即101,此时LED6已被选中,6需要acdefg灯管亮,又因为是共阴极,故1才代表亮,从上至下写出应为 1011 1110,最后一个代表dp而从左边输入到右边需要从下往上进行输入故需要倒置为 0111 1101转化为十六进制为 0x7D

就如6的来历,段码表也是这样推出来的。

将显示的位置以及显示的数字抽象为一个函数。

#include <REGX52.H>
unsigned char NixieTable [] = {0x3F,0x06,0x5B,0x4F,0x66,
	0x6D,0x7D,0x07,0x7F,0x6F};
void Nixie(unsigned char Location,Number){
	switch(Location){
		case 1:
			P2_4 = 1;P2_3 = 1;P2_2 = 1;break;
		case 2:
			P2_4 = 1;P2_3 = 1;P2_2 = 0;break;
		case 3:
			P2_4 = 1;P2_3 = 0;P2_2 = 1;break;
		case 4:
			P2_4 = 1;P2_3 = 0;P2_2 = 0;break;
		case 5:
			P2_4 = 0;P2_3 = 1;P2_2 = 1;break;
		case 6:
			P2_4 = 0;P2_3 = 1;P2_2 = 0;break;
		case 7:
			P2_4 = 0;P2_3 = 0;P2_2 = 1;break;
		case 8:
			P2_4 = 0;P2_3 = 0;P2_2 = 0;break;
	}
	P0 = NixieTable[Number];
}
void main(){
	
	Nixie(7,2);
	while(1){
		
	
	}

}
动态数码管显示

消影

#include <REGX52.H>
unsigned char NixieTable [] = {0x3F,0x06,0x5B,0x4F,0x66,
	0x6D,0x7D,0x07,0x7F,0x6F};

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms--){
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

	
void Nixie(unsigned char Location,Number){
	switch(Location){
		case 1:
			P2_4 = 1;P2_3 = 1;P2_2 = 1;break;
		case 2:
			P2_4 = 1;P2_3 = 1;P2_2 = 0;break;
		case 3:
			P2_4 = 1;P2_3 = 0;P2_2 = 1;break;
		case 4:
			P2_4 = 1;P2_3 = 0;P2_2 = 0;break;
		case 5:
			P2_4 = 0;P2_3 = 1;P2_2 = 1;break;
		case 6:
			P2_4 = 0;P2_3 = 1;P2_2 = 0;break;
		case 7:
			P2_4 = 0;P2_3 = 0;P2_2 = 1;break;
		case 8:
			P2_4 = 0;P2_3 = 0;P2_2 = 0;break;
	}
	P0 = NixieTable[Number];
	Delay(1);//消影操作
	P0 = 0x00;
}



void main(){
	
	
	while(1){
		Nixie(1,1);
		//Delay(1);
		Nixie(2,2);
		//Delay(1);
		Nixie(3,3);
		//Delay(1);
	
	}

}

模块化编程

模块化编程需要注意:

1.使用ifndef 以及 define 尽量将被定义的变量进行大写。

2. .c文件放置函数体以及被调用的头文件, .h文件放置函数声明以及预编译语句

3.函数声明句末记得添加 ;

将Delay函数变为一个模块

Delay.h中

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

Delay.c中

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms--){
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

将晶体管显示也转变为一个模块

Nixie.h中

#ifndef __NIXIE_H__
#def  __NIXIE_H__

void Nixie(unsigned char Location,Number);

#endif

Nixie.c中

#include <REGX52.H>
#include "Delay.h"
unsigned char NixieTable [] = {0x3F,0x06,0x5B,0x4F,0x66,
	0x6D,0x7D,0x07,0x7F,0x6F};
void Nixie(unsigned char Location,Number){
	switch(Location){
		case 1:
			P2_4 = 1;P2_3 = 1;P2_2 = 1;break;
		case 2:
			P2_4 = 1;P2_3 = 1;P2_2 = 0;break;
		case 3:
			P2_4 = 1;P2_3 = 0;P2_2 = 1;break;
		case 4:
			P2_4 = 1;P2_3 = 0;P2_2 = 0;break;
		case 5:
			P2_4 = 0;P2_3 = 1;P2_2 = 1;break;
		case 6:
			P2_4 = 0;P2_3 = 1;P2_2 = 0;break;
		case 7:
			P2_4 = 0;P2_3 = 0;P2_2 = 1;break;
		case 8:
			P2_4 = 0;P2_3 = 0;P2_2 = 0;break;
	}
	P0 = NixieTable[Number];
	Delay(1);
	P0 = 0x00;
}

在需要的地方进行引用头文件以及调用函数即可。

调试工具

     加入LCD1602调试头文件以及c语言文件

LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__

//用户调用函数:
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

#endif

LCD1602.c

#include <REGX52.H>

//引脚配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0

//函数定义:
/**
  * @brief  LCD1602延时函数,12MHz调用可延时1ms
  * @param  无
  * @retval 无
  */
void LCD_Delay()
{
	unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}

/**
  * @brief  LCD1602写命令
  * @param  Command 要写入的命令
  * @retval 无
  */
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;
	LCD_RW=0;
	LCD_DataPort=Command;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

/**
  * @brief  LCD1602写数据
  * @param  Data 要写入的数据
  * @retval 无
  */
void LCD_WriteData(unsigned char Data)
{
	LCD_RS=1;
	LCD_RW=0;
	LCD_DataPort=Data;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

/**
  * @brief  LCD1602设置光标位置
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @retval 无
  */
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
	if(Line==1)
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	else if(Line==2)
	{
		LCD_WriteCommand(0x80|(Column-1+0x40));
	}
}

/**
  * @brief  LCD1602初始化函数
  * @param  无
  * @retval 无
  */
void LCD_Init()
{
	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
	LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
	LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
	LCD_WriteCommand(0x01);//光标复位,清屏
}

/**
  * @brief  在LCD1602指定位置上显示一个字符
  * @param  Line 行位置,范围:1~2
  * @param  Column 列位置,范围:1~16
  * @param  Char 要显示的字符
  * @retval 无
  */
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{
	LCD_SetCursor(Line,Column);
	LCD_WriteData(Char);
}

/**
  * @brief  在LCD1602指定位置开始显示所给字符串
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  String 要显示的字符串
  * @retval 无
  */
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=0;String[i]!='\0';i++)
	{
		LCD_WriteData(String[i]);
	}
}

/**
  * @brief  返回值=X的Y次方
  */
int LCD_Pow(int X,int Y)
{
	unsigned char i;
	int Result=1;
	for(i=0;i<Y;i++)
	{
		Result*=X;
	}
	return Result;
}

/**
  * @brief  在LCD1602指定位置开始显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~65535
  * @param  Length 要显示数字的长度,范围:1~5
  * @retval 无
  */
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
	}
}

/**
  * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:-32768~32767
  * @param  Length 要显示数字的长度,范围:1~5
  * @retval 无
  */
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
	unsigned char i;
	unsigned int Number1;
	LCD_SetCursor(Line,Column);
	if(Number>=0)
	{
		LCD_WriteData('+');
		Number1=Number;
	}
	else
	{
		LCD_WriteData('-');
		Number1=-Number;
	}
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
	}
}

/**
  * @brief  在LCD1602指定位置开始以十六进制显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~0xFFFF
  * @param  Length 要显示数字的长度,范围:1~4
  * @retval 无
  */
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i,SingleNumber;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		SingleNumber=Number/LCD_Pow(16,i-1)%16;
		if(SingleNumber<10)
		{
			LCD_WriteData(SingleNumber+'0');
		}
		else
		{
			LCD_WriteData(SingleNumber-10+'A');
		}
	}
}

/**
  * @brief  在LCD1602指定位置开始以二进制显示所给数字
  * @param  Line 起始行位置,范围:1~2
  * @param  Column 起始列位置,范围:1~16
  * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
  * @param  Length 要显示数字的长度,范围:1~16
  * @retval 无
  */
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
	}
}

主函数中进行调用

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"

int Res = 0;

void main(){
	LCD_Init();
	LCD_ShowChar(1,1,'A');
	LCD_ShowString(1,3,"Hello");
	LCD_ShowNum(1,9,123,3);//位数不够显示会高位补零,位数多余显示位,
	//会显示从后开始数的几位
	LCD_ShowSignedNum(1,13,-65,2);//显示位数不算符号位
	LCD_ShowHexNum(2,1,0xA8,2);
	LCD_ShowBinNum(2,4,0xAA,8);
	
	while(1){
		Res++;
		Delay(1000);
		LCD_ShowNum(2,13,Res,3);
	}

}

细节:LCD1602需要插紧,有时对比度也有影响,看着没有显示出来,其实已经显示出来了

矩阵键盘

矩阵键盘显示数据

MatrixKey.h

#ifndef __MATRIXKEY__H__
#define __MATRIXKEY__H__

unsigned char MatrixKey();

#endif

MatrixKey.c

#include <REGX52.H>
#include "Delay.h"
/**
  * @brief  矩阵键盘读取按键键码
  * @param  无
  * @retval  KeyNum	按下按键的键码值
  * 	  如果按键按下不放,则程序会停留在此函数,
  *		  松手一瞬间,返回按键码,没有按键按下时,返回0
  */

unsigned char MatrixKey(){
	
	unsigned char KeyNum = 0;
	
	P1 = 0xff;//将按键全部置于高电平
	P1_3 = 0;//选中第一列
	if( P1_7 == 0 ){ Delay(20); while( P1_7 == 0) Delay(20); KeyNum = 1;}//s1的检测
	if( P1_6 == 0 ){ Delay(20); while( P1_6 == 0) Delay(20); KeyNum = 5;}//s5的检测
	if( P1_5 == 0 ){ Delay(20); while( P1_5 == 0) Delay(20); KeyNum = 9;}//s9的检测
	if( P1_4 == 0 ){ Delay(20); while( P1_4 == 0) Delay(20); KeyNum = 13;}//s13的检测
	
	P1 = 0xff;//将按键全部置于高电平
	P1_2 = 0;//选中第二列
	if( P1_7 == 0 ){ Delay(20); while( P1_7 == 0) Delay(20); KeyNum = 2;}//s2的检测
	if( P1_6 == 0 ){ Delay(20); while( P1_6 == 0) Delay(20); KeyNum = 6;}//s6的检测
	if( P1_5 == 0 ){ Delay(20); while( P1_5 == 0) Delay(20); KeyNum = 10;}//s10的检测
	if( P1_4 == 0 ){ Delay(20); while( P1_4 == 0) Delay(20); KeyNum = 14;}//s14的检测
	
	P1 = 0xff;//将按键全部置于高电平
	P1_1 = 0;//选中第三列
	if( P1_7 == 0 ){ Delay(20); while( P1_7 == 0) Delay(20); KeyNum = 3;}//s3的检测
	if( P1_6 == 0 ){ Delay(20); while( P1_6 == 0) Delay(20); KeyNum = 7;}//s7的检测
	if( P1_5 == 0 ){ Delay(20); while( P1_5 == 0) Delay(20); KeyNum = 11;}//s11的检测
	if( P1_4 == 0 ){ Delay(20); while( P1_4 == 0) Delay(20); KeyNum = 15;}//s15的检测
	
	P1 = 0xff;//将按键全部置于高电平
	P1_0 = 0;//选中第四列
	if( P1_7 == 0 ){ Delay(20); while( P1_7 == 0) Delay(20); KeyNum = 4;}//s4的检测
	if( P1_6 == 0 ){ Delay(20); while( P1_6 == 0) Delay(20); KeyNum = 8;}//s8的检测
	if( P1_5 == 0 ){ Delay(20); while( P1_5 == 0) Delay(20); KeyNum = 12;}//s12的检测
	if( P1_4 == 0 ){ Delay(20); while( P1_4 == 0) Delay(20); KeyNum = 16;}//s16的检测
	
	return KeyNum;
}

主函数调用

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
#include "MatrixKey.h"

unsigned char KeyNum ;

void main(){
	
	LCD_Init();
	LCD_ShowString(1,1,"MatrixKey:");//打印
	while(1){
		KeyNum = MatrixKey();
		if( KeyNum ) {//延迟刷新
			LCD_ShowNum(2,1,KeyNum,2);
		
		}
	}

}
矩阵键盘密码锁

主函数内容

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
#include "MatrixKey.h"

unsigned char KeyNum ;
unsigned int Password,Count;

void main(){
	
	LCD_Init();
	LCD_ShowString(1,1,"Password:");//打印
	while(1){
		KeyNum = MatrixKey();
		if( KeyNum ) {//延迟刷新
			if( KeyNum <= 10){//如果s1-s10按键按下,输入密码
				
				if(Count < 4){//控制只能输入四个数
					Password *= 10;//密码左移一位
					Password += KeyNum % 10;//获取一位密码并加到密码中
					Count ++;//计次加一
				}
					
					LCD_ShowNum(2,1,Password,4);//刷新显示
			}
			if( KeyNum == 11){//如果s11被按下,进行确认操作
				if( Password == 2345){//进行密码比对,2345为正确密码
					LCD_ShowString(1,14,"OK ");//显示ok
					Password = 0;//密码清零
					Count = 0;//计次清零
					LCD_ShowNum(2,1,Password,4);//刷新显示
				}else{//否则
					LCD_ShowString(1,14,"ERR");//显示ERR
					Password = 0;//密码清零
					Count = 0;//计次清零
					LCD_ShowNum(2,1,Password,4);//刷新显示
				}
			}
			if( KeyNum == 12){//如果s12被按下,进行取消操作
					LCD_ShowString(1,14,"   ");//显示空
					Password = 0;//密码清零
					Count = 0;//计次清零
					LCD_ShowNum(2,1,Password,4);//刷新显示
			}
		}
	}

}

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

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

相关文章

docker容器下php框架laravel的使用问题与解决方案

DB_CONNECTIONmysqlDB_HOSTlocalhost DB_CONNECTIONmysqlDB_HOSTdocker33-mysql-1 容器中只有数据库结构 进入MySQL容器内&#xff0c;创建表结构&#xff0c;添加数据 代码层面需要转换成数组 $query->get([*])->toArray(); 分页数据框架会返回带有data的数据&#xf…

Spring Boot3整合Druid(监控功能)

目录 1.前置条件 2.导依赖 错误依赖&#xff1a; 正确依赖&#xff1a; 3.配置 1.前置条件 已经初始化好一个spring boot项目且版本为3X&#xff0c;项目可正常启动。 作者版本为3.2.2最新版 2.导依赖 错误依赖&#xff1a; 这个依赖对于spring boot 3的支持不够&#…

机器学习实验报告——APRIORI算法

目录 一、算法介绍 1.1算法背景 1.2算法引入 1.3算法假设 1.4算法基本概念介绍 1.4.1关联规则 1.4.2支持度 1.4.3置信度 1.4.4频繁项集 1.4.5项目 1.4.6提升度 二、算法原理 2.1算法思想 2.2Apriori算法产生频繁项集 2.3Apriori算法的基本步骤 2.4关联分析 三、算法实现 3.1 Ap…

开始学习vue2基础篇(初体验)

一、什么是VUE&#xff08;官网 &#xff1a;https://cn.vuejs.org/&#xff09; 官方给出的概念 &#xff1a;Vue (读音 /vju ː/ &#xff0c;类似于 view) 是一套用 于构建用户界面的前端框架 渐进式的 JavaScript 框架 二、VUE的特点 易用 &#xff1a;基础只需HTML、CSS、…

爬虫案例—抓取找歌词网站的按歌词找歌名数据

爬虫案例—抓取找歌词网站的按歌词找歌名数据 找个词网址&#xff1a;https://www.91ge.cn/lxyyplay/find/ 目标&#xff1a;抓取页面里的所有要查的歌词及歌名等信息&#xff0c;并存为txt文件 一共46页数据 网站截图如下&#xff1a; 抓取完整歌词数据&#xff0c;如下图…

excel学习1

直接ctrl cctrl v会报错位移选择粘贴时用123那个数字粘贴而不是ctrl V 只要结果不要公式 上面复制的为数值这里是复制的公式他们两个不一样 这个方法太麻烦了直接用格式刷&#xff0c;选择一个区域一个单元格&#xff0c;不要选择多个一刷就出来了 第一个计算后向下拖就行了&…

Ubutu下的Shell操作

前言 在学习Ubuntu系统时&#xff0c;Shell操作是必不可少的知识。本篇文章是记录我学习Linux系统时&#xff0c;Ubutu下的Shell操作&#xff0c;希望我的分享对大家有所帮助&#xff01; 目录 前言 一、什么时是Shell 二、Shell的基本操作 三、常用的Shell命令 1、目录信…

PrestaShop购物系统 SQL注入漏洞复现(CVE-2023-30150)

0x01 产品简介 PrestaShop 是一个功能丰富,基于 PHP5 开发的 Web2.0 网上购物系统。PrestaShop 具有可定制,稳定等特点。整个系统只有 5.8MB,易于快速安装。 0x02 漏洞概述 PrestaShop 的部分主题中使用Leo Custom Ajax模块拓展,Leo Custom Ajax模块中可以在/modules/le…

Hugo使用且部署GitHubPages

hugo的使用 20201121 Hugo是由Go语言实现的静态网站生成器。简单、易用、高效、易扩展、快速部署。 安装Hugo 0.windows安装(releases) 下载地址&#xff1a;https://github.com/spf13/hugo/releases。 配置环境变量 验证测试是否安装成功 hugo help1. 二进制安装&#xf…

C#使用DateAndTime.DateDiff方法计算年龄

目录 一、计算年龄的方法 二、 DateAndTime类 1.定义 2.常用方法 3.DateDiff(DateInterval, DateTime, DateTime, FirstDayOfWeek, FirstWeekOfYear) 三、使用DateAndTime.DateDiff方法计算年龄 一、计算年龄的方法 使用DateDiff方法计算系统时间与员工生日之间相隔的年…

续签KES证书

MiniO KES&#xff08;密钥加密服务&#xff09;是 MinIO 开发的一项服务&#xff0c;旨在弥合在 Kubernetes 中运行的应用程序与集中式密钥管理服务 &#xff08;KMS&#xff09; 之间的差距。中央 KMS 服务器包含所有状态信息&#xff0c;而 KES 在需要执行与获取新密钥或更新…

【AI Agent系列】【MetaGPT】7. 一句话订阅专属信息 - 订阅智能体进阶,实现一个更通用的订阅智能体

文章目录 0. 前置推荐阅读1. 本文内容2. 解析用户指令&#xff08;分析用户需求&#xff09;2.1 完整代码及注释2.2 运行结果 3. 利用大模型写爬虫代码3.1 对html内容进行精简3.2 利用大模型写爬虫代码3.3 补充代码&#xff0c;测试本节程序3.4 运行结果及踩坑3.4.1 运行结果3.…

leaflet学习笔记-带过滤的图例(九)

前言 图例不只能够帮助我们在查看地图的时候更加方便容易地分辨不同颜色代表的要素&#xff0c;本文要介绍的图例组件还可以按需求过滤掉不用显示的要素&#xff0c;使地图的更能清晰的显示我们需要显示的内容 技术核心 说到过滤要素&#xff0c;第一时间想到的就是滑块组件…

CmakeList教程

一、CmakeList介绍&#xff1a; cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。它会通过写的语句自动生成一个MakeFile,从而实现高效编译 二、CmakeList的常用指令 1.指定…

瑞_力扣LeetCode_101. 对称二叉树

文章目录 题目 101. 对称二叉树题解方式一 递归方式二 迭代 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《刷题》的力扣LeetCode系列&#xff0c;主要以力扣LeetCode网的题进行解析与分享。本文仅供大家交流、学习及研究使用&#xff0c;禁止用于商业用途&#xff0c…

电脑 wifi 常断

问题 电脑wifi网络经常断。 详细问题 笔者使用笔记本电脑&#xff0c;发现每过三五分钟&#xff0c;wifi便会自动断开。 解决方案 步骤1、搜索框搜索设备管理器。 步骤2、找到网络适配器并点击。 步骤2、找到网络适配器菜单中的Wireless相关内容&#xff0c;右键&#x…

解读 EventBridge Transform:数据转换和处理的灵活能力

作者&#xff1a;木则 阿里云 EventBridge 提供了强大而灵活的事件总线服务&#xff0c;它可以连接应用程序、阿里云云服务和阿里云 Serverless 服务来快速构建 EDA&#xff08;Event-driven Architectures&#xff09;事件驱动架构&#xff0c;驱动应用与应用&#xff0c;应用…

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法

VisualSVN Server下载安装和使用方法、服务器搭建、使用TortoiseSvn将项目上传到云端服务器、各种错误解决方法 0.写在前面00.电脑配置01.思路 1.VisualSVN Server下载安装01.下载02.安装03.电脑命名不能有中文04.制作VisualSVN Server快捷方式05.License limits exceeded, Som…

已解决Error:AttributeError: module ‘numpy‘ has no attribute ‘int‘.

文章目录 引言报错分析解决方案1&#xff1a;降低NumPy版本解决方案2&#xff1a;更改NumPy源码 结尾 引言 在Python编程中&#xff0c;NumPy是一个不可或缺的库&#xff0c;尤其在处理大规模数值计算时。但即使是这个强大的工具&#xff0c;也可能在使用过程中遇到问题。其中…

接口自动化测试框架开发(pytest+allure+aiohttp+ 用例自动生成)

近期准备优先做接口测试的覆盖&#xff0c;为此需要开发一个测试框架&#xff0c;经过思考&#xff0c;这次依然想做点儿不一样的东西。 接口测试是比较讲究效率的&#xff0c;测试人员会希望很快能得到结果反馈&#xff0c;然而接口的数量一般都很多&#xff0c;而且会越来越…