调试了两天把ST7565R主控的12864LCD SPI 调通,但是遇到了一个奇怪的问题, 问题纠结在下面两个同样功能函数 , 主函数调用显示结果不一样,有咩有用过这个液晶的出来指点一下 谢谢!
test_display();
test_display1(0xF0);
程序主要功能函数
[mw_shl_code=c,true]/**
*******************************************************************************
*函数名:LCD_SPIConfig
*描 述:LCD用到的SPI 管脚配置,单向只发送
*入 口:无
*出 口:无
*返回值:无
*******************************************************************************
*/
void LCD_SPIConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
/* 使能GPIO 时钟和 SPI 时钟 */
RCC_APB2PeriphClockCmd(LCD_SPI_GPIO_CLK , ENABLE);
RCC_APB1PeriphClockCmd(LCD_SPI_CLK, ENABLE);
/* SCK和MOSI 配置成 复用推挽输出 */
GPIO_InitStructure.GPIO_Pin = LCD_SPI_SCK_PIN|LCD_SPI_MOSI_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* CS 配置片选信号 推挽输出 */
GPIO_InitStructure.GPIO_Pin = LCD_SPI_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
LCD_CS(1); //不选中芯片
/* 配置SPI 硬件参数 */
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(LCD_SPI, &SPI_InitStructure);
/* 使能SPI2 */
SPI_Cmd(LCD_SPI, ENABLE);
}
/**
*******************************************************************************
*函数名:LCD_Initialize
*描 述:LCD液晶初始化
*入 口:无
*出 口:无
*返回值:无
*******************************************************************************
*/
void LCD_Initialize(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// TIM_OCInitTypeDef TIM_OCInitStructure;
LCD_SPIConfig(); //液晶SPI 配置
// LCD操控设置
GPIO_InitStructure.GPIO_Pin = LCD_CD_PIN|LCD_RESET_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
LCD_RESET(0); //低电平复位
Delay_ms(50);
LCD_RESET(1); //复位完毕
Delay_ms(1);
WriteCommandST7565R(0xE2); //软复位
Delay_ms(1);
WriteCommandST7565R(0x2C); //升压步聚1:打开升压
WriteCommandST7565R(0x2E); //升压步聚2:打开升压及电压调整器
WriteCommandST7565R(0x2F); //升压步聚3:打开升压、电压调整器、电压跟随器
WriteCommandST7565R(0x23); //粗调对比度,可设置范围0x20~0x27
WriteCommandST7565R(0x81); //微调对比度
WriteCommandST7565R(0x2F); //0x1A,微调对比度的值,可设置范围0x00~0x3f
WriteCommandST7565R(0x10); /*设置电压的参数RR值*/
WriteCommandST7565R(0xA2); //1/9偏压比(bias)
WriteCommandST7565R(0xA0); //列扫描顺序:从左到右
WriteCommandST7565R(0xC8); //行扫描顺序:从上到下
WriteCommandST7565R(0x60); //扫描起始行:0X40表示从第1行开始,0x41:第2行...0x60:第33行,由于LCD的走线设计,本LCD特殊地从33行开始扫描。
WriteCommandST7565R(0xAF); //打开显示
}
/**
******************************************************************************
* 函数名:WriteCommandST7565R
* 入 口:CmdData:命令码
* 出 口:None
* 描 述:写命令到ST7565R
******************************************************************************
*/
void WriteCommandST7565R(uint8 CmdData)
{
LCD_CS(0); //低电平选中有效
LCD_CD(0); //命令字节
/* 等待发送完毕,发送缓冲寄存器空 */
while( SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) ==RESET );
SPI_I2S_SendData(SPI2, CmdData); //通过SPI 硬件发送一个字节,清除标志位
Delay_ms(1);
LCD_CS(1);
}
/**
******************************************************************************
* 函数名:WriteDataST7565R()
* 入 口:CmdData:写入的数据
* 出 口:无
* 描 述:写数据到ST7565R
******************************************************************************
*/
void WriteDataST7565R(uint8 Data)
{
LCD_CS(0);
LCD_CD(1);
/* 等待发送完毕,发送缓冲寄存器空 */
while( SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) ==RESET );
SPI_I2S_SendData(SPI2, Data); //通过SPI 硬件发送一个字节,清除标志位
Delay_ms(1);
LCD_CS(1);
}
/**
*******************************************************************************
*函数名:
*描 述:LCD地址设置
*入 口:page 页地址 ,column 列地址
*出 口:无
*返回值:无
*******************************************************************************
*/
void LCD_Set_Address(uint16 page, uint16 column)
{
WriteCommandST7565R(0xB0 + page); //设置页地址
WriteCommandST7565R(0x10 + ((column >> 4)&0x0F)); //设置列地址高4位
WriteCommandST7565R(column & 0x0F); //设置列地址低4位
}[/mw_shl_code]
[mw_shl_code=c,true]/**
*******************************************************************************
*函数名:
*描 述:全屏清屏
*入 口:无
*出 口:无
*返回值:无
*******************************************************************************
*/
void Clear_Screen(void)
{
uint8 i,j;
for(i=0;i<9;i++) //液晶驱动IC有65行(分为9个页),只引出来64行(8页),有1行没引出来,清屏时一并清掉。
{
LCD_Set_Address(i,0);
for(j=0;j<132;j++) //液晶驱动IC有132列,只引出来128列,有4列没引出来,所以清屏时一并清掉。
{
WriteDataST7565R(0x00); //全部显示数据是0,以此清屏。
}
}
}
/**
******************************************************************************
* 函数名:GUI_Initialize()
* 入 口:None
* 出 口:None
* 返回值:None
* 描 述:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
******************************************************************************
*/
void GUI_Initialize(void)
{
Display_On = 0; // 关显示刷新
LCD_Initialize();
// GUI_FillSCR(0x00); // 初始化缓冲区为0x00
Clear_Screen();
Display_On = 1; // 开显示刷新
GUI_UpdateDisplay(); // 刷屏
//LCD_BL_ON;
}[/mw_shl_code]
[mw_shl_code=c,true]//===显示测试画面:例如全显示,隔行显示,隔列显示,雪花显示=====
void test_display(void)
{
uint8 i,j;
for(i=0;i<8;i++)
{
LCD_Set_Address(i,0);
for(j=0;j<128;j++)
{
WriteDataST7565R(0xF0);
}
}
}
void test_display1(uint8 data)
{
uint8 i,j;
for(i=0;i<8;i++)
{
LCD_Set_Address(i,0);
for(j=0;j<128;j++)
{
WriteDataST7565R(data);
}
}
}[/mw_shl_code]
主函数如下
[mw_shl_code=c,true]/*
* 函数名:main
* 描述 :主函数
* 输入 :无
* 输出 :无
*/
int main(void)
{
RCC_Configuration();
GUI_Initialize();
test_display();
// test_display1(0xF0);
while(1)
{
}
}[/mw_shl_code]
问题纠结在 两个测试函数
[mw_shl_code=c,true] test_display();
test_display1(0xF0);[/mw_shl_code]
[mw_shl_code=c,true]这两个函数 功能一样,只是一个带参数 一个不带参数,结果一个可以显示 一个不能显示,不知道为什么,有没有用过的可以帮忙看一下,谢谢[/mw_shl_code]
[mw_shl_code=c,true]当主函数调用 test_display1(0xF0); 的时候可以正确显示,结果如下;[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
[mw_shl_code=c,true]当主函数调用 test_display(); 的时候不能显示,结果如下;[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code]
|