金牌会员
 
- 积分
- 1088
- 金钱
- 1088
- 注册时间
- 2017-3-10
- 在线时间
- 172 小时
|
16金钱
我驱动在网上找的,按步骤对照过手册,就是最后运行的时候LCD不显示,背光没问题,我怀疑是发送给LCD命令的时候没成功,所以像写0,开启显示这些都没反应。但写命令是按照手册写的。不知道问题出在哪里- #include "includes.h"
- #include "ziku.h"
- LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; //定义用于定义所以引脚为输出的变量。
- /*--------------------------------------------------------------*/
- //函数名称: delay
- //输入参数: 时间参数t
- //输出参数: 无
- //函数功能: 延时子程序
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void delay (uint us)
- {
- while(us--);
- }
- /*--------------------------------------------------------------*/
- //函数名称: IOInitOut
- //输入参数: 无
- //输出参数: 无
- //函数功能: 把所有端口初始化为推挽输出模式的函数。
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void IOInitOut(void)
- {
- LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
- LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
- LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
- LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH);
-
- GPIO_InitStruct.Pin = Data_Ora;
- GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
- LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- GPIO_InitStruct.Pin = RST|EN_LED;
- GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
- LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
-
- GPIO_InitStruct.Pin = RS|RW|EN;
- GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
- LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
-
- GPIO_InitStruct.Pin = CS1|CS2;
- GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
- GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
- LL_GPIO_Init(GPIOH, &GPIO_InitStruct);
-
-
- }
- /*--------------------------------------------------------------*/
- //函数名称: IOInitIn
- //输入参数: 无
- //输出参数: 无
- //函数功能: 把数据引脚初始化为浮空输入的函数。
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void IOInitIn(void)
- {
- GPIO_InitStruct.Pin = Data_Ora;
- GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
- LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
- LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-
- }
- /*--------------------------------------------------------------*/
- //函数名称: LCD_Busy_Check
- //输入参数: 无
- //输出参数: 无
- //函数功能: 判忙函数。
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_Busy_Check (void)
- {
- // LOG_INFO("LCD_Busy_Check");
- u16 temp;
- IOInitIn(); //把数据引脚定义为浮空输入;
- LL_GPIO_ResetOutputPin(GPIOC,RS); //RS = 0.
- LL_GPIO_SetOutputPin(GPIOC, RW); //RW = 1.
- do{
- LL_GPIO_SetOutputPin(GPIOC, EN); //EN = 1.
- temp = LL_GPIO_ReadInputPort(GPIOA);//只要位7的值,位7是忙标志位。
- delay(2500);
- LL_GPIO_ResetOutputPin(GPIOC,EN); //EN = 0;
- // temp=0x80&temp;
- }while(temp&0x0001);
- //LOG_INFO("LCD_Busy_Check_end");
- IOInitOut(); //把所有引脚定义为输出。
- }
- /*--------------------------------------------------------------*/
- //函数名称: LCD_Write_DatorCmd
- //输入参数: 数据或命令 内容
- //输出参数: 无
- //函数功能: 写入数据或命令函数
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_Write_DatorCmd (uchar dat_comm,uchar content)
- {
- LCD_Busy_Check();
- if(dat_comm)
- LL_GPIO_SetOutputPin(GPIOC,RS); //RS = 1.
- if(dat_comm == 0)
- LL_GPIO_ResetOutputPin(GPIOC,RS); //RS = 0.
- LL_GPIO_ResetOutputPin(GPIOC, EN); //EN = 0;
- LL_GPIO_ResetOutputPin(GPIOC, RW); //RW = 0.
- delay(50);
- // LL_GPIO_SetOutputPin(GPIOC,EN); //EN = 1.
- GPIOA->ODR=((GPIOA->ODR & 0xff00) | content);
- delay(50);
- LL_GPIO_SetOutputPin(GPIOC,EN); //EN = 1.
- LL_GPIO_ResetOutputPin(GPIOC,EN); //EN = 0;
-
- }
- /*--------------------------------------------------------------*/
- //函数名称:LCD_read_dat
- //输入参数: 无
- //输出参数: 数据
- //函数功能: 读出数据
- //其他说明: 1、先只须空读一次, 以后接着就无须空读;2、空读之后读出的数据都是有效的!!!
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- unsigned char LCD_read_dat(void)
- {
- uchar Read_Dat;
- LCD_Busy_Check ();
- IOInitIn(); //把数据引脚定义为浮空输入;
- LL_GPIO_ResetOutputPin(GPIOC, EN);
- LL_GPIO_SetOutputPin(GPIOC, RS);
- LL_GPIO_SetOutputPin(GPIOC, RW);
- LL_GPIO_SetOutputPin(GPIOH, CS1);
- LL_GPIO_SetOutputPin(GPIOH, CS2);
- LL_GPIO_SetOutputPin(GPIOC, EN);
- Read_Dat = (u8)(LL_GPIO_ReadInputPort(GPIOA) & 0x00ff);
- delay(50);
- LL_GPIO_ResetOutputPin(GPIOC, EN);
- IOInitOut(); //把所有引脚定义为输出。
- return Read_Dat;
- }
- //*--------------------------------------------------------------*/
- //函数名称: LCD_write_dat
- //输入参数: 数据
- //输出参数: 无
- //函数功能: 写点阵函数
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_write_dat (uchar data1, uchar data2)
- {
- uchar i,j;
- LL_GPIO_SetOutputPin(GPIOH, CS1);
- LL_GPIO_SetOutputPin(GPIOH, CS2);
- LCD_Write_DatorCmd(comm, Display_On);
- for(j = 0; j < 1; j++)
- {
- LCD_Write_DatorCmd (comm, X_Page_Addr+j);
- LCD_Write_DatorCmd (comm, Start_Line);
- LCD_Write_DatorCmd (comm, Y_Col_Addr);
- for(i = 0; i < 1; i++)
- {
- LCD_Write_DatorCmd (dat, data1);
- LCD_Write_DatorCmd (dat, data2);
- }
- }
- }
- /*--------------------------------------------------------------*/
- //函数名称: LCD_byte_pos
- //输入参数: x: 0 - 7 (行);y: 0 -127 (列)
- //输出参数: 无
- //函数功能: 液晶字节定位(8*1)
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_byte_pos(unsigned char x, unsigned char y)
- {
- if(y < 64) LCD_sel_left //左半屏
- else {y -= 64; LCD_sel_right} //右半屏
- LCD_Write_DatorCmd(comm, X_Page_Addr + x); //页地址0-7
- LCD_Write_DatorCmd(comm, Y_Col_Addr + y); //列地址0-63
- }
- /*--------------------------------------------------------------*/
- //函数名称: LCD_char_pos
- //输入参数: x: 0 - 7 (行);y: 0 -15 (列)
- //输出参数: 无
- //函数功能: 液晶字符定位(8*8)
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_char_pos(unsigned char x, unsigned char y)
- {
- y <<= 3;//16*8=128,左移三位相当于乘以8
- LCD_byte_pos(x, y);//字节定位函数
- }
- /*--------------------------------------------------------------*/
- //函数名称: LCD_Write_HanZ
- //输入参数: 位置(x,y) 大小8xl*yl row_xl行(每行row_yl个
- //输出参数: 无
- //函数功能: /*---指定位置(x,y)显示row_xl行(每行row_yl个)汉字(大小8xl*yl)---*/
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_Write_HanZ (uchar x,uchar y,uchar xl,uchar yl,uchar row_xl,uchar row_yl,const uchar *chn)
- {
- uchar i,j,k,l,a;
- LCD_Write_DatorCmd (comm, Display_On);
- for(l = 0; l < row_xl; l++)
- {
- for(k = 0; k < row_yl; k++)
- {
- for(j = 0;j < xl; j++)
- {
- LCD_Write_DatorCmd (comm,X_Page_Addr + x + l*xl + j);
- LCD_Write_DatorCmd (comm,Start_Line);
- LCD_Write_DatorCmd (comm,Y_Col_Addr + y + k*yl);
- a = l*xl*yl*row_yl + k*xl*yl + j*yl;
- for(i = 0; i < yl; i++)
- LCD_Write_DatorCmd(dat, chn[a+i]);
- }
- }
- }
- }
- /*--------------------------------------------------------------*/
- //函数名称: LCD_printNumandChar
- //输入参数: x: 0 - 3 (行);y: 0 -15 (列)
- //输出参数: 无
- //函数功能: 液晶字符输出(8*16字体)
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_printNumandChar (unsigned char x, unsigned char y, const uchar *h_dat)
- {
- unsigned char i, j;
- for(j = 0; j < 2; j++)
- {
- LCD_char_pos((x * 2 + j), y);//LCD_char_pos是0-7的行显示(x * 2 + j)为此范围
- for(i = 0; i < 8; i++) LCD_Write_DatorCmd(dat, (h_dat[8 * j + i]));
- }
- }
- ///*--------------------------------------------------------------*/
- ////函数名称: LCD_printstring
- ////输入参数: x: 0 - 3 (行);y: 0 -15 (列);字符串,字符串长度num
- ////输出参数: 无
- ////函数功能: 液晶字符串输出(8*16字体)
- ////其他说明:
- ////编写日期:
- ////编写人:
- ///*--------------------------------------------------------------*/
- //
- void LCD_printstring(unsigned char x, unsigned char y, const uchar *h_dat, unsigned char num)
- {
- unsigned char i;
- for(i = 0; i < num; i++)
- {
- LCD_printNumandChar(x, y++, h_dat); //y++会变换左右屏显示不用认为指定
- h_dat += 16;
- }
- }
- /*--------------------------------------------------------------*/
- //函数名称: LCD_Show_Num8and16Char
- //输入参数: x: 0 - 3 (行);y: 0 -15 (列);字符串
- //输出参数: 无
- //函数功能: 查表显示8*16单个字体
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_Show_Num8and16Char(uchar x, uchar y, const uchar *character)
- {
- uchar i;
- for(i = 0; i < GB_8_num; i++)
- {
- if( (GB_8[i].Index == character[0]) )
- break;
- }
- LCD_printNumandChar(x, y, GB_8[i].Msk);
- }
- /*--------------------------------------------------------------*/
- //函数名称: LCD_Show_Num8and16CharStrings
- //输入参数: x: 0 - 3 (行);y: 0 -15 (列);字符串
- //输出参数: 无
- //函数功能: 查表显示8*16字符串
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_Show_Num8and16CharStrings(uchar x, uchar y, const uchar *characters)
- {
- // while(*characters)
- // {
- // if((*characters) > '9' || (*characters) < '0')
- // break;
- // LCD_Show_Num8and16Char(x, y++, characters);
- // characters = characters + 1;
- // if((*characters) > '9' || (*characters) < '0')
- // continue;
- //
- // } continue 用于while循环没有效果!
- for(; *characters != '\0'; *characters++)
- {
-
- if((*characters) > 128)// 显示除汉字以外的任何字符
- {
- y ++;
- continue;
- }
- LCD_Show_Num8and16Char(x, y++, characters);
- }
- }
- /*--------------------------------------------------------------*/
- //函数名称:LCD_printch
- //输入参数: x: 0 - 3(行) y: 0 -7 (列) 汉字字符
- //输出参数: 无
- //函数功能: 液晶汉字输出(16*16字体)
- //其他说明:取码规则: 低位在前, 列行扫描, 阴码(1-亮, 0-灭)
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_printch(uchar x,uchar y, const uchar *h_dat)
- {
- unsigned char i, j;
- x <<= 1;
- y <<= 1;
- for(j = 0; j < 2; j++)
- {
- LCD_char_pos((x + j), y);
- for(i = 0; i < 16; i++) LCD_Write_DatorCmd(dat, (h_dat[16 * j + i]));
- }
- }
- /*--------------------------------------------------------------*/
- //函数名称:LCD_printsh
- //输入参数: x: 0 - 3(行) y: 0 -7 (列) 汉字词组 num: num < 8 - y
- //输出参数: 无
- //函数功能: 液晶汉字输出(16*16字体)
- //其他说明:取码规则: 低位在前, 列行扫描, 阴码(1-亮, 0-灭) 一次最多显示八个汉字!
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_printsh(unsigned char x, unsigned char y, const uchar *h_dat, unsigned char num)
- {
- unsigned char i;
-
- for(i = 0; i < num; i++)
- {
- LCD_printch(x, y++, h_dat); //y++会变换左右屏显示不用人为指定
- h_dat += 32;
- }
- }
- /*--------------------------------------------------------------*/
- //函数名称:LCD_Show_HanZ
- //输入参数: x: 0 - 3(行) y: 0 -7 (列) 汉字字符
- //输出参数: 无
- //函数功能: 液晶汉字查表显示输出(16*16字体)
- //其他说明:取码规则: 低位在前, 列行扫描, 阴码(1-亮, 0-灭)
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_Show_HanZ(uchar x, uchar y, const uchar *character)
- {
- uchar i;
- for(i = 0; i < GB_16_num; i++)
- {
- if( (GB_16[i].Index[0] == character[0]) && (GB_16[i].Index[1] == character[1]) )
- break;
- }
- LCD_printch(x, y, GB_16[i].Msk);
- }
- /*--------------------------------------------------------------*/
- //函数名称:LCD_Show_HanZiShuZu
- //输入参数: x: 0 - 3(行) y: 0 -7 (列) 汉字字符
- //输出参数: 无
- //函数功能: 液晶汉字词组查表显示输出(16*16字体)
- //其他说明:取码规则: 低位在前, 列行扫描, 阴码(1-亮, 0-灭)
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_Show_HanZiShuZu(uchar x, uchar y, const uchar *characters)
- {
- for(; *characters != '\0'; characters += 2 )
- {
- if((*characters) <= 128)// 只显示汉字
- {
- y++;
- continue;
- }
- LCD_Show_HanZ(x, y++, characters);
-
- }
- }
- /*--------------------------------------------------------------*/
- //函数名称:LCD_Show_Content
- //输入参数: x: 0 - 3(行) y: 0 -7 (列) 汉字字符
- //输出参数: 无
- //函数功能: 液晶显示指定内容
- //其他说明:取码规则: 低位在前, 列行扫描, 阴码(1-亮, 0-灭)
- /*--------------------------------------------------------------*/
- void LCD_Show_Content (uchar x, uchar y, const uchar *characters)
- {
- LCD_Show_Num8and16CharStrings(x, y, characters);
- LCD_Show_HanZiShuZu( x, y, characters);
- }
- /*--------------------------------------------------------------*/
- //函数名称: LCD_read_8bytes
- //输入参数: x: 0 - 7 (行);y: 0 -15 (列)
- //输出参数: 无
- //函数功能: 读出8bytes数据
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_read_8bytes(unsigned char x, unsigned char y, unsigned char *read_dat)
- {
- unsigned char i;
- LCD_char_pos(x, y);
- LCD_read_dat(); //空读一次!!!
- for(i = 0; i < 8; i++)
- {
- *read_dat = LCD_read_dat();
- read_dat++;
- }
- }
- /*--------------------------------------------------------------*/
- //函数名称: LCD_inverse
- //输入参数: x: 0 - 7 (行);y: 0 -15 (列);字符串
- //输出参数: 无
- //函数功能: 液晶字符反色区域(8*8字体),反显指定位置的字符
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_inverse(unsigned char x, unsigned char y)
- {
- unsigned char i;
- unsigned char read_buffer[8];
- LCD_read_8bytes(x, y, read_buffer);
- LCD_char_pos(x, y);
- for(i = 0; i < 8; i++)
- LCD_Write_DatorCmd(dat,~read_buffer[i]);
- }
- /*--------------------------------------------------------------*/
- //函数名称:LCD_scr_inverse
- //输入参数: 无
- //输出参数: 无
- //函数功能: 液晶全屏反色显示
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_scr_inverse(void)
- {
- unsigned char i, j;
- for(j = 0; j < 8; j++)
- {
- for(i = 0; i < 16; i++)
- LCD_inverse(j, i);
- }
- }
- /*--------------------------------------------------------------*/
- //函数名称:LCD_inversec816
- //输入参数: x: 0 - 3 (行) y: 0 -15 (列)
- //输出参数: 无
- //函数功能: 液晶字符反色输出(8*16字体)
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_inversec816(unsigned char x, unsigned char y)
- {
- x <<= 1;//横坐标乘以2
- LCD_inverse(x, y);
- LCD_inverse(x+1, y);
- }
- /*--------------------------------------------------------------*/
- //函数名称:LCD_inverses
- //输入参数: x: 0 - 3/7 (行) y: 0 -15 (列) num: num < 16 - y
- //输出参数: 无
- //函数功能: 液晶字符串反色输出
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_inverse816s(unsigned char x, unsigned char y, unsigned char num)
- {
- while(num--) LCD_inversec816(x, y++);
- }
- /*--------------------------------------------------------------*/
- //函数名称:LCD_inversech
- //输入参数: x: 0 - 3(行) y: 0 -7 (列)
- //输出参数: 无
- //函数功能: 液晶汉字反色区域(16*16字体)
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_inversech(unsigned char x, unsigned char y)
- {
- x <<= 1;
- y <<= 1;
- LCD_inverse(x, y);
- LCD_inverse(x, y+1);
- LCD_inverse(x+1, y);
- LCD_inverse(x+1, y+1);
- }
- /*--------------------------------------------------------------*/
- //函数名称:LCD_inversech
- //输入参数: x: 0 - 3(行) y: 0 -7 (列) num: num < 8 - y 汉字个数
- //输出参数: 无
- //函数功能: 液晶汉字词组反色区域(16*16字体)
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_inversesh(unsigned char x, unsigned char y, unsigned char num)
- {
- while(num--)
- LCD_inversech(x, y++);
- }
- /*--------------------------------------------------------------*/
- //函数名称: LCD_init_12864
- //输入参数: 无
- //输出参数: 无
- //函数功能:初始化函数
- //其他说明:
- //编写日期:
- //编写人:
- /*--------------------------------------------------------------*/
- void LCD_init_12864(void)
- {
- LOG_INFO("LCD_init_12864");
- LL_GPIO_ResetOutputPin(GPIOB, RST);
- delay(150);
- LL_GPIO_SetOutputPin(GPIOB, RST);
- LL_GPIO_SetOutputPin(GPIOH, CS1);
- LL_GPIO_SetOutputPin(GPIOH, CS2);
- LCD_Write_DatorCmd (comm, Display_Off);
- LCD_Write_DatorCmd (comm, Display_On);
- LCD_Write_DatorCmd (comm, Start_Line);
- }
- /*---------------显示1-----------------*/
- void disp1 (void)
- {
- LOG_INFO("disp1");
- LL_GPIO_SetOutputPin(GPIOB, EN_LED);
- LL_GPIO_SetOutputPin(GPIOH, CS1);
- LL_GPIO_SetOutputPin(GPIOH, CS2);
- LCD_write_dat(0x00,0x00); //清0
- LCD_Show_Content (0, 0, "3-1 G=15 ");
- LCD_Show_Content (1, 0, "3-1 G=15 ");
- LCD_Show_Content (2, 0, "3-1 G=15 ");
- LCD_Show_Content (3, 0, "3-1 G=15 ");
- delay(500);
- // LCD_write_dat(0x00,0xFF);
- // LL_GPIO_ResetOutputPin(GPIOB, EN_LED);
- // LCD_Show_Content (0, 0, "1.1 当前温度");
- // LCD_Show_Content (1, 0, "1.2.2 时间设置 ");
- // LCD_Show_Content (2, 0, "1.3.3 输入数据 ");
- // LCD_Show_Content (3, 0, "1.4.4 请继续确定");
- // LCD_inversesh(0, 0, 8);
- }
复制代码
|
最佳答案
查看完整内容[请看2#楼]
找到原因了,屏幕写的3.3,我就用的MCU3.3供电,我接5V对比度就能调节出来。可能是屏给我拿错了,3.3过它自己内部那个DCDC,最终供不足电压。
|