本帖最后由 芯圣电子官方QQ 于 2023-7-20 09:31 编辑
由于我是用的事先写好的OLED库,该OLED为SSD1306驱动芯片,具备128*32分辨率。
I2C接口顺序为:GND、VCC、SCL、SDA
刚好我们的开发板上下面的接口有满足顺序的:GND、VCC、P22、P24
因此我们将对针脚做以下映射:
P22——SCL
P24——SDA
根据手册中对IO模式的说明,来操作端口功能选择寄存器,如下图所示:
P2M1 = P2M1 & 0xF0 | 0x08; //P22设置为推挽输出
P2M2 = P2M2 & 0xF0 | 0x08; //P24设置为推挽输出
这样我们就可以在OLED的头文件中映射这两个端口使用了
#define OLED_SCL P2_2 //SCL
#define OLED_SDA P2_4 //SDA
接下来,就是编写相关的显示代码了。
/**
* ************************************************************************************
* 上海芯圣电子股份有限公司
* www.holychip.cn
* ************************************************************************************
* @Examle Version V1.0.0.5
* [url=home.php?mod=space&uid=212281]@date[/url] 2023.04.07
* ************************************************************************************
* 客户服务
* 感谢您使用我们的单片机,若发现错误或对函数的使用存在疑问。请添加上海芯圣电子官方QQ群
* ************** **************技术支持群:201030494***********************************
* ************************************************************************************
**/
#define ALLOCATE_EXTERN
#include "HC89S105AC8.h"
#include "oled.h"
void Delay_ms(unsigned int fui_i); //延时函数
/***************************************************************************************
* @实现效果 对P00口进行高、低电平转换
* @操作方法 示波器接P00口,查看输出波形
***************************************************************************************/
void main()
{
unsigned char i;
/********************************系统初始化*******************************************/
WDTCCR = 0x00; //关闭看门狗
//本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
CLKCON = 0x02; //选择内部高频RC为系统时钟,Fosc=32MHz
CLKDIV = 0x02; //Fosc 2分频得到Fcpu,Fcpu=16MHz
/**********************************IO配置初始化***************************************/
P2M1 = P2M1 & 0xF0 | 0x08; //P22设置为推挽输出
P2M2 = P2M2 & 0xF0 | 0x08; //P24设置为推挽输出
OLED_Init();
OLED_ColorTurn(0);
OLED_DisplayTurn(0);
OLED_Display_Off();
OLED_Display_On();
for(i=0;i<8;i++)
NumberShow(i, 16*i, 0, 0) ;Delay_ms(200);
OLED_Clear_Left_To_Right();
for(i=0;i<8;i++)
NumberShow(i, 16*i, 0, 1) ;Delay_ms(200);
OLED_Clear_Left_To_Right();
while (1)
{
for(i=0;i<8;i++)
NumberShow(i, 16*i, 0, 0) ;
for(i=0;i<8;i++)
NumberShow(i, 16*i, 2, 1) ;
Delay_ms(200);
OLED_Clear_Left_To_Right();
}
}
/*************************************************************************************
* @说明 延时函数
* @参数 fui_i : 延时时间
* @返回值 无
* @注 Fcpu = 16MHz,fui_i = 1时,延时时间约为1ms
*************************************************************************************/
void Delay_ms(unsigned int fui_i)
{
unsigned int fui_j;
for (; fui_i > 0; fui_i--)
for (fui_j = 1596; fui_j > 0; fui_j--);
}
这里提供工程给大家测试使用,确保我是没有骗人的。
1-OLED.rar
(12.06 KB)
|