|
实现了基本的LCD1602驱动,包括了显示字符、字符串、整数和小数,以及显示位置的控制。
其中,lcd_busy()函数用来检测LCD是否忙,
lcd_write_cmd()函数用来发送命令,
lcd_write_data()函数用来发送数据,
lcd_set_pos()函数用来设置显示位置,
lcd_show_char()函数用来显示单个字符,
lcd_show_str()函数用来显示字符串,
lcd_show_int()函数用来显示整数,
lcd_show_float()函数用来显示浮点数。
- #include <reg52.h> //包含了STC89C52的头文件
- #include <stdio.h>
- sbit RS = P3 ^ 5; // 将寄存器选择引脚RS定义为P3.5
- sbit RW = P3 ^ 6; // 将读写选择引脚RW定义为P3.6
- sbit EN = P3 ^ 4; // 将使能引脚EN定义为P3.4
- void lcd_show_int(unsigned char x, unsigned char y, int num);
- void lcd_show_float(unsigned char x, unsigned char y, float num);
- void lcd_show_str(unsigned char x, unsigned char y, char *str);
- void lcd_show_char(unsigned char x, unsigned char y, unsigned char dat);
- void lcd_init();
- void lcd_set_pos(unsigned char x, unsigned char y);
- void lcd_write_data(unsigned char dat);
- void lcd_write_cmd(unsigned char cmd);
- void lcd_busy();
- void delay(unsigned int i);
- void main()
- {
- lcd_init(); // 初始化LCD
- lcd_show_str(0, 0, "Hello World!"); // 显示字符串
- lcd_show_int(0, 1, 123); // 显示整数
- lcd_show_float(6, 1, 596.0422); // 显示浮点数
- while (1)
- ; // 循环等待
- }
- void delay(unsigned int i)
- { // 延迟函数,i为延迟时间
- unsigned int j;
- for (; i > 0; i--) {
- for (j = 0; j < 125; j++)
- ;
- }
- }
- void lcd_busy()
- { // 判断LCD是否忙的函数
- unsigned char busy;
- P0 = 0xFF; // 将P0口设为输入模式
- RS = 0; // RS置为低电平
- RW = 1; // RW置为高电平
- EN = 0; // 使能引脚EN置为低电平
- delay(5); // 延时5ms
- do {
- EN = 1; // 使能引脚EN置为高电平
- busy = P0; // 读取P0口的值
- EN = 0; // 使能引脚EN置为低电平
- } while (busy & 0x80); // 判断busy的最高位是否为1
- P0 = 0x00; // 将P0口设为输出模式
- }
- void lcd_write_cmd(unsigned char cmd)
- { // 发送命令的函数
- lcd_busy(); // 判断LCD是否忙
- RS = 0; // RS置为低电平
- RW = 0; // RW置为低电平
- EN = 0; // 使能引脚EN置为低电平
- P0 = cmd; // 将命令写入P0口
- EN = 1; // 使能引脚EN置为高电平
- EN = 0; // 使能引脚EN置为低电平
- }
- void lcd_write_data(unsigned char dat)
- { // 发送数据的函数
- lcd_busy(); // 判断LCD是否忙
- RS = 1; // RS置为高电平
- RW = 0; // RW置为低电平
- EN = 0; // 使能引脚EN置为低电平
- P0 = dat; // 将数据写入P0口
- EN = 1; // 使能引脚EN置为高电平
- EN = 0; // 使能引脚EN置为低电平
- }
- void lcd_set_pos(unsigned char x, unsigned char y)
- { // 设置显示位置的函数
- unsigned char pos;
- if (y == 0) { // 第一行
- pos = 0x80 + x; // 计算显示位置
- } else { // 第二行
- pos = 0xC0 + x; // 计算显示位置
- }
- lcd_write_cmd(pos); // 发送命令,设置显示位置
- }
- void lcd_init()
- { // LCD初始化函数
- lcd_write_cmd(0x38); // 设置LCD显示模式为2行,5*7点阵
- lcd_write_cmd(0x0C); // 显示开,不显示光标,不闪烁
- lcd_write_cmd(0x06); // 文字不动,地址自动+1
- lcd_write_cmd(0x01); // 清屏
- }
- void lcd_show_char(unsigned char x, unsigned char y, unsigned char dat)
- { // 显示单个字符的函数
- lcd_set_pos(x, y); // 设置显示位置
- lcd_write_data(dat); // 发送数据,显示字符
- }
- void lcd_show_str(unsigned char x, unsigned char y, char *str)
- { // 显示字符串的函数
- lcd_set_pos(x, y); // 设置显示位置
- while (*str) { // 当字符串不为空
- lcd_write_data(*str++); // 发送数据,显示字符
- }
- }
- /*
- 参数1 x:第几行
- 参数2 y:第几列
- 参数3 num:具体数值
- */
- void lcd_show_float(unsigned char x, unsigned char y, float num)
- { // 显示浮点数的函数
- int integer = (int)num; // 整数部分
- int integer2 = integer;
- int decimal = (int)((num - integer) * 100); // 小数部分,保留2位
- int wei_cout = 0;
- while (integer2) {
- integer2 /= 10;
- wei_cout++;
- }
- // 计算整数部分位数
- lcd_show_int(x, y, integer); // 先显示整数部分
- lcd_write_data('.'); // 小数点
- if (wei_cout == 0) { // 如果整数部分=0
- if (decimal > 10) { // 如果小数部分>0.1
- lcd_show_int(x + wei_cout + 2, y, decimal); // 再显示小数部分
- } else { // 如果小数部分<=0.1
- lcd_show_int(x + wei_cout + 2, y, 0);
- lcd_show_int(x + wei_cout + 3, y, decimal);
- }
- } else { // 如果整数部分大于0
- // lcd_show_int(x + wei_cout + 1, y, decimal); // 再显示小数部分
- if (decimal > 10) { // 如果小数部分>0.1
- lcd_show_int(x + wei_cout + 1, y, decimal); // 再显示小数部分
- } else { // 如果小数部分<=0.1
- lcd_show_int(x + wei_cout + 1, y, 0);
- lcd_show_int(x + wei_cout + 2, y, decimal);
- }
- }
- }
- void lcd_show_int(unsigned char x, unsigned char y, int num)
- { // 显示整数的函数
- char str[16]; // 定义一个字符串数组
- sprintf(str, "%d", num); // 将整数转换为字符串
- lcd_show_str(x, y, str); // 调用显示字符串的函数,显示整数
- }
复制代码 在主函数中,先调用lcd_init()函数初始化LCD,然后调用各个显示函数,最后进入循环等
|
|