您的位置:首页 > 财经 > 金融 > 中国建筑工程师网_青岛标志设计公司_seort什么意思_太原最新情况

中国建筑工程师网_青岛标志设计公司_seort什么意思_太原最新情况

2025/4/2 13:56:03 来源:https://blog.csdn.net/xiuye2015/article/details/146540139  浏览:    关键词:中国建筑工程师网_青岛标志设计公司_seort什么意思_太原最新情况
中国建筑工程师网_青岛标志设计公司_seort什么意思_太原最新情况
#ifndef __PRINTF_H__
#define __PRINTF_H__#include <stm32f10x.h>
#include <stdio.h>void printf_init(int baud);void send_data(char *str);#endif
#include "printf.h"unsigned char buf[128] = {0};
int flag = 0;//����stdio.h�е�printf����дfputc����
int fputc(int ch, FILE *file)
{USART_SendData(USART1, ch);while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);return ch;
}void gpio_init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);
}void printf_init(int baud)
{USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;gpio_init();RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);USART_InitStructure.USART_BaudRate = baud;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_Init(USART1, &USART_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);USART_Cmd(USART1, ENABLE);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}void send_data(char *str)
{while(*str != '\0'){USART_SendData(USART1, *str);str++;while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);}
}void USART1_IRQHandler(void)
{static int i = 0;if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET){buf[i++] = USART_ReceiveData(USART1);if(i >= 128 || buf[i - 1] == '\n'){buf[i-1] = '\0';i = 0;//printf("%s\r\n", buf);flag = 1;}USART_ClearITPendingBit(USART1, USART_IT_RXNE);}
}
#include <stm32f10x.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include "printf.h"typedef unsigned char byte;static const char radix16_numbers[] = {' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};void delay_ms(unsigned int ms)
{int n = 0;while (ms--){for (n = 0; n < 1000; n++);}
}void init_GPIOA_0_7()
{GPIO_InitTypeDef def;def.GPIO_Mode = GPIO_Mode_Out_PP;def.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;def.GPIO_Speed = GPIO_Speed_50MHz;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_Init(GPIOA, &def);def.GPIO_Mode = GPIO_Mode_IPU;def.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_Init(GPIOA, &def);
}int read_key_no()
{int rd = -1;byte A7_0 = 0xEF;GPIO_Write(GPIOA, 0x0F);rd = GPIO_ReadInputData(GPIOA);// printf("read_key_no %d %#X\r\n", __LINE__, rd);// 检测有按键按下if ((rd & 0xFF) != 0x0F){delay_ms(10); // 消抖// 第二次读取,看是否还按下按键rd = GPIO_ReadInputData(GPIOA);if ((rd & 0xFF) != 0x0F){// 计算是哪一个按键// 给字节高四位写入数据0xE 1110byte hb = 0xE;while (hb != 0xF) // 必须清零高四位否者,比较不成立时会无限循环{// printf("read_key_no %d hb = %#X\r\n", __LINE__, hb);// 低四位必须写入1,否则,会写入多少,就会读取多少A7_0 = hb << 4 | 0xF;// 给字节高四位写入数据 也就是 A4~A7GPIO_Write(GPIOA, A7_0);// 读值,这里面有个东西就是GPIO输出的值可以读取!!!输出多少读取就是多少!!!rd = GPIO_ReadInputData(GPIOA);// printf("read_key_no %d %#X\r\n", __LINE__, rd);switch (rd & 0xFF){case 0xE7:return 16;case 0xD7:return 15;case 0xB7:return 14;case 0x77:return 13;case 0xEB:return 12;case 0xDB:return 11;case 0xBB:return 10;case 0x7B:return 9;case 0xED:return 8;case 0xDD:return 7;case 0xBD:return 6;case 0x7D:return 5;case 0xEE:return 4;case 0xDE:return 3;case 0xBE:return 2;case 0x7E:return 1;}hb <<= 1;hb |= 1;hb &= 0xF; // 清除hb的高四位为0}}}return -1;
}int wait_key()
{int i = -1;delay_ms(10000);while ((i = read_key_no()) == -1){delay_ms(1000);}return i;
}int main()
{int idx = -1;// 密码长度int len = 10;int i = 0;char ch = '\0';// 密码char password[20] = {0};char password2[20] = {0};init_GPIOA_0_7();printf_init(9600);while (true){// 阻塞printf("choose 1 to set password!\r\n");delay_ms(10000);idx = wait_key();if (idx == 1){// 延时等待下一次输入,否则会很快输入完,没等你反应就结束了。delay_ms(10000);printf("password length: ");len = wait_key();printf("%d\r\n", len);printf("\r\npassword length is %d\r\n", len);if (len != -1){// 延时等待下一次输入,否则会很快输入完,没等你反应就结束了。delay_ms(10000);printf("please input password:\r\n");for (i = 0; i < len; i++){// 如果一直为-1就继续循环阻塞,相当于等待输入值idx = wait_key();ch = radix16_numbers[idx];password[i] = ch;printf("%c", ch);// 延时等待下一次输入,否则会很快输入完,没等你反应就结束了。delay_ms(10000);}password[len] = '\0';printf("\r\n");printf("finally,your password is:%s\r\n", password);wait_key();}}printf("please input password for login:\r\n");for (i = 0; i < len; i++){// 如果一直为-1就继续循环阻塞,相当于等待输入值idx = wait_key();ch = radix16_numbers[idx];password2[i] = ch;printf("%c", ch);// 延时等待下一次输入,否则会很快输入完,没等你反应就结束了。delay_ms(10000);}password2[len] = '\0';printf("\r\n");if (strcmp(password, password2) == 0){printf("success to login\r\n");}else{printf("fail to login\r\n");}delay_ms(5000);}return 0;
}
注意在mdk中勾选MicroLIB,否则无法输出显示内容。对应GPIO口 A7~A0:C4~C1R1~R4

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com