找回密码
 立即注册
查看: 2653|回复: 9

8H8K64U驱动OLED屏IIC显示

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:685
  • 最近打卡:2026-03-25 19:20:14
已绑定手机
已实名认证

46

主题

162

回帖

1162

积分

金牌会员

积分
1162
发表于 2024-8-13 22:18:08 | 显示全部楼层 |阅读模式
自己设计的PCB,基于8H8K64U,扩展接口包含IIC OLED、WS2812、DHT11温湿度传感器接口。
这里展示了该开发板驱动OLED屏显示字符串、汉字、字符、数字和图片的显示效果

IMG_20240813.jpg IMG_20240813-2.jpg

视频展示



主代码
  1. /*----------------------------------------------------------------*/
  2. #include "STC8H.h"
  3. #include "oled.h"                //OLED引脚定义、控制函数
  4. #include "bmp.h"                //图片字模存放位置
  5. //#include "logo.h"                // picture position
  6. /*-------------- GPIO initialize ------------------*/
  7. void GPIO_Init();
  8. int main(void)
  9. {
  10.         GPIO_Init();
  11.         OLED_Init();                        //初始化OLED
  12.         OLED_ColorTurn(0);                //0正常显示,1 反色显示
  13.         OLED_DisplayTurn(0);        //0正常显示  1 屏幕翻转显示
  14.         while(1)
  15.         {
  16.                 //-------------------------------------------
  17.                 OLED_DrawBMP(0,0,128,64,BMP1);                 //图片显示
  18.                
  19.                 delay_ms(200);                                                  //延时
  20.                 OLED_Clear();                                                  //清屏
  21.                
  22.                 OLED_DrawBMP(0,0,128,64,BMP2);
  23.                
  24.                 delay_ms(200);                                                  //延时
  25.                 OLED_Clear();                                                  //清屏
  26.                 //-------------------------------------------
  27.                 OLED_ShowString(0,0,"Temp:",16);
  28.                 OLED_ShowString(43,0,"65",16);
  29.                 OLED_ShowString(60,0,".",16);
  30.                 OLED_ShowString(70,0,"42",16);
  31.                 OLED_ShowString(89,0,"C",16);
  32.                
  33.                 OLED_ShowString(0,2,"RH:",16);
  34.                 OLED_ShowString(43,2,"12",16);
  35.                 OLED_ShowString(60,2,".",16);
  36.                 OLED_ShowString(70,2,"42",16);
  37.                 OLED_ShowString(89,2,"%",16);
  38.                
  39.                 OLED_ShowString(0,4,"ECNU",16);                  //显示字符串
  40.                 OLED_ShowString(40,4,"2024/08/13",16);//显示字符串
  41.                 OLED_ShowString(0,6,"Shanghai,China",16);                  //显示字符串
  42.                
  43.                 delay_ms(500);                                                  //延时
  44.                 OLED_Clear();                                                  //清屏
  45.                 //-------------------------------------------
  46.                 OLED_ShowChinese(0,0,0,16);
  47.                 OLED_ShowChinese(20,2,1,16);
  48.                 OLED_ShowChinese(40,4,2,16);
  49.                 OLED_ShowChinese(60,6,3,16);
  50.                 OLED_ShowChar(0,6,'M',16);
  51.                 OLED_ShowNum(0,4,596,2,16);
  52.                 delay_ms(500);                                                  //延时
  53.                 OLED_Clear();                                                  //清屏
  54.                 //-------------------------------------------
  55.                
  56.                 OLED_DrawBMP(0,0,128,64,BMP1);
  57.                 delay_ms(200);
  58.                 OLED_Display_Off();
  59.                 OLED_Display_On();
  60.                 OLED_DrawBMP(0,0,128,64,BMP2);
  61.                 delay_ms(200);
  62.                 OLED_Display_Off();
  63.                 OLED_Display_On();
  64.         }         
  65.         
  66. }
  67. void GPIO_Init()
  68. {
  69.         P0M1 = 0x00;   P0M0 = 0x00;
  70.   P1M1 = 0x00;   P1M0 = 0x00;
  71.   P2M1 = 0x00;   P2M0 = 0x00;
  72.   P3M1 = 0x00;   P3M0 = 0x00;
  73.   P4M1 = 0x00;   P4M0 = 0x00;
  74.   P5M1 = 0x00;   P5M0 = 0x00;
  75.         P6M1 = 0x00;   P6M0 = 0x00;
  76.   P7M1 = 0x00;   P7M0 = 0x00;
  77. }
复制代码
完整工程文件见附件。

OLED_IIC.zip

9.73 KB, 下载次数: 378

MCU开发者和爱好者
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:685
  • 最近打卡:2026-03-25 19:20:14
已绑定手机
已实名认证

46

主题

162

回帖

1162

积分

金牌会员

积分
1162
发表于 2024-8-13 22:21:46 | 显示全部楼层
MCU开发者和爱好者
回复

使用道具 举报 送花

已绑定手机

0

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2024-12-14 15:54:41 | 显示全部楼层

感谢分享!!!

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-12-14 00:40:45
已绑定手机

2

主题

8

回帖

182

积分

注册会员

积分
182
发表于 2025-3-21 12:56:20 来自手机 | 显示全部楼层
感谢开源
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:684
  • 最近打卡:2026-04-04 00:36:55
已绑定手机

160

主题

1937

回帖

2145

积分

金牌会员

积分
2145
发表于 2025-7-11 22:53:27 | 显示全部楼层
通过J2输出DTR和RTS信号:P15为DTR1,P13为RTS1,P14为DTR2,P34为RTS2。
P13 P15
P14 P34
是不是AI8h8k64u  sop16 用不上?
只能tssop20才可以用到
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:684
  • 最近打卡:2026-04-04 00:36:55
已绑定手机

160

主题

1937

回帖

2145

积分

金牌会员

积分
2145
发表于 2025-7-11 22:53:59 | 显示全部楼层
vb2*** 发表于 2025-7-11 22:53
通过J2输出DTR和RTS信号:P15为DTR1,P13为RTS1,P14为DTR2,P34为RTS2。
P13 P15
P14 P34

回错贴了. 一个页面开了两个,,不好意思
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:40
  • 最近打卡:2026-04-03 16:08:51
已绑定手机

2

主题

25

回帖

190

积分

注册会员

积分
190
发表于 2025-8-28 09:21:08 | 显示全部楼层
谢谢
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:19
  • 最近打卡:2026-03-14 23:24:23

19

主题

55

回帖

537

积分

高级会员

积分
537
发表于 2025-10-28 23:39:18 | 显示全部楼层
正好手上有一个20脚的stc8h8k64u的板子,给客户做的检测I2C传感器的样板,换上OLED,用这个程序,一次通过,谢谢分享
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2026-02-15 08:37:39
已绑定手机

8

主题

16

回帖

140

积分

注册会员

积分
140
发表于 2026-2-13 00:07:34 | 显示全部楼层
谢谢,测试了确实没问题,不过楼主为什么要用软件i2c啊,硬件i2c的控制也是很简单的啊。
就比如我之前给TM1650写的硬件i2c的库函数,其中的写函数是这么写的,这么搞的话延时都靠cpu阻断循环,带oled压力很大的。
//I2C命令表
#define I2C_IDLE 0X00
#define I2C_START 0X01
#define I2C_STOP 0X06
#define I2C_SENDMS 0X02
#define I2C_RECV_ACK 0X03
void I2C_CMD(unsigned char CMD){//I2C命令设置
    unsigned int Release_Timer = 0;
    I2CMSCR = (I2CMSCR & 0XF0) | CMD;//只填低四位
    //头文件中没有MSIF的定义,因此只能手动做与运算
    while(!(I2CMSST & 0X40)){
        if(++Release_Timer > 10000) {
            TM1650_Error = 1;break;}}//等待I2C控制器执行完命令,超时则退出
    I2CMSCR = (I2CMSCR & 0XF0) | I2C_IDLE;//清空I2C命令
    I2CMSST &= ~0X40;//清除完成标志(~0X40 = 10111111,做与运算,可清零bit6位)
}
bit I2C_Check_ACK(void){//TM1650不需要确认ACK
    unsigned char a = 0;
    a = (I2CMSST & 0X02);//读取I2CMSST B1位是否为1
    return a;//返回1或0
}
void TM1650_Write(unsigned char Data,unsigned char Addr){//底层发送数据驱动
    //此处不需I2C开始与停止发送,而是手动添加,可连续发送。
    if(Addr != 0){//如果需要在同一地址发送超过8bit数据,可令Addr=0
        I2C_CMD(I2C_START);
        I2CTXD = Addr;//不需要担心时序,每字节后必须有一个ack,时间足够
        I2C_CMD(I2C_SENDMS);//发送命令
        I2C_CMD(I2C_RECV_ACK);//接受ACK
        I2CTXD = Data;//先发地址,后发数据
        I2C_CMD(I2C_SENDMS);
        I2C_CMD(I2C_RECV_ACK);
        I2CTXD = 0;//清空发送寄存器
        I2C_CMD(I2C_STOP);
    }
    else{//往一个八位地址一直发数据,比如写OLED屏(特殊设备有16位I2C地址,在这里不做讨论)
        I2CTXD = Data;//先发地址,后发数据
        I2C_CMD(I2C_SENDMS);
        I2C_CMD(I2C_RECV_ACK);
    }
}
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:104
  • 最近打卡:2026-04-03 10:47:38
已绑定手机

1

主题

41

回帖

161

积分

注册会员

积分
161
发表于 前天 07:57 | 显示全部楼层
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-4 17:44 , Processed in 0.524812 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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