【普中开发板】基于51单片机LCD1602广告牌设计( proteus仿真+程序+设计报告+讲解视频)

一、开发环境

仿真图:proteus8.17(有低版本)

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:P25

*二、主要功能*

LCD1602 广告牌功能要求

1、设计一款能够显示不同字符的LCD1602广告牌;

2、设计不同的字符切换效果(如静止显示、滚动显示等);

3、设计不同控制按钮,可以在不同效果间切换;

4、能够显示图形或自定义字符;

5、可以有其他扩展功能:控制滚动速度。

主要硬件 51单片机 LCD1602 独立按键

(目前仅完全适配普中51-实验板234,其他普中开发板型号需要接线)

img

需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。

*资料下载链接:*

*P系列单片机设计下载链接(复制到浏览器打开)*

*https://docs.qq.com/doc/DS2pPenNRaHB6SlR1*

*以下为本设计资料展示图:*

*三、实物图:*

img

*四、仿真设计*

打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。开始仿真后LCD1602默认静止显示,显示内容静止不动,静止显示指示灯亮。

img

独立按键按下滚动显示,LCD1602滚动显示。

img

滚动模式下可以控制滚动的速度。

*五、程序代码*

使用keil4或者keil5编译,代码有注释,可以结合视频理解代码含义。

img

// 管脚定义
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;      // 静态显示LED
sbit 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字设计报告,内容包括硬件设计、软件设计、软硬件框图、调试、结论等

img

*七、设计资料内容清单&&下载链接*

资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。

img

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*

更多资源 点击下方链接:

*https://docs.qq.com/sheet/DS0xIa0llTmtNakRW*

微信公众号:嘉盛单片机

img