基于51单片机LCD1602广告牌设计
【普中开发板】基于51单片机LCD1602广告牌设计( proteus仿真+程序+设计报告+讲解视频)
一、开发环境
仿真图:proteus8.17(有低版本)
程序编译器:keil 4/keil 5
编程语言:C语言
设计编号:P25
*二、主要功能*
LCD1602 广告牌功能要求
1、设计一款能够显示不同字符的LCD1602广告牌;
2、设计不同的字符切换效果(如静止显示、滚动显示等);
3、设计不同控制按钮,可以在不同效果间切换;
4、能够显示图形或自定义字符;
5、可以有其他扩展功能:控制滚动速度。
主要硬件 51单片机 LCD1602 独立按键
(目前仅完全适配普中51-实验板234,其他普中开发板型号需要接线)
需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。
*资料下载链接:*
*P系列单片机设计下载链接(复制到浏览器打开)*
*https://docs.qq.com/doc/DS2pPenNRaHB6SlR1*
*以下为本设计资料展示图:*
*三、实物图:*
*四、仿真设计*
打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。开始仿真后LCD1602默认静止显示,显示内容静止不动,静止显示指示灯亮。
独立按键按下滚动显示,LCD1602滚动显示。
滚动模式下可以控制滚动的速度。
*五、程序代码*
使用keil4或者keil5编译,代码有注释,可以结合视频理解代码含义。
// 管脚定义sbit LCD1602_RS = P2^6; // 数据/命令选择sbit LCD1602_RW = P2^5; // 读/写选择sbit LCD1602_E = P2^7; // 使能信号#define LCD1602_DATAPORT P0 // 数据端口// 按键定义sbit Stationary = P3^0; // 静止显示sbit Scrolling = P3^1; // 滚动显示sbit up = P3^2; // 滚动时间变快sbit down = P3^3; // 滚动时间变慢sbit STA_LED = P2^0; // 静态显示LEDsbit SCR_LED = P2^1; // 滚动显示LED// 自定义字符点阵数据(心形)u8 code custom_char[] = { 0x00, // 00000 0x00, // 00000 0x0A, // 01010 0x1F, // 11111 0x1F, // 11111 0x0E, // 01110 0x04, // 00100 0x00 // 00000};//长方形u8 code custom_char_sq[] = { 0x1F, // 11111 0x11, // 10001 0x11, // 10001 0x11, // 10001 0x11, // 10001 0x11, // 10001 0x1F, // 11111};//音符u8 code music_note[] = { 0x00, // 00000 0x02, // 00010 0x03, // 00011 0x02, // 00010 0x02, // 00010 0x0E, // 01110 0x0E, // 01110 0x00 // 00000};// 三角形u8 code triangle_up[] = { 0x00, // 00000 0x04, // 00100 0x0E, // 01110 0x1F, // 11111 0x00, // 00000 0x00, // 00000 0x00, // 00000 0x00 // 00000};// 显示内容u8 code first_line[] = {'W', 'E', 'L', 'C', 'O', 'M', 'E', ' ','T', 'O', ' ', 0,'C', 'H', 'N', 0,1,2,3};u8 code second_line[] = "Mode:Stationary ";// 全局变量u8 display_mode = 0; // 0-静止显示, 1-滚动显示u16 scroll_delay = 300; // 滚动延迟时间(ms)u8 start_index = 0; // 滚动起始索引u8 key_pressed = 0; // 按键按下标志u8 update_display = 1; // 显示更新标志u16 scroll_counter = 0; // 滚动计数器// 函数声明void delay_10us(u16 ten_us);void delay_ms(u16 ms);void lcd1602_init(void);void lcd1602_clear(void);void lcd1602_write_cmd(u8 cmd);void lcd1602_write_data(u8 dat);void lcd1602_create_char(u8 char_code, u8 *pattern);void lcd1602_show_static_text(void);void lcd1602_show_scrolling_text(void);void keyscan(void);void timer0_init(void);void update_speed_display(void);/******************************************************************************** 函数名: delay_ms* 功能: ms延时函数,ms=1时大约延时1ms*******************************************************************************/void delay_ms(u16 ms) { u16 i, j; for(i = ms; i > 0; i--) for(j = 110; j > 0; j--);}/******************************************************************************** 函数名: lcd1602_write_cmd* 功能: LCD1602写命令(8位模式)*******************************************************************************/void lcd1602_write_cmd(u8 cmd) { LCD1602_RS = 0; // 命令模式 LCD1602_RW = 0; // 写操作 LCD1602_E = 0; LCD1602_DATAPORT = cmd; // 发送命令 delay_ms(1); LCD1602_E = 1; // 使能信号上升沿 delay_ms(1); LCD1602_E = 0; // 完成写入}/******************************************************************************** 函数名: lcd1602_write_data* 功能: LCD1602写数据(8位模式)*******************************************************************************/void lcd1602_write_data(u8 dat) { LCD1602_RS = 1; // 数据模式 LCD1602_RW = 0; // 写操作 LCD1602_E = 0; LCD1602_DATAPORT = dat; // 发送数据 delay_ms(1); LCD1602_E = 1; // 使能信号上升沿 delay_ms(1); LCD1602_E = 0; // 完成写入}/******************************************************************************** 函数名: lcd1602_create_char* 功能: 创建自定义字符* 参数: char_code - 字符代码(0-7), pattern - 点阵数据指针*******************************************************************************/void lcd1602_create_char(u8 char_code, u8 *pattern) { u8 i; lcd1602_write_cmd(0x40 | (char_code << 3)); // 设置CGRAM地址 for(i = 0; i < 8; i++) { lcd1602_write_data(pattern[i]); // 写入点阵数据 }}/******************************************************************************** 函数名: lcd1602_init* 功能: LCD1602初始化(带自定义字符创建)*******************************************************************************/void lcd1602_init(void) { delay_ms(50); // LCD上电延时 // 初始化序列 lcd1602_write_cmd(0x30); delay_ms(5); lcd1602_write_cmd(0x30); delay_ms(1); lcd1602_write_cmd(0x30); delay_ms(1); lcd1602_write_cmd(0x38); // 8位接口,2行显示,5x7点阵 lcd1602_write_cmd(0x0C); // 显示开,无光标 lcd1602_write_cmd(0x06); // 写入后光标右移 lcd1602_write_cmd(0x01); // 清屏 delay_ms(10); // 清屏需要额外延时 // 创建自定义字符(字符代码0) lcd1602_create_char(0, custom_char); // 创建自定义字符(字符代码1) lcd1602_create_char(1, custom_char_sq); // 创建自定义字符(字符代码2) lcd1602_create_char(2, music_note); // 创建自定义字符(字符代码3) lcd1602_create_char(3, triangle_up); }/******************************************************************************** 函数名: lcd1602_show_static_text* 功能: 显示静态文本*******************************************************************************/void lcd1602_show_static_text(void) { u8 i; // 显示第一行 lcd1602_write_cmd(0x80); // 第一行起始位置 for(i = 0; i < 16; i++) { lcd1602_write_data(first_line[i]); } // 显示第二行 lcd1602_write_cmd(0xC0); // 第二行起始位置 for(i = 0; i < 16; i++) { lcd1602_write_data(second_line[i]); }}/******************************************************************************** 函数名: lcd1602_show_scrolling_text* 功能: 平滑滚动显示文本*******************************************************************************/void lcd1602_show_scrolling_text(void) { u8 i; u8 first_line_length = sizeof(first_line); // 显示第一行滚动文本 lcd1602_write_cmd(0x80); // 第一行起始位置 for(i = 0; i < 16; i++) { u8 char_index = (start_index + i) % first_line_length; lcd1602_write_data(first_line[char_index]); }文章有完整下载链接 // 更新起始位置 start_index = (start_index + 1) % first_line_length;}
*六、设计报告*
5808字设计报告,内容包括硬件设计、软件设计、软硬件框图、调试、结论等
*七、设计资料内容清单&&下载链接*
资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。
0、常见使用问题及解决方法–必读!!!!
1、程序
2、proteus仿真
3、功能要求
4、软硬件流程图
5、开题报告
6、设计报告
7、烧录工具
8、讲解视频
9、实物图
Altium Designer 安装破解
KEIL+proteus 单片机仿真设计教程
KEIL安装破解
Proteus元器件查找
Proteus安装
Proteus简易使用教程
单片机学习资料
相关数据手册
答辩技巧
设计报告常用描述
鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url
资料下载链接(可点击):
*https://docs.qq.com/doc/DS2pPenNRaHB6SlR1*
129