}
LCD_Write_Byte(bmp[width * j + i],1); //开始写入数据 }
for(k = 0;k < width;k++) //下半屏 {
LCD_Write_Byte(bmp[width * (j + height) + k],1); //开始写入数据
} }
/******分开上半屏或者下半屏写******/ else { switch(x) //判断显示的横坐标,确定起始行 {
case 1: //上半屏 base_x = One_LineAddress; //起始地址为0x80 break; case 2: //下半屏 base_x = One_LineAddress; //起始地址为0x80 break;
case 3: //下半屏 base_x = Three_LineAddress; //起始地址为0x88 break; default: break; }
base_y = base_x + y; //x轴方向的偏移,基地址 + 偏移地址
LCD_Write_Byte(MPU_8bit_Expansion_Draw_Close,0); //扩充指令 LCD_Write_Byte(MPU_8bit_Expansion_Draw_Open,0); //打开绘图功能
if(x == 1 || x == 3) //直接在同一个半屏的,直接写完32位数据 {
for(i = 0;i < 32;i++) //写地址有讲究,先写垂直再写水平,详见“设定绘图RAM{ LCD_Write_Byte(One_LineAddress + i,0);
地址”说明 是下半屏
//写入垂直地址,不管上半屏还
LCD_Write_Byte(base_y,0); //写入水平地址
for(j = 0;j < 2;j++) //两组8bit数据,组成16bit {
}
}
}
}
LCD_Write_Byte(*bmp++,1); //写入数据
if(x == 2) //数据显示不在同一半屏上的,先写上半屏,在写下半屏 { for(i = 0;i < 16;i++) //上半屏16行点阵数据 { }
}
LCD_Write_Byte(Two_LineAddress + i,0); //写入垂直地址 LCD_Write_Byte(base_y,0); //写入水平地址
for(j = 0;j < 2;j++) //两组8bit数据,组成16bit { }
LCD_Write_Byte(*bmp++,1); //写入数据
for(i = 0;i < 16;i++) //下半屏16行点阵数据 { LCD_Write_Byte(Three_LineAddress + i,0); //写入垂直地址 LCD_Write_Byte(base_y + 8,0); //写入水平地址 }
for(j = 0;j < 2;j++) //两组8bit数据,组成16bit { }
LCD_Write_Byte(*bmp++,1); //写入数据
LCD_Write_Byte(MPU_8bit_Expansion_Draw_Open,0); //扩充指令,打开绘图功能 // LCD_Write_Byte(Instruct_Basic8,0); //Locked flag recovery LCD12864_LockedFlag = 0; }
/********************************************************** * 函数功能 ---> LCD12864清屏 * 入口参数 ---> none * 返回数值 ---> none * 功能说明 ---> none
**********************************************************/ void LCD_Clear(void) {
//Locked flag check
if(LCD12864_LockedFlag==1)return; else LCD12864_LockedFlag = 1;
LCD_Write_Byte(Clear_Display,0); //清屏 //Locked flag recovery LCD12864_LockedFlag = 0; }
/********************************************************** * 函数功能 ---> LCD12864GPIO初始化 * 入口参数 ---> none * 返回数值 ---> none * 功能说明 ---> none
**********************************************************/ void LCD_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;
#ifdef Soft_PSB
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIO时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO #endif
#ifdef LCD_Work_Mode_Parallel
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIO时钟 GPIO_InitStructure.GPIO_Pin = DataBusPins|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO #else //硬件SPI
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD, ENABLE);//使能GPIO时钟 //RST GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO //CS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO //LCD_PWDN/LCD_BLK GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIO LCD_PWDN = 0; LCD_BLK = 1; #ifdef LCD_Work_Mode_HardSPI //硬件SPI SPI1_Init();
#else//软件模拟SPI RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能GPIO时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO #endif #endif }
/********************************************************** * 函数功能 ---> LCD12864初始化 * 入口参数 ---> none * 返回数值 ---> none * 功能说明 ---> none
**********************************************************/ void LCD_Init(void) {
/******PSB(串口并口通讯选择******/
#ifdef Soft_PSB //使用软件控制
#ifdef LCD_Work_Mode_Parallel //如果定义了,则使用并口工作模式 LCD_PSB = 1; //高电平为并口通讯模式 #else LCD_PSB = 0; //低电平为串口通讯模式 #endif
#endif /*********************************/ LCD_GPIO_Init(); /*********************************/
LCD_RST = 0; //显示屏复位 LCD_Delay(); LCD_Delay(); LCD_RST = 1;
LCD_CS = 0; //选中显示屏,高电平有效 LCD_Delay(); LCD_Delay();
LCD_CS = 1; //选中显示屏,高电平有效 //LCD_Write_Byte(Instruct_Expansion8,0); //指令0x34,拓展指令集,绘图关 LCD_Write_Byte(MPU_8bit_Expansion_Draw_Open,0); //指令0x36,拓展指令集,绘图开 LCD_Write_Byte(Open_Display,0); //整体显示开,光标关,显示反白关,0x0c LCD_Write_Byte(Clear_Display,0); //清屏,0x01 LCD_Write_Byte(Vernier_ShiftRight,0); //设定起点,光标右移,0x06 /*******************************/ LCD_Write_CGRAM_ALL(CGROM_Code); //写入自定义字符 LCD12864_LockedFlag = 0; }
void LCD_BLK_Manage(__IO uint16_t ADC_Result) { static u8 LCDBLKIcon = 0xff;//When the LCD backlight state does not change, //the repeated display of backlight icons is not