使用Proteus仿真软件设计一个开机登录程序,单片机选用ATmegga48.
基础要求:
1.程序启动后在LCD1602液晶屏上提示用户通过独立按键输入密码(6位)。
2.密码输入错误则在屏幕上提示密码错误,密码输入正确则在屏幕上提示密
码正确后等待约3秒后进入主界面,在屏幕中央显示HelloWorld。
附加任务:在原题基础上
1.LCD1602改用LCD12864液晶屏显示,独立按键改用4x4巨阵键盘。
2.首次开机可直接设置新密码,非首次开机提示用户输入密码,尽量使用内
部EEPROM。
3.进入主界面后用几个按键来实现修改之前保存的密码,修改E时屏幕上有光
标和相关提示。
实验报告:基于ATmega48的开机登录程序设计
一、实验目的
设计并实现一个基于ATmega48单片机的开机登录程序,通过Proteus仿真软件进行仿真,使用LCD12864液晶屏和4x4矩阵键盘,实现密码输入和验证功能,初次开机可以设置新密码,后续可以通过按键修改密码。
二、实验器材
- ATmega48单片机
- LCD12864液晶屏
- 4x4矩阵键盘
- Proteus仿真软件
- 按键和其他必要的电子元件
三、硬件连接
- LCD12864液晶屏连接:
- 数据线连接到单片机的PORTB
- 控制线(E、RS、RW、复位等)连接到PORTC的相应引脚
- 4x4矩阵键盘连接:
- 行和列引脚分别连接到单片机的PORTD的输入输出引脚
四、设计原理
1. 程序启动流程
- 程序启动后,在LCD12864液晶屏上提示用户输入密码(6位)。
- 初次开机允许用户设置新密码,密码保存在内部EEPROM中。
- 用户输入密码后,程序进行验证,若密码正确,显示“Hello World”欢迎界面;若密码错误,提示用户重新输入。
- 进入主界面后,用户可以通过特定按键修改之前保存的密码。
2. 程序功能模块
- LCD12864液晶屏的初始化与控制
- 液晶屏初始化函数
F12864_init()
,设定文本和图形显示区地址、光标形状和显示方式等。 - 液晶屏显示控制函数,包括写命令、写数据、清屏等功能。
- 液晶屏初始化函数
- EEPROM读写操作
- 通过内部EEPROM保存和读取密码,EEPROM_read()和EEPROM_write()函数实现读写操作。
- 密码输入与验证
- 用户通过矩阵键盘输入密码,程序实时显示输入的密码。
- 初次开机时,允许用户设置新密码,并保存在EEPROM中。
- 非初次开机时,读取EEPROM中的密码进行验证。
- 按键扫描
- 矩阵键盘按键扫描函数
get_key()
实现按键识别。
- 矩阵键盘按键扫描函数
- 修改密码
- 进入主界面后,用户可以通过按键进入修改密码模式,按步骤输入旧密码和新密码进行修改,并更新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
文章评论