需要非常详细的代码注释,最好每一句代码后面都有注释,感谢!希望有ER流程图的参考帮助更好的理解。
#include "key_m.h"
/*******************************************************************************
* 函 数 名 : Key_Map
* 函数功能 : 键盘值重映射
* 输 入 : 行列码值
* 输 出 : 键盘ASCII码
*******************************************************************************/
unsigned char Key_Map(unsigned char _key)
{
unsigned char key;
switch (_key)
{
case 0x11:
key = '*';
break;
case 0x12:
key = '0';
break;
case 0x14:
key = '#';
break;
case 0x18:
key = 'D';
break;
case 0x21:
key = '7';
break;
case 0x22:
key = '8';
break;
case 0x24:
key = '9';
break;
case 0x28:
key = 'C';
break;
case 0x41:
key = '4';
break;
case 0x42:
key = '5';
break;
case 0x44:
key = '6';
break;
case 0x48:
key = 'B';
break;
case 0x81:
key = '1';
break;
case 0x82:
key = '2';
break;
case 0x84:
key = '3';
break;
case 0x88:
key = 'A';
break;
default:
key = 0;//无按键
break;
}
return key;
}
//------------------------------------------------
// 函数介绍: 扫描矩阵键盘,并返回按键值
// 输入参数: mode:0不支持连续按键;1支持连按
// 返 回 值: 0无按键,其他有对应按键按下
// 修订版本:V1.1
//------------------------------------------------
unsigned char KeyScan(bit mode)
{
unsigned char KeyValue = 0;
static bit key_up = 1;
char a = 0;
GPIO_KEY=0x0f;//P1.7|P1.6|P1.5|P1.4拉低
if((GPIO_KEY!=0x0f)&&key_up)//读取按键是否按下
{
key_up = mode;
delay_ms(10);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0x80;break;
case(0X0b): KeyValue=0x40;break;
case(0X0d): KeyValue=0x20;break;
case(0X0e): KeyValue=0x10;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue+0x08;break;
case(0Xb0): KeyValue=KeyValue+0x04;break;
case(0Xd0): KeyValue=KeyValue+0x02;break;
case(0Xe0): KeyValue=KeyValue+0x01;break;
}
}
}
else if(GPIO_KEY==0x0f)//按键松手检测
{
key_up = 1;
}
//以上返回为16进制行列值(1,2,4,8)X(1,2,4,8)
return Key_Map(KeyValue); //返回字符按键值
}
代码二
#include "password.h"
#include "lcd1602.h"
#include "delay.h"
#include "24c02.h"
#include "eeprom.h"
static unsigned char Buf_PW[NUM_LEN]={0};
unsigned char code_PW[8] ={'1','2','3','4','5','6','7','8'};//用户默认密码12345678
code unsigned char super_PW[8] ={'1','3','1','4','5','9','2','1'};//超级密码13145921
static unsigned char PW_index = 0;
unsigned char buf[20];
void PW_Init(void)
{
u8 i=0;
// u8 buf[9];
// u8 sumCK=0;
LCD_GotoXY(0,0);
/*
if(AT24CXX_Check()==0)//检测24C02正确
{
LCD_GotoXY(0,0);
LCD_Print("24C02 Check OK");
AT24CXX_Read(0,buf,9);
// Send_Str_Com("[24C02]:");
// for(i=0;i<9;i++) //更新密码
// {
// Send_Char_Com(buf[i]);
// }
// Send_Str_Com("\r\n");
for(i=0;i<8;i++)//计算校验和
sumCK += buf[i];
if(sumCK==buf[8])//检验和正确
{
for(i=0;i<8;i++) //更新密码
{
code_PW[i] = buf[i];
}
LCD_GotoXY(0,1);
LCD_Print("PW. <-- [24C02] ");
}
else
{
LCD_GotoXY(0,1);
LCD_Print("PW. <-- default ");
}
}
else*/
{
LCD_GotoXY(0,0);
LCD_Print("To backup PW..");
if(0==EEPROM_READ(buf,20))
{
for(i=0;i<8;i++) //更新密码
code_PW[i]=buf[i];
for(i=0;i<12;i++)
IC_SN[i/4][i%4] = buf[8+i];
LCD_GotoXY(0,1);
LCD_Print("PW. <-- [Flash] ");
}
else
{
LCD_GotoXY(0,1);
LCD_Print("PW. <-- default ");
}
}
// Send_Str_Com("[code_PW]:");
// for(i=0;i<8;i++) //更新密码
// {
// Send_Char_Com(code_PW[i]);
// }
// Send_Str_Com("\r\n");
delay_ms(1000);
LCD_Clear();
}
//密码正确返回0xFF
u8 KeyInputPW(u8 _keyValue)
{
//显示部分
//"0123456789abcdef"
//"----------------"
//"----12345678----"
//显示
if(_keyValue=='D')//输入错误可回退
{
if(PW_index)
{
PW_index--;
Buf_PW[PW_index]=0;
LCD_GotoXY((0x3+PW_index),1);
LCD_WrDat('-');
return PW_index;
}
else
{
return 0;
}
}
else if(_keyValue<'0'||_keyValue>'9')//非数字键直接返回
return PW_index;
LCD_GotoXY((0x3+PW_index),1);
LCD_WrDat(_keyValue);
delay_ms(150);
LCD_GotoXY((0x3+PW_index),1);
LCD_WrDat('*');
Buf_PW[PW_index++]= _keyValue;//记录输入密码
return PW_index;
}
//验证密码正误函数
//VIP密码正确返回0xFF ,
//默认密码正确返回0x0F
//密码错误返回0xEE
u8 Check_PW(void)
{
u8 i;
u8 weight=0;//加权值
PW_index = 0;//键入密码位数归零,以备下次使用
//先验证特权VIP密码
weight=0;
for(i=0;i<NUM_LEN;i++)
{
if(Buf_PW[i] == super_PW[i])weight++;
}
if(weight==NUM_LEN)
{
return 0xFF;
}
//先验证默认密码
weight=0;
for(i=0;i<NUM_LEN;i++)
{
if(Buf_PW[i] == code_PW[i])weight++;
}
if(weight==NUM_LEN)
{
return 0x0F;
}
//代表密码错误
return 0xEE;
}
//输入密码
u8 InputPassword(u8 _keyValue)
{
u8 temp;
temp=KeyInputPW(_keyValue);
if(temp>=NUM_LEN)//输入长度已到
{
PW_index = 0;
return (Check_PW());
}
else
return temp;
}
u8 SetPassword(u8 _keyValue)
{
static u8 step=1;
u8 i;
// static u8 buf[8];
u8 weight=0;//加权值
u8 temp=0;
// u8 eep_temp[9];
// u8 sumCK=0;
if(step==1)
{
if(KeyInputPW(_keyValue)<NUM_LEN)return temp;
//首次输入长度已到
PW_index = 0;
//将首次输入的8位密码保存
for(i=0;i<NUM_LEN;i++)
{
buf[i]= Buf_PW[i];
}
LCD_GotoXY(0x00,0);
LCD_Print(" type it again..");
LCD_GotoXY(0x00,1);
LCD_Print("----------------");
step = 2;
}
else if(step==2)
{
if(KeyInputPW(_keyValue)<NUM_LEN)return temp;
//第2次输入长度已到
step = 1;
PW_index = 0;
weight=0;
for(i=0;i<NUM_LEN;i++)//验证2次输入的密码是否一致
{
if(buf[i]==Buf_PW[i])
weight++;
}
if(weight>=NUM_LEN)//2次键入密码一致
{
{
for(i=0;i<NUM_LEN;i++)//修改用户默认密码
code_PW[i]=buf[i];
for(i=0;i<12;i++)
buf[NUM_LEN+i]=IC_SN[i/4][i%4];
EEPROM_WRITE(buf,20);
return 0xF2;
}
}
else
{
return 0xE3;////2次密码键入不一致
}
}
return 0;//已输入的密码位数
}
该回答引用 GPT
代码一注解
//包含头文件 key_m.h
#include "key_m.h"
/******************************************************************************
函 数 名 : Key_Map
函数功能 : 键盘值重映射
输 入 : 行列码值
输 出 : 键盘ASCII码 ******************************************************************************/ unsigned char Key_Map(unsigned char _key) { unsigned char key; //根据每个行列码值映射到对应的ASCII码 switch (_key) { case 0x11: key = ''; break; case 0x12: key = '0'; break; case 0x14: key = '#'; break; case 0x18: key = 'D'; break; case 0x21: key = '7'; break; case 0x22: key = '8'; break; case 0x24: key = '9'; break; case 0x28: key = 'C'; break; case 0x41: key = '4'; break; case 0x42: key = '5'; break; case 0x44: key = '6'; break; case 0x48: key = 'B'; break; case 0x81: key = '1'; break; case 0x82: key = '2'; break; case 0x84: key = '3'; break; case 0x88: key = 'A'; break; default: key = 0;//无按键 break; } return key; }
//------------------------------------------------
// 函数介绍: 扫描矩阵键盘,并返回按键值
// 输入参数: mode:0不支持连续按键;1支持连按
// 返 回 值: 0无按键,其他有对应按键按下
// 修订版本:V1.1
//------------------------------------------------
unsigned char KeyScan(bit mode) {
unsigned char KeyValue = 0;//按键赋初值为0
static bit key_up = 1;//定义键盘松开状态为1
char a = 0;
GPIO_KEY=0x0f;//P1.7|P1.6|P1.5|P1.4拉低,测试每个列是否被按下
if((GPIO_KEY!=0x0f)&&key_up)//读取按键是否按下并且随后的状态为按下
{
key_up = mode;//记录键盘状态
delay_ms(10);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;//检测每一列得到按键
switch(GPIO_KEY)
{
case(0X07): KeyValue=0x80;break;
case(0X0b): KeyValue=0x40;break;
case(0X0d): KeyValue=0x20;break;
case(0X0e): KeyValue=0x10;break;
}
//测试行
GPIO_KEY=0XF0;//检测行
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue+0x08;break;
case(0Xb0): KeyValue=KeyValue+0x04;break;
case(0Xd0): KeyValue=KeyValue+0x02;break;
case(0Xe0): KeyValue=KeyValue+0x01;break;
}
}
}
else if(GPIO_KEY==0x0f)//按键松手检测
{
key_up = 1;//标志位表示已经处理过了,以便于下次检测(解决反复重复键盘输入问题)
}
//以上返回为16进制行列值(1,2,4,8)X(1,2,4,8),需要映射成ASCII字符
return Key_Map(KeyValue); //返回字符按键值
}
代码二
//包含相关头文件
#include "password.h"
#include "lcd1602.h"
#include "delay.h"
#include "24c02.h"
#include "eeprom.h"
static unsigned char Buf_PW[NUM_LEN]={0};
unsigned char code_PW[8] ={'1','2','3','4','5','6','7','8'}; //用户默认密码12345678
unsigned char super_PW[8] ={'1','3','1','4','5','9','2','1'}; //超级密码13145921
static unsigned char PW_index = 0;
unsigned char buf[20];
void PW_Init(void) {
u8 i=0;//循环计数器
//检测24C02是否正确
/* if(AT24CXX_Check()==0){
LCD_Print("24C02 Check OK");
AT24CXX_Read(0,buf,9);
for(i=0;i<9;i++)//更新密码
{
...
}
}
else { */
LCD_GotoXY(0,0);
LCD_Print("To backup PW..");
if(0==EEPROM_READ(buf,20)) {
for(i=0;i<8;i++)//更新密码
code_PW[i]=buf[i];
for(i=0;i<12;i++)
IC_SN[i/4][i%4] = buf[8+i];
LCD_GotoXY(0,1);
LCD_Print("PW. <-- [Flash] ");
} else {
LCD_GotoXY(0,1);
LCD_Print("PW. <-- default ");
}
delay_ms(1000);
LCD_Clear();
}
//显示键值并记录输入密码
u8 KeyInputPW(u8 _keyValue) {
//显示部分
//"0123456789abcdef"
//"----------------"
//"----12345678----"
//显示
if(_keyValue=='D') {//输入错误可回退
if(PW_index) {
PW_index--;
Buf_PW[PW_index]=0;
LCD_GotoXY((0x3+PW_index),1);
LCD_WrDat('-');
return PW_index;
} else {
return 0;
}
} else if(_keyValue<'0'||_keyValue>'9')//非数字键直接返回
return PW_index;
LCD_GotoXY((0x3+PW_index),1);
LCD_WrDat(_keyValue);
delay_ms(150);
LCD_GotoXY((0x3+PW_index),1);
LCD_WrDat('*');
Buf_PW[PW_index++]= _keyValue;//记录输入密码
return PW_index;
}
//验证密码是否正确
u8 Check_PW(void) {
u8 i;//循环计数器
u8 weight=0;//加权值
PW_index = 0;//键入密码位数归零
//先验证特权VIP密码
for(i=0;i<8;i++)
if(Buf_PW[i]!=super_PW[i])
break;
if(i==8)
return VIP_MODE;
//再验证默认用户密码
for(i=0;i<8;i++) {
if(code_PW[i]<='9'&&code_PW[i]>='0')
weight+=(Buf_PW[i] - '0') * (i+1);
else
return ERROR_PW;
if(Buf_PW[i]!=code_PW[i])
break;
}
if(i==8)
return NORMAL_MODE;
//密码错误,清空Buf_PW数组,返回错误标志
for(i=0;i<NUM_LEN;i++)
Buf_PW[i]=0;
return ERROR_PW;
}
我可以提供帮助。为了添加详细的注释并参考ER流程图,我建议你按照以下步骤进行:
例如,假设这份代码是一个简单的二分查找算法:
int binary_search(int arr[], int len, int target) {
int left = 0;
int right = len - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
我建议你这样注释:
/**
* 二分查找算法
*
* @param arr 待查找的有序数组
* @param len 数组长度
* @param target 目标元素
* @return 目标元素在数组中的下标,若不存在则返回-1
*/
int binary_search(int arr[], int len, int target) {
int left = 0; // 左侧下标
int right = len - 1; // 右侧下标
while (left <= right) {
int mid = left + (right - left) / 2; // 中间下标
if (arr[mid] == target) { // 找到目标元素
return mid; // 返回下标
} else if (arr[mid] < target) { // 目标元素在右侧
left = mid + 1;
} else { // 目标元素在左侧
right = mid - 1;
}
}
return -1; // 未找到目标元素
}
然后,你可以绘制一个类似这样的ER流程图:
graph TD;
A[开始] --> B[左侧下标left=0,右侧下标right=len-1]
B --> C{left<=right?}
C -- Yes --> D{arr[mid]==target?}
C -- No --> E[未找到目标元素,返回-1]
D -- Yes --> F[找到目标元素,返回目标元素的下标]
D -- No --> G{arr[mid]<target?}
G -- Yes --> H[mid+1, right] <-- B
G -- No --> I[left, mid-1] <-- B
最后,将注释和ER流程图添加到代码文件中:
/**
* 二分查找算法
*
* @param arr 待查找的有序数组
* @param len 数组长度
* @param target 目标元素
* @return 目标元素在数组中的下标,若不存在则返回-1
*/
int binary_search(int arr[], int len, int target) {
int left = 0; // 左侧下标
int right = len - 1; // 右侧下标
while (left <= right) { // ER图上的C
int mid = left + (right - left) / 2; // 中间下标
if (arr[mid] == target) { // ER图上的D
return mid; // ER图上的F
} else if (arr[mid] < target) { // ER图上的G
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // ER图上的E
}
// ER图
// graph TD;
// A[开始] --> B[左侧下标left=0,右侧下标right=len-1]
// B --> C{left<=right?}
// C -- Yes --> D{arr[mid]==target?}
// C -- No --> E[未找到目标元素,返回-1]
// D -- Yes --> F[找到目标元素,返回目标元素的下标]
// D -- No --> G{arr[mid]<target?}
// G -- Yes --> H[mid+1, right] <-- B
// G -- No --> I[left, mid-1] <-- B
你好,你得需求给你注释好了,请验收
#include "key_m.h"
/*******************************************************************************
* 函 数 名 : Key_Map
* 函数功能 : 键盘值重映射
* 输 入 : 行列码值
* 输 出 : 键盘ASCII码
*******************************************************************************/
unsigned char Key_Map(unsigned char _key)
{
unsigned char key; // 获取对应的按键字符
// 这里的赋值根据对应的硬件来进行修改
switch (_key)
{
case 0x11:
key = '*';
break;
case 0x12:
key = '0';
break;
case 0x14:
key = '#';
break;
case 0x18:
key = 'D';
break;
case 0x21:
key = '7';
break;
case 0x22:
key = '8';
break;
case 0x24:
key = '9';
break;
case 0x28:
key = 'C';
break;
case 0x41:
key = '4';
break;
case 0x42:
key = '5';
break;
case 0x44:
key = '6';
break;
case 0x48:
key = 'B';
break;
case 0x81:
key = '1';
break;
case 0x82:
key = '2';
break;
case 0x84:
key = '3';
break;
case 0x88:
key = 'A';
break;
default:
key = 0;//无按键
break;
}
return key;
}
//------------------------------------------------
// 函数介绍: 扫描矩阵键盘,并返回按键值
// 输入参数: mode:0不支持连续按键;1支持连按
// 返 回 值: 0无按键,其他有对应按键按下
// 修订版本:V1.1
//------------------------------------------------
// 要放在中断中扫描执行
unsigned char KeyScan(bit mode)
{
unsigned char KeyValue = 0; // 临时变量按键键值
static bit key_up = 1; // 弹起标志位
char a = 0; // 没用的代码,可以删掉
GPIO_KEY=0x0f; // P1.7|P1.6|P1.5|P1.4拉低 对寄存器赋值高4位0,低4位1
if((GPIO_KEY!=0x0f)&&key_up) // 读取按键是否按下
{
key_up = mode; // 没有什么用,可以删掉
delay_ms(10); // 延时10ms进行消抖
if(GPIO_KEY!=0x0f) // 再次检测键盘是否按下
{
// 测试列
GPIO_KEY=0X0F; // 赋值寄存器 也就是00001111
// 按下是低电平判断
switch(GPIO_KEY)
{
case(0X07): KeyValue=0x80;break; // 是00000111 对KeyValue复值0x80
case(0X0b): KeyValue=0x40;break; // 是00001011 对KeyValue复值0x40
case(0X0d): KeyValue=0x20;break; // 是00001101 对KeyValue复值0x20
case(0X0e): KeyValue=0x10;break; // 是00001110 对KeyValue复值0x10
}
// 测试行
GPIO_KEY=0XF0; // 赋值寄存器 也就是11110000
// 同理求另外的高4位判断
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue+0x08;break; // 是01110000 对KeyValue值进行更新
case(0Xb0): KeyValue=KeyValue+0x04;break; // 是10110000 对KeyValue值进行更新
case(0Xd0): KeyValue=KeyValue+0x02;break; // 是11010000 对KeyValue值进行更新
case(0Xe0): KeyValue=KeyValue+0x01;break; // 是11100000 对KeyValue值进行更新
}
// 经过上面的行列扫描,可以得知是哪个键值了
}
}
else if(GPIO_KEY==0x0f) // 按键松手检测
{
key_up = 1; // 弹起标志位
}
// 以上返回为16进制行列值(1,2,4,8)X(1,2,4,8)
return Key_Map(KeyValue); // 返回字符按键值
}
代码二
// 相应的模块的头文件
#include "password.h"
#include "lcd1602.h"
#include "delay.h"
#include "24c02.h"
#include "eeprom.h"
static unsigned char Buf_PW[NUM_LEN]={0}; // 全局的数组8个字节
unsigned char code_PW[8] ={'1','2','3','4','5','6','7','8'}; // 用户默认密码12345678
code unsigned char super_PW[8] ={'1','3','1','4','5','9','2','1'}; // 超级密码13145921
static unsigned char PW_index = 0;
unsigned char buf[20]; // eeprom读取数据使用的buf
void PW_Init(void)
{
u8 i=0;
// u8 buf[9];
// u8 sumCK=0;
LCD_GotoXY(0,0);
/*
if(AT24CXX_Check()==0) // 检测24C02正确
{
LCD_GotoXY(0,0); // 设置光标
LCD_Print("24C02 Check OK"); // 显示
AT24CXX_Read(0,buf,9); // 从24C02的0地址读取9字节数据
// Send_Str_Com("[24C02]:"); // 串口打印调试
// for(i=0;i<9;i++) // 更新密码
// {
// Send_Char_Com(buf[i]); // 串口打印对应的密码数字
// }
// Send_Str_Com("\r\n"); // 换行
for(i=0;i<8;i++) // 计算校验和
sumCK += buf[i];
if(sumCK==buf[8]) // 检验和正确
{
for(i=0;i<8;i++) // 更新密码
{
code_PW[i] = buf[i];
}
LCD_GotoXY(0,1); // 移动光标
LCD_Print("PW. <-- [24C02] "); // 显示
}
else
{
LCD_GotoXY(0,1); // 移动光标
LCD_Print("PW. <-- default "); // 显示
}
}
else*/
{
LCD_GotoXY(0,0); // 移动光标
LCD_Print("To backup PW.."); // 显示
if(0==EEPROM_READ(buf,20)) // 从EEPROM中读取20个数据
{
for(i=0;i<8;i++) // 更新8位密码到code_PW数组中
code_PW[i]=buf[i];
// 将buf数组中的后12个数据更新到IC_SN数组中,这里IC_SN是一个二维数组,有3行4列。这个for循环的作用是将buf数组中的数据按照顺序填充到IC_SN数组中,例如:
// 当i=0时,IC_SN[0][0] = buf[8];
// 当i=1时,IC_SN[0][1] = buf[9];
// 当i=2时,IC_SN[0][2] = buf[10];
// 当i=3时,IC_SN[0][3] = buf[11];
// 当i=4时,IC_SN[1][0] = buf[12];
for(i=0;i<12;i++)
IC_SN[i/4][i%4] = buf[8+i]; // 更新IC_SN序号
LCD_GotoXY(0,1); // 移动光标
LCD_Print("PW. <-- [Flash] "); // 显示
}
else
{
LCD_GotoXY(0,1); // 移动光标
LCD_Print("PW. <-- default "); // 显示
}
}
// Send_Str_Com("[code_PW]:");
// for(i=0;i<8;i++) //更新密码
// {
// Send_Char_Com(code_PW[i]); // 串口调试
// }
// Send_Str_Com("\r\n"); //
delay_ms(1000); // 必要的延迟
LCD_Clear(); // 清屏
}
// 密码正确返回0xFF
u8 KeyInputPW(u8 _keyValue)
{
// 显示部分
// "0123456789abcdef"
// "----------------"
// "----12345678----"
// 显示
if(_keyValue=='D') // 输入错误可回退 下面的逻辑是执行回退操作
{
if(PW_index) // 如果已经输入了一些密码,找到改位置,进行更改
{
PW_index--; // 回退检索
Buf_PW[PW_index]=0; // 将对应的检索清0
LCD_GotoXY((0x3+PW_index),1); // 移动光标
LCD_WrDat('-'); // 显示-字符
return PW_index;
}
else
{
return 0;
}
}
else if(_keyValue<'0'||_keyValue>'9') // 非数字键直接返回
return PW_index;
LCD_GotoXY((0x3+PW_index),1); // 移动光标
LCD_WrDat(_keyValue); // 写入键值
delay_ms(150); // 必要的延迟
LCD_GotoXY((0x3+PW_index),1); // 移动光标
LCD_WrDat('*'); // 显示*字符
Buf_PW[PW_index++]= _keyValue; // 记录输入密码
return PW_index; // 返回对应的检索值
}
//验证密码正误函数
//VIP密码正确返回0xFF ,
//默认密码正确返回0x0F
//密码错误返回0xEE
u8 Check_PW(void)
{
u8 i;
u8 weight=0; // 加权值
PW_index = 0; // 键入密码位数归零,以备下次使用
// 先验证特权VIP密码
weight=0;
for(i=0;i<NUM_LEN;i++) // 循环8次
{
if(Buf_PW[i] == super_PW[i])weight++; // 验证超级vip
}
if(weight==NUM_LEN)
{
return 0xFF; // VIP密码都正确,返回0xFF ,
}
// 后验证默认密码
weight=0; // 重新计数
for(i=0;i<NUM_LEN;i++) // 循环8次
{
if(Buf_PW[i] == code_PW[i])weight++; // 验证默认密码
}
if(weight==NUM_LEN)
{
return 0x0F; // 默认密码正确,返回0x0F ,
}
// 运行到这里则代表密码错误
return 0xEE;
}
// 输入密码
u8 InputPassword(u8 _keyValue)
{
u8 temp;
temp=KeyInputPW(_keyValue); // 调用函数KeyInputPW(),获取输入密码的个数
if(temp >= NUM_LEN)//输入长度已到
{
PW_index = 0; // 键入密码位数归零,以备下次使用
return (Check_PW()); // 开始验证密码
}
else
return temp; // 长度不够8位直接返回
}
// 设置密码
// 需要验证两次输入的密码是否一致,一致则返回0xF2,不一致则返回0xE3
u8 SetPassword(u8 _keyValue)
{
static u8 step=1; // 操作步骤
u8 i;
// static u8 buf[8];
u8 weight=0;//加权值
u8 temp=0;
// u8 eep_temp[9];
// u8 sumCK=0;
if(step==1)
{
if(KeyInputPW(_keyValue)<NUM_LEN)return temp; // 设置的密码不够8位,直接返回
// 首次输入长度已到
PW_index = 0;
// 将首次输入的8位密码保存
for(i=0;i<NUM_LEN;i++)
{
buf[i]= Buf_PW[i];
}
LCD_GotoXY(0x00,0); // 移动光标
LCD_Print(" type it again.."); // 显示
LCD_GotoXY(0x00,1); // 移动光标
LCD_Print("----------------"); // 显示
step = 2; // 往下走
}
else if(step==2)
{
if(KeyInputPW(_keyValue)<NUM_LEN)return temp; // 设置的密码不够8位,直接返回
// 第2次输入长度已到
step = 1;
PW_index = 0;
weight=0;
for(i=0;i<NUM_LEN;i++) // 验证2次输入的密码是否一致
{
if(buf[i]==Buf_PW[i])
weight++;
}
if(weight>=NUM_LEN) // 2次键入密码一致
{
{
for(i=0;i<NUM_LEN;i++) // 修改用户默认密码
code_PW[i]=buf[i];
for(i=0;i<12;i++)
buf[NUM_LEN+i]=IC_SN[i/4][i%4];
EEPROM_WRITE(buf,20); // 将密码保存进eeprom中,以便下次读取
return 0xF2; // 正确返回
}
}
else
{
return 0xE3; // 2次密码键入不一致
}
}
return 0; // 不会运行到这里的
}
不明白在问吧
ER流程图估计没人画的
以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:
第一段代码注释如下:
c
/*******************************************************************************
* 函 数 名 : Key_Map
* 函数功能 : 键盘值重映射
* 输 入 : 行列码值
* 输 出 : 键盘ASCII码
*******************************************************************************/
unsigned char Key_Map(unsigned char _key)
{
unsigned char key;
switch (_key)
{
case 0x11: //如果输入的值为0x11,对应的键为'*'
key = '*';
break; //跳出switch
case 0x12: //如果输入的值为0x12,对应的键为'0'
key = '0';
break;
case 0x14: //如果输入的值为0x14,对应的键为'#'
key = '#';
break;
case 0x18: //如果输入的值为0x18,对应的键为'D'
key = 'D';
break;
case 0x21: //如果输入的值为0x21,对应的键为'7'
key = '7';
break;
case 0x22: //如果输入的值为0x22,对应的键为'8'
key = '8';
break;
case 0x24: //如果输入的值为0x24,对应的键为'9'
key = '9';
break;
case 0x28: //如果输入的值为0x28,对应的键为'C'
key = 'C';
break;
case 0x41: //如果输入的值为0x41,对应的键为'4'
key = '4';
break;
case 0x42: //如果输入的值为0x42,对应的键为'5'
key = '5';
break;
case 0x44: //如果输入的值为0x44,对应的键为'6'
key = '6';
break;
case 0x48: //如果输入的值为0x48,对应的键为'B'
key = 'B';
break;
case 0x81: //如果输入的值为0x81,对应的键为'1'
key = '1';
break;
case 0x82: //如果输入的值为0x82,对应的键为'2'
key = '2';
break;
case 0x84: //如果输入的值为0x84,对应的键为'3'
key = '3';
break;
case 0x88: //如果输入的值为0x88,对应的键为'A'
key = 'A';
break;
default: //其他输入值,key值为0表示无按键
key = 0;
break;
}
return key; //返回键值
}
//------------------------------------------------
// 函数介绍: 扫描矩阵键盘,并返回按键值
// 输入参数: mode:0不支持连续按键;1支持连按
// 返 回 值: 0无按键,其他有对应按键按下
// 修订版本:V1.1
//------------------------------------------------
unsigned char KeyScan(bit mode)
{
//...
}
第二段注释如下:
c
#include "password.h"
#include "lcd1602.h"
#include "delay.h"
#include "24c02.h"
#include "eeprom.h"
static unsigned char Buf_PW[NUM_LEN]={0}; //存储输入密码的数组
unsigned char code_PW[8] ={'1','2','3','4','5','6','7','8'};//用户默认密码12345678
code unsigned char super_PW[8] ={'1','3','1','4','5','9','2','1'};//超级密码13145921
static unsigned char PW_index = 0; //输入密码的索引
unsigned char buf[20];
void PW_Init(void) //初始化密码
{
//...
}
//密码正确返回0xFF
u8 KeyInputPW(u8 _keyValue)
{
//...
}
//验证密码正误函数
//VIP密码正确返回0xFF ,
//默认密码正确返回0x0F
//密码错误返回0xEE
u8 Check_PW(void)
{
//...
}
//输入密码
u8 InputPassword(u8 _keyValue)
{
//...
}
u8 SetPassword(u8 _keyValue)
{
//...
}
矩阵键盘操作密码,lcd显示信息