【TB作品】基于ATmega48的开机登录程序设计

使用Proteus仿真软件设计一个开机登录程序,单片机选用ATmegga48.
基础要求:
1.程序启动后在LCD1602液晶屏上提示用户通过独立按键输入密码(6位)。
2.密码输入错误则在屏幕上提示密码错误,密码输入正确则在屏幕上提示密
码正确后等待约3秒后进入主界面,在屏幕中央显示HelloWorld。
附加任务:在原题基础上
1.LCD1602改用LCD12864液晶屏显示,独立按键改用4x4巨阵键盘。
2.首次开机可直接设置新密码,非首次开机提示用户输入密码,尽量使用内
部EEPROM。
3.进入主界面后用几个按键来实现修改之前保存的密码,修改E时屏幕上有光
标和相关提示。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实验报告:基于ATmega48的开机登录程序设计

一、实验目的

设计并实现一个基于ATmega48单片机的开机登录程序,通过Proteus仿真软件进行仿真,使用LCD12864液晶屏和4x4矩阵键盘,实现密码输入和验证功能,初次开机可以设置新密码,后续可以通过按键修改密码。

二、实验器材

  1. ATmega48单片机
  2. LCD12864液晶屏
  3. 4x4矩阵键盘
  4. Proteus仿真软件
  5. 按键和其他必要的电子元件

三、硬件连接

  1. LCD12864液晶屏连接:
    • 数据线连接到单片机的PORTB
    • 控制线(E、RS、RW、复位等)连接到PORTC的相应引脚
  2. 4x4矩阵键盘连接:
    • 行和列引脚分别连接到单片机的PORTD的输入输出引脚

四、设计原理

1. 程序启动流程

  • 程序启动后,在LCD12864液晶屏上提示用户输入密码(6位)。
  • 初次开机允许用户设置新密码,密码保存在内部EEPROM中。
  • 用户输入密码后,程序进行验证,若密码正确,显示“Hello World”欢迎界面;若密码错误,提示用户重新输入。
  • 进入主界面后,用户可以通过特定按键修改之前保存的密码。

2. 程序功能模块

  1. LCD12864液晶屏的初始化与控制
    • 液晶屏初始化函数F12864_init(),设定文本和图形显示区地址、光标形状和显示方式等。
    • 液晶屏显示控制函数,包括写命令、写数据、清屏等功能。
  2. EEPROM读写操作
    • 通过内部EEPROM保存和读取密码,EEPROM_read()和EEPROM_write()函数实现读写操作。
  3. 密码输入与验证
    • 用户通过矩阵键盘输入密码,程序实时显示输入的密码。
    • 初次开机时,允许用户设置新密码,并保存在EEPROM中。
    • 非初次开机时,读取EEPROM中的密码进行验证。
  4. 按键扫描
    • 矩阵键盘按键扫描函数get_key()实现按键识别。
  5. 修改密码
    • 进入主界面后,用户可以通过按键进入修改密码模式,按步骤输入旧密码和新密码进行修改,并更新EEPROM中的密码。

五、程序原理

// LCD12864初始化函数
void F12864_init(void) {
    // 数据方向设置
    DDRB = 0xFF;
    DDRC = 0xFF;
    // 复位
    REST_0;
    delay_nms(20);
    REST_1;

    // 设置文本显示区首地址、宽度和图形显示区首地址、宽度
    write_ddc(0x40, 0x00, 0x00);
    write_ddc(0x41, 128 / 8, 0x00);
    write_ddc(0x42, 0x00, 0x08);
    write_ddc(0x43, 128 / 8, 0x00);

    // 光标形状、显示方式和显示开关设置
    write_commond(0xA0);
    write_commond(0x80);
    write_commond(0x98);
    write_commond(0x9F);
}

// 读取EEPROM中的密码
void read_pwd(void) {
    for (char i = 0; i < 6; i++) {
        SYSTEM_PASSWORD[i] = EEPROM_read(0x0040 + i);
    }
}

// 写入密码到EEPROM
void write_pwd(void) {
    for (char i = 0; i < 6; i++) {
        EEPROM_write(0x0040 + i, SYSTEM_PASSWORD[i]);
    }
}

// 主程序
void main(void) {
    // 初始化
    F12864_init();
    F12864_clear();

    // 判断是否为首次开机
    if (get_vaild_pwd() == 0) {
        // 设置新密码流程
        set_new_password();
    } else {
        // 读取密码并进行验证
        read_pwd();
        verify_password();
    }

    // 进入主界面,允许用户修改密码
    enter_main_interface();
}

// 延时函数
void delay_nms(unsigned int time) {
    for (; time > 0; time--) {
        for (int i = 0; i < 500; i++);
    }
}

六、实验总结

通过本次实验,我们熟悉了ATmega48单片机的基本操作,掌握了LCD12864液晶屏的驱动方法和EEPROM的读写操作。通过Proteus仿真,验证了设计的开机登录程序功能的实现。通过合理的模块化设计,使得程序结构清晰、功能完善,为后续类似设计提供了参考和借鉴。

资源代码

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

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

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

相关文章

基于RK3588的8路摄像头实时全景拼接

基于RK3588的8路摄像头实时全景拼接 输入&#xff1a;2路csi转8路mpi的ahd摄像头&#xff0c;分辨率1920 * 1080 8路拼接结果&#xff1a; 6路拼接结果&#xff1a; UI界面&#xff1a; UI节目设计原理

数字时代如果你的企业还未上线B端系统助力则后果很严重

**数字时代如果你的企业还未上线B端系统助力则后果很严重** 数字化浪潮席卷全球&#xff0c;企业对于数字化转型的重视程度日益提高。B端系统&#xff0c;作为企业数字化转型的核心组成部分&#xff0c;其重要性不言而喻。如果你的企业还未上线B端系统助力&#xff0c;那么后果…

异步主从复制

主从复制的概念 主从复制是一种在数据库系统中常用的数据备份和读取扩展技术&#xff0c;通过将一个数据库服务器&#xff08;主服务器&#xff09;上的数据变更自动同步到一个或多个数据库服务器&#xff08;从服务器&#xff09;上&#xff0c;以此来实现数据的冗余备份、读…

2024年6月后2周重要的大语言模型论文总结:LLM进展、微调、推理和对齐

本文总结了2024年6月后两周发表的一些最重要的大语言模型论文。这些论文涵盖了塑造下一代语言模型的各种主题&#xff0c;从模型优化和缩放到推理、基准测试和增强性能。 LLM进展与基准 1、 BigCodeBench: Benchmarking Code Generation with Diverse Function Calls and Com…

图文识别0难度上手~基于飞浆对pdf简易ocr并转txt

前言 本篇pdf适用windows对视觉识别0基础的的纯小白用户。大佬请绕道~~ 注意&#xff1a; 本项目pdf的ocr对于表格、画图文字&#xff0c;水印等干扰没做任何处理&#xff0c;因此希望各位使用该功能的pdf尽量不要含有这些干扰项&#xff0c;以免影响翻译效果。 流程 1.构建…

收银系统源码-收银台副屏广告

1. 功能描述 门店广告&#xff1a;双屏收银机&#xff0c;副屏广告&#xff0c;主屏和副屏同步&#xff0c;总部可统一控制广告位&#xff0c;也可以给门店开放权限&#xff0c;门店独立上传广告位&#xff1b; 2.适用场景 新店开业、门店周年庆、节假日门店活动宣传&#x…

Nginx实战:nginx性能压测(ab)

在nginx的生产实践中,不管是服务上线,还是性能优化,都会遇到需要对nginx的性能压测,本文介绍一个简单的压测工具:ab命令 ab(Apache Bench)是一个常用的HTTP压力测试工具,可以用来测试Nginx的性能和压力。ab命令可以指定并发请求数、请求数、请求类型等参数,并输出测试…

SpringBoot 启动流程四

SpringBoot启动流程四 前面这个创建对象是初始化SpringApplication对象 是加载了SpringBoot程序的所有相关配置 我们接下来要将这个run方法 run过程是一个运行 初始化容器 我们看我们的运行结果是得到一个ConfigurableApplicationContext对象 package com.bigdata1421.star…

MySQL 集群

MySQL 集群有多种类型&#xff0c;每种类型都有其特定的用途和优势。以下是一些常见的 MySQL 集群解决方案&#xff1a; 1. MySQL Replication 描述&#xff1a;MySQL 复制是一种异步复制机制&#xff0c;允许将一个 MySQL 数据库的数据复制到一个或多个从服务器。 用途&…

医疗器械企业CRM系统推荐清单(2024版)

近年来&#xff0c;我国医疗器械行业在国家政策支持、医改深入、人口老龄化和消费能力提升等因素推动下&#xff0c;得到了快速发展&#xff0c;正日益成为创新能力增强、市场需求旺盛的朝阳产业。然而&#xff0c;行业也面临价格压力、市场份额重新分配、合规风险以及产品和服…

mac 安装nvm的教程

在macOS上切换Node.js版本&#xff0c;可以使用nvm&#xff08;Node Version Manager&#xff09;。以下是安装nvm和切换Node.js版本的步骤&#xff1a; 安装nvm 下载方式 终端复制输入&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.…

Odoo14使用hiPrint实现打印功能

使用hiPrint代替odoo原生的打印功能 可以实现快速自定义修改打印模板&#xff0c;无需每次都调整打印模板 无论是表单分页还是各种需求&#xff0c;都能满足 目录 1 使用命令创建新的模块&#xff0c;无用的demo文件可以删除掉 2 新建“打印模板”&#xff0c;用于保存打印…

MySQL表的增删改查(CRUD)

MySQL表的增删改查&#xff08;CRUD&#xff09; 文章目录 MySQL表的增删改查&#xff08;CRUD&#xff09;1. Create1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入否则更新1.4 替换 2. Retrieve2.1 SELECT 列2.1.1 全列查询2.1.2 指定列查询2.1.3 查询字段为表达式…

嵌入式系统中状态机实现详解

嵌入式开发中系统经常处于某种状态,如何处理呢?接下来分析一下,状态机的实现无非就是 3 个要素:状态、事件、响应。转换成具体的行为就 3 句话。 发生了什么事? 现在系统处在什么状态? 在这样的状态下发生了这样的事,系统要干什么? 用 C 语言实现状态机主要有 3 种方法…

JVM专题之垃圾收集算法

标记清除算法 第一步:标记 (找出内存中需要回收的对象,并且把它们标记出来) 第二步:清除 (清除掉被标记需要回收的对象,释放出对应的内存空间) 缺点: 标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需 要分配较大对象时,无法找到…

spark on k8s两种方式的原理与对比

spark on k8s两种方式的原理与对比 1、spark on k8s 方式 spark-submit可以直接用来向 Kubernetes 集群提交 Spark 应用&#xff0c;提交机制如下&#xff1a; 1、Spark 创建一个在Kubernetes pod中运行的 Spark 驱动程序。 2、驱动程序创建在 Kubernetes Pod 中运行的执行器…

阿里云服务器配置、搭建(针对Spring boot和MySQL项目)

这是一篇极其详细且痛苦的文章&#xff0c;还是在两位后端的大佬手把手教导下、以及我找遍全网所有资料、问了N遍AI、甚至直接申请阿里云工单一对一询问客服一整天、连续清空再上传反复30多次整个项目jar包......总结出来的终极要人命踩坑的问题总结 一、首先购买服务器 其实不…

25.【C语言】循环结构之for 上

1.基本使用 类比while 在while循环中&#xff0c;有三个不可或缺的部分&#xff1a;初始化&#xff0c;判断部分&#xff0c;调整部分 int i 0;//初始化 while (i < 10)//判断部分 {……i;//调整部分 }三个部分太分散&#xff0c;用for循环可集为一体&#xff0c;简洁 …

dotnet ef工具使用

设置工具安装目录 dotnet tool install dotnetsay --tool-path G:\dotnet-tools安装 dotnet tool install --global dotnet-ef更新 dotnet tool update --global dotnet-ef查看版本 dotnet ef --version创建迁移文件 # 只有一个dbcontext dotnet ef migrations add init #…