自己空闲的时间写了一下LCD1602的乱并口然后把各个IO口进行数据理合来输出控制LCD1602 有改善的请提出来
实验平台用的是野火指南者的STM32F103VET6的开发板
制作出来的实物图如下:
单片机源程序如下:
- /*****************************************************************
- * @attention 注意: 本程序是LCD1602的乱口的数据传输的驱动适用于任意口的IO口
- * IO口一定要先初始化 不然无法使用
- *
- **********************************************************************/
- #include "lcd1602_luan.h"
- // sbit RS=P3^5;
- // sbit RW=P3^6;
- // sbit EN=P3^4;
- //uchar tab1[]="2020-09-30 wek:3";//第一行显示0123456789abcdef共16个字符
- //uchar tab2[]=" V temp: . C"; //第二行显示时钟的模板
- uint8_t tab1_LUAN[]="C0:3.3V C1:3.3V ";//第一行显示0123456789abcdef共16个字符
- uint8_t tab2_LUAN[]="C2:3.3V C3:3.3V "; //第二行显示时钟的模板
- uint8_t tab3_LUAN[]="C4: . V C5: . V ";//第一行显示0123456789abcdef共16个字符
- uint8_t tab4_LUAN[]=" "; //第二行显示时钟的模板
- uint8_t tab5_LUAN[]=" ";//第一行显示0123456789abcdef共16个字符
- uint8_t tab6_LUAN[]="Temper: . "; //第二行显示时钟的模板
- uint8_t tab7_LUAN[]=" : : : ";//第一行显示0123456789abcdef共16个字符
- uint8_t tab8_LUAN[]=" Temper: . "; //第二行显示时钟的模板
- //数据处理函数
- /********************************************************************
- 函数功能:把一个BYTE输入到LCD的数据引脚。
- 入口参数:dat:要写入LCD的数据。
- 返 回:无。
- 备 注:无。
- ********************************************************************/
- /*
- void SetLcdData(uint8_t dat)
- {
- LCD_D0=((dat>>0)&0x01);
- LCD_D1=((dat>>1)&0x01);
- LCD_D2=((dat>>2)&0x01);
- LCD_D3=((dat>>3)&0x01);
- LCD_D4=((dat>>4)&0x01);
- LCD_D5=((dat>>5)&0x01);
- LCD_D6=((dat>>6)&0x01);
- LCD_D7=((dat>>7)&0x01);
- }
- */
- /**///////////////////////Pino Electronics////////////////////////**/
- void SetLcdData(uint8_t dat)
- {
- LCD_D0=((dat>>0)&0x01);
- LCD_D1=((dat>>1)&0x01);
- LCD_D2=((dat>>2)&0x01);
- LCD_D3=((dat>>3)&0x01);
- LCD_D4=((dat>>4)&0x01);
- LCD_D5=((dat>>5)&0x01);
- LCD_D6=((dat>>6)&0x01);
- LCD_D7=((dat>>7)&0x01);
- }
- /********************************************************************
- 函数功能:从LCD的数据引脚读取一个BYTE。
- 入口参数:无。
- 返 回:dat:从LCD读取的数据。
- 备 注:无。
- ********************************************************************/
- /*
- uint8_t GetLcdData(void)
- {
- u8 dat=0;
- if(LCD_D0) dat|=0x01;
- if(LCD_D1) dat|=0x02;
- if(LCD_D2) dat|=0x04;
- if(LCD_D3) dat|=0x08;
- if(LCD_D4) dat|=0x10;
- if(LCD_D5) dat|=0x20;
- if(LCD_D6) dat|=0x40;
- if(LCD_D7) dat|=0x80;
- return dat;
- }*/
- /**///////////////////////Pino Electronics////////////////////////**/
- /********************************************************************
- 函数功能:设置光标位置和AC寄存器地址。
- 入口参数:line:光标所在的行数,0表示第一行,1表示第二行;
- index:光标所在的列数,0表示第一列。
- 返 回:无。
- 备 注:1602屏可显示两行,每行16个字符,地址分别为00H-0FH,40H-4FH。
- ********************************************************************/
- /*
- void Lcd1602SetAC(u8 line, u8 index)
- {
- u8 base;
- if (line==1)
- base=0xC0;
- else if(line==0)
- base=0x80;
- else
- return;
- Lcd1602WriteCmd(base+index); //设置RAM地址
- }
- */
- /**///////////////////////Pino Electronics////////////////////////**/
- void LCD1602_LUAN_Write_com(uint8_t com)
- {
- RS_LUAN=0; RW_LUAN=0; EN_LUAN=0;
- // P0=com;
- SetLcdData(com);
- EN_LUAN=1;
- delay_ms(5);//必要的延时
- EN_LUAN=0; //下降沿,LCD1602开始工作
- }
- void LCD1602_LUAN_Write_data(uint8_t date)
- {
- RS_LUAN=1; RW_LUAN=0; EN_LUAN=0;
- // P0=date;
- SetLcdData(date);
- EN_LUAN=1; //先拉高
- delay_ms(5);//必要的延时
- EN_LUAN=0; //下降沿,开始写入有效数据
- }
- void LCD1602_LUAN_Init(void)
- {
-
- LCD1602_LUAN_Write_com(0x38); //16*2显示,5*7点阵,8位数据
- LCD1602_LUAN_Write_com(0x0c); //显示开,关光标;0x08为关显示
- LCD1602_LUAN_Write_com(0x06); //自动右移光标,0x04为左移光标
- LCD1602_LUAN_Write_com(0x80); //16*2显示,5*7点阵,8位数据
- LCD1602_LUAN_Write_com(0x01); //清除LCD的显示内容
- }
-
- void lcd1602_LUAN_dis1(void) //显示模板函数
- {
- uint8_t i; //定义一个变量i
- LCD1602_LUAN_Write_com(0x80); //定义第一行
- for(i=0;i<16;i++) //从数组1调用16个字符
- {
- LCD1602_LUAN_Write_data(tab1_LUAN[i]); //调用第一行数组数据
- delay_ms(5); //延时5毫秒
- }
- LCD1602_LUAN_Write_com(0x80+0x40); //定义第二行
- for(i=0;i<16;i++)//从数组调用16个字符
- {
- LCD1602_LUAN_Write_data(tab2_LUAN[i]); //从数组2调用16个字符
- delay_ms(5); //延时5毫秒
- }
- }
-
-
- void lcd1602_LUAN_dis2(void) //显示模板函数
- {
- uint8_t i; //定义一个变量i
- LCD1602_LUAN_Write_com(0x80); //定义第一行
- for(i=0;i<16;i++) //从数组1调用16个字符
- {
- LCD1602_LUAN_Write_data(tab3_LUAN[i]); //调用第一行数组数据
- delay_ms(5); //延时5毫秒
- }
- LCD1602_LUAN_Write_com(0x80+0x40); //定义第二行
- for(i=0;i<16;i++)//从数组调用16个字符
- {
- LCD1602_LUAN_Write_data(tab4_LUAN[i]); //从数组2调用16个字符
- delay_ms(5); //延时5毫秒
- }
- }
-
-
- void lcd1602_LUAN_dis3(void) //显示模板函数
- {
- uint8_t i; //定义一个变量i
- LCD1602_LUAN_Write_com(0x80); //定义第一行
- for(i=0;i<16;i++) //从数组1调用16个字符
- {
- LCD1602_LUAN_Write_data(tab7_LUAN[i]); //调用第一行数组数据
- delay_ms(5); //延时5毫秒
- }
- LCD1602_LUAN_Write_com(0x80+0x40); //定义第二行
- for(i=0;i<16;i++)//从数组调用16个字符
- {
- LCD1602_LUAN_Write_data(tab8_LUAN[i]); //从数组2调用16个字符
- delay_ms(5); //延时5毫秒
- }
- }
-
-
- // /******************LCD1602显示时间*********************/
- // void lcd1602_dis2() //显示时间
- // {
- // LCD1602_dw(2,7,shi/10) ; //第二行 的第8位装秒的十位
- // LCD1602_dw(2,8,shi%10) ; //第二行 的第9位装秒的个位
- // LCD1602_Write_com(0x80+0x40+9);//第二行 的第10个位置
- // LCD1602_Write_data(':');//送一个:
- // LCD1602_dw(2,10,fen/10) ; //第二行 的第14位装秒的十位
- // LCD1602_dw(2,11,fen%10) ; //第二行 的第15位装秒的个位
- // LCD1602_Write_com(0x80+0x40+12);//第二行 的第13个位置
- // LCD1602_Write_data(':');//送一个:
- // LCD1602_dw(2,13,miao/10) ; //第二行 的第14位装秒的十位
- // LCD1602_dw(2,14,miao%10) ; //第二行 的第15位装秒的个位
- // }
- void LCD1602_LUAN_GPIO_Init(void)
- {
-
- GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
- RCC_APB2PeriphClockCmd(LED_PORT_RCC_LUAN,ENABLE);//* 开启GPIO时钟
- /* 配置GPIO的模式和IO口 */
- GPIO_InitStructure.GPIO_Pin=LED_PIN1_LUAN; //选择你要设置的IO口---E端口
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//选择你要设置的IO模式
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置速度
- GPIO_Init(LED_PORT1_LUAN,&GPIO_InitStructure); /* 初始化GPIO ---E端口*/
- /************配置端口F***************/
- GPIO_InitStructure.GPIO_Pin=LED_PIN2_LUAN; //选择你要设置的IO口---F端口
- GPIO_Init(LED_PORT2_LUAN,&GPIO_InitStructure); /* 初始化GPIO ----F端口*/
- }
- /************************************************************
- 使用
- void main(void)
- {
- LCD1602_GPIO_Init();
- LCD1602_Init();
- lcd1602_dis1();
- }
- **********************************************************/
- /********************************************************************
- 函数功能:设置光标位置和AC寄存器地址。
- 入口参数:line:光标所在的行数,0表示第一行,1表示第二行;
- index:光标所在的列数,0表示第一列。
- date :数字 数字变为对应字符需要 |0x30即可 +0x30
- 返 回:无。
- 备 注:1602屏可显示两行,每行16个字符,地址分别为00H-0FH,40H-4FH。
- 特定位置显示特定数值
- ********************************************************************/
- void Lcd1602_LUAN_SetAC_Date(u8 line, u8 index,u8 date)
- {
- u8 base;
- if (line==1)
- base=0xC0;
- else if(line==0)
- base=0x80;
- else
- return;
- LCD1602_LUAN_Write_com(base+index); //设置RAM地址
- LCD1602_LUAN_Write_data(date); //输入要显示的数据
- }
- /*********************************************************
- 特定位置显示特定数值
- ************************************************************/
- //第一行的界面设置函数
- /********************************************************************
- 函数功能:设置光标位置和AC寄存器地址。第一行的界面设置函数
- 入口参数: index:光标所在的列数。
- date :数字 数字变为对应字符需要 |0x30即可 +0x30
- 返 回:无。
- 备 注:1602屏可显示两行,每行16个字符,地址分别为00H-0FH,40H-4FH。
- 特定位置显示特定数值
- ********************************************************************/
- void LCD1602_LUAN_Display_line1(u8 index,u8 date)
- {
- LCD1602_LUAN_Write_com(0x80+index); //设置RAM地址
- LCD1602_LUAN_Write_data(date); //输入要显示的数据
- delay_ms(5); //延时5毫秒
- }
- //第二行的界面设置函数
- /********************************************************************
- 函数功能:设置光标位置和AC寄存器地址。第二行的界面设置函数
- 入口参数: index:光标所在的列数。
- date :数字 数字变为对应字符需要 |0x30即可 +0x30
- 返 回:无。
- 备 注:1602屏可显示两行,每行16个字符,地址分别为00H-0FH,40H-4FH。
- 特定位置显示特定数值
- ********************************************************************/
- void LCD1602_LUAN_Display_line2(u8 index,u8 date)
- {
- LCD1602_LUAN_Write_com(0xC0+index); //设置RAM地址
- LCD1602_LUAN_Write_data(date); //输入要显示的数据
- delay_ms(5); //延时5毫秒
- }
- //自己做的稳定的不会闪烁的界面1
- void LCD1602_LUAN_Interface_1(void)
- {
- //第一行
- LCD1602_LUAN_Display_line1(0,'C');
- LCD1602_LUAN_Display_line1(1,'0');
- LCD1602_LUAN_Display_line1(2,':');
- LCD1602_LUAN_Display_line1(4,'.');
- LCD1602_LUAN_Display_line1(6,'V');
- LCD1602_LUAN_Display_line1(7,' ');
-
- LCD1602_LUAN_Display_line1(8,'C');
- LCD1602_LUAN_Display_line1(9,'1');
- LCD1602_LUAN_Display_line1(10,':');
- LCD1602_LUAN_Display_line1(12,'.');
- LCD1602_LUAN_Display_line1(14,'V');
- LCD1602_LUAN_Display_line1(15,' ');
-
- //第2行
- LCD1602_LUAN_Display_line2(0,'C');
- LCD1602_LUAN_Display_line2(1,'2');
- LCD1602_LUAN_Display_line2(2,':');
- LCD1602_LUAN_Display_line2(4,'.');
- LCD1602_LUAN_Display_line2(6,'V');
- LCD1602_LUAN_Display_line2(7,' ');
-
- LCD1602_LUAN_Display_line2(8,'C');
- LCD1602_LUAN_Display_line2(9,'3');
- LCD1602_LUAN_Display_line2(10,':');
- LCD1602_LUAN_Display_line2(12,'.');
- LCD1602_LUAN_Display_line2(14,'V');
- LCD1602_LUAN_Display_line2(15,' ');
-
- }
- //自己做的稳定的不会闪烁的界面2
- void LCD1602_LUAN_Interface_2(void)
- {
- uint8_t i=0;
- //第一行
- LCD1602_LUAN_Display_line1(0,'C');
- LCD1602_LUAN_Display_line1(1,'4');
- LCD1602_LUAN_Display_line1(2,':');
- LCD1602_LUAN_Display_line1(4,'.');
- LCD1602_LUAN_Display_line1(6,'V');
- LCD1602_LUAN_Display_line1(7,' ');
-
- LCD1602_LUAN_Display_line1(8,'C');
- LCD1602_LUAN_Display_line1(9,'5');
- LCD1602_LUAN_Display_line1(10,':');
- LCD1602_LUAN_Display_line1(12,'.');
- LCD1602_LUAN_Display_line1(14,'V');
- LCD1602_LUAN_Display_line1(15,' ');
-
- //第2行
- /*
- LCD1602_Display_line1(0,'C');
- LCD1602_Display_line1(1,'2');
- LCD1602_Display_line1(2,':');
- LCD1602_Display_line1(4,'.');
- LCD1602_Display_line1(6,'V');
- LCD1602_Display_line1(7,' ');
-
- LCD1602_Display_line1(8,'C');
- LCD1602_Display_line1(9,'3');
- LCD1602_Display_line1(10,':');
- LCD1602_Display_line1(12,'.');
- LCD1602_Display_line1(14,'V');
- LCD1602_Display_line1(15,' ');
- */
- //第2行
- LCD1602_LUAN_Write_com(0x80+0x40); //定义第二行
- for(i=0;i<16;i++)//从数组调用16个字符
- {
- LCD1602_LUAN_Write_data(tab4_LUAN[i]); //从数组2调用16个字符
- delay_ms(5); //延时5毫秒
- }
- }
- //自己做的稳定的不会闪烁的界面3
- void LCD1602_LUAN_Interface_3(void)
- {
- //第一行
- LCD1602_LUAN_Display_line1(0,'C');
- LCD1602_LUAN_Display_line1(1,'0');
- LCD1602_LUAN_Display_line1(2,':');
- LCD1602_LUAN_Display_line1(4,'.');
- LCD1602_LUAN_Display_line1(6,'V');
- LCD1602_LUAN_Display_line1(7,' ');
-
- LCD1602_LUAN_Display_line1(8,'C');
- LCD1602_LUAN_Display_line1(9,'1');
- LCD1602_LUAN_Display_line1(10,':');
- LCD1602_LUAN_Display_line1(12,'.');
- LCD1602_LUAN_Display_line1(14,'V');
- LCD1602_LUAN_Display_line1(15,' ');
-
- //第2行
- LCD1602_LUAN_Display_line2(0,'C');
- LCD1602_LUAN_Display_line2(1,'2');
- LCD1602_LUAN_Display_line2(2,':');
- LCD1602_LUAN_Display_line2(4,'.');
- LCD1602_LUAN_Display_line2(6,'V');
- LCD1602_LUAN_Display_line2(7,' ');
-
- LCD1602_LUAN_Display_line2(8,'C');
- LCD1602_LUAN_Display_line2(9,'3');
- LCD1602_LUAN_Display_line2(10,':');
- LCD1602_LUAN_Display_line2(12,'.');
- LCD1602_LUAN_Display_line2(14,'V');
- LCD1602_LUAN_Display_line2(15,' ');
- }
复制代码
全部资料51hei下载地址:
LCD1602实验乱口.7z
(356.21 KB, 下载次数: 19)
|