OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10090|回复: 0

LCD12864液晶显示 ST7565R主控

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2014-8-13
在线时间
1 小时
发表于 2015-1-8 22:26:26 | 显示全部楼层 |阅读模式
5金钱
调试了两天把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]

您所浪费的今天,是昨天死去的人奢望的明天;您所厌恶的现在,是未来的您回不去的曾经
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 06:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表