找回密码
 立即注册
查看: 41|回复: 5

试图用AI8051U的硬件IIC驱动0.91寸OLED

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-03-06 07:36:42
已绑定手机

4

主题

5

回帖

32

积分

新手上路

积分
32
发表于 昨天 07:36 | 显示全部楼层 |阅读模式
试图用AI8051U的硬件IIC驱动0.91寸OLED,折腾了一周都没成功,怎么都点不亮!有哪位成功的,交流一下。
软件方式是非常成功的。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:346
  • 最近打卡:2026-03-06 09:46:03

842

主题

1万

回帖

2万

积分

管理员

积分
22602
发表于 昨天 10:43 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:181
  • 最近打卡:2026-03-07 00:13:58
已绑定手机

10

主题

195

回帖

1143

积分

金牌会员

DIY玩家

积分
1143
发表于 昨天 10:50 | 显示全部楼层
通常无高速要求
硬件可能有专利问题
软件方式方便移植受欢迎
真正的学徒往往怀着大师的心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:719
  • 最近打卡:2026-03-07 07:41:42
已绑定手机

97

主题

7247

回帖

1万

积分

超级版主

积分
13780
发表于 昨天 13:51 | 显示全部楼层
SSD1316
  1. #include <STC8G.H>
  2. #include "define.h"
  3. #include <intrins.h>
  4. #define         RXD                P30
  5. #define         TXD                P31
  6. #define         SCL                P32
  7. #define         SDA                P33
  8. bit I2C_Busy;
  9. unsigned char code BMP[]=
  10. {
  11.         #include <0.h>
  12. };
  13. void Delay_10ms(void)
  14. {
  15.         unsigned char i,j;
  16.         _nop_();
  17.         _nop_();
  18.         i=144;
  19.         j=157;
  20.         do
  21.         {
  22.                 while(--j);
  23.         }
  24.         while(--i);
  25.         WDT_CONTR=CLR_WDT;
  26. }
  27. void Delay_x10ms(unsigned char x)
  28. {
  29.         while(--x)
  30.                 Delay_10ms();
  31. }
  32. void I2C_Start(void)
  33. {
  34.         I2C_Busy=1;
  35.         I2CMSCR=0x81;
  36.         while(I2C_Busy);
  37. }
  38. void I2C_SendData(unsigned char dat)
  39. {
  40.         I2CTXD=dat;
  41.         I2C_Busy=1;
  42.         I2CMSCR=0x82;
  43.         while(I2C_Busy);
  44. }
  45. void I2C_RecvACK(void)
  46. {
  47.         I2C_Busy=1;
  48.         I2CMSCR=0x83;
  49.         while(I2C_Busy);
  50. }
  51. //unsigned char I2C_RecvData(void)
  52. //{
  53. //        I2C_Busy=1;
  54. //        I2CMSCR=0x84;
  55. //        while(I2C_Busy);
  56. //        return I2CRXD;
  57. //}
  58. //void I2C_SendACK(void)
  59. //{
  60. //        I2CMSST=0x00;
  61. //        I2C_Busy=1;
  62. //        I2CMSCR=0x85;
  63. //        while(I2C_Busy);
  64. //}
  65. //void I2C_SendNAK(void)
  66. //{
  67. //        I2CMSST=0x01;
  68. //        I2C_Busy=1;
  69. //        I2CMSCR=0x85;
  70. //        while(I2C_Busy);
  71. //}
  72. void I2C_Stop(void)
  73. {
  74.         I2C_Busy=1;
  75.         I2CMSCR=0x86;
  76.         while(I2C_Busy);
  77. }
  78. void SSD1316_Write_CMD(unsigned char cmd)
  79. {
  80.         I2C_Start();
  81.         I2C_SendData(0x78);
  82.         I2C_RecvACK();
  83.         I2C_SendData(0x00);
  84.         I2C_RecvACK();
  85.         I2C_SendData(cmd);
  86.         I2C_RecvACK();
  87.         I2C_Stop();
  88. }
  89. void SSD1316_Write_DATA_A(void)
  90. {
  91.         I2C_Start();
  92.         I2C_SendData(0x78);
  93.         I2C_RecvACK();
  94.         I2C_SendData(0x40);
  95.         I2C_RecvACK();
  96. }
  97. void SSD1316_Write_DATA_B(unsigned char dat)
  98. {
  99.         I2C_SendData(dat);
  100.         I2C_RecvACK();
  101. }
  102. void SSD1316_Write_DATA_C(void)
  103. {
  104.         I2C_Stop();
  105. }
  106. void SSD1316_Clear(void)  
  107. {  
  108.         unsigned char i,n;                    
  109.         for(i=0;i<4;i++)  
  110.         {  
  111.                 SSD1316_Write_CMD(0xb0+i);        //设置页地址(0~3)
  112.                 SSD1316_Write_CMD(0x00);        //设置显示位置—列低地址
  113.                 SSD1316_Write_CMD(0x10);        //设置显示位置—列高地址  
  114.                 SSD1316_Write_DATA_A();               
  115.                 for(n=0;n<128;n++)
  116.                 {
  117.                         SSD1316_Write_DATA_B(0x00);
  118.                 }
  119.                 SSD1316_Write_DATA_C();
  120.         }
  121. }
  122. void SSD1316_Display_128x32(void)
  123. {
  124.         unsigned int i;
  125.         SSD1316_Write_CMD(0x20);        //Set Memory Addressing Mode(设置内存寻址模式)
  126.         SSD1316_Write_CMD(0x01);        //0x01(垂直寻址模式)
  127.         SSD1316_Write_CMD(0x21);        //Set Column Address(设置列地址)
  128.         SSD1316_Write_CMD(0);                //(列开始地址)
  129.         SSD1316_Write_CMD(127);                //(列结束地址)
  130.         SSD1316_Write_CMD(0x22);        //Set Page Address(设置页地址)
  131.         SSD1316_Write_CMD(0x00);        //0
  132.         SSD1316_Write_CMD(0x03);        //3
  133.         SSD1316_Write_DATA_A();
  134.         for(i=0;i<512;i++)
  135.         {
  136.                 SSD1316_Write_DATA_B(BMP[i]);
  137.         }
  138.         SSD1316_Write_DATA_C();
  139.         SSD1316_Write_CMD(0x20);        //Set Memory Addressing Mode(设置内存寻址模式)
  140.         SSD1316_Write_CMD(0x02);        //0x02(页寻址模式)
  141. }
  142. void SSD1316_Init(void)
  143. {
  144.         SSD1316_Write_CMD(0xAE);        //Set Display OFF(设置显示关)
  145.         SSD1316_Write_CMD(0xA1);        //Set Segment Remap(设置列重映射)
  146.         SSD1316_Write_CMD(0xA8);        //Set Multiplex Ratio(设置行通道数)
  147.         SSD1316_Write_CMD(0x1F);        //31
  148. //        SSD1316_Write_CMD(0xC8);        //Set COM Output Scan Direction(设置行重映射)
  149.         SSD1316_Write_CMD(0xD3);        //Set Display Offset(设置垂直偏移量)
  150.         SSD1316_Write_CMD(0x00);        //0
  151.         SSD1316_Write_CMD(0xD5);        //Set Display Clock Divide Ratio/Oscillator Frequency(设置显示时钟分频器、振荡器频率)
  152.         SSD1316_Write_CMD(0xF0);        //0xF0
  153.         SSD1316_Write_CMD(0x8D);        //Charge Pump Setting(设置电荷泵)
  154.         SSD1316_Write_CMD(0x14);        //0x14
  155.         SSD1316_Write_CMD(0xAF);        //Set Display ON(设置显示开)
  156.         SSD1316_Clear();
  157. //        SSD1316_Write_CMD(0x81);        //Set Contrast Control(设置对比度)
  158. //        SSD1316_Write_CMD(0x7F);        //127
  159. //        SSD1316_Write_CMD(0xA7);        //Set Normal/Inverse Display(设置反相显示)
  160. }
  161. void Init(void)
  162. {
  163.         P_SW2|=EAXFR;
  164.         P3M0=0x00;
  165.         P3M1=0x00;
  166.         P5M0=0x00;
  167.         P5M1=0x00;
  168.         P3PU=0x0c;
  169.         I2CCFG=0xC1;        //921.6K@11.0592M
  170.         I2CMSCR=EMSI;
  171.         I2CMSST=0x00;
  172.         EA=1;
  173.         Delay_x10ms(10);
  174.         SSD1316_Init();
  175. }
  176. void main(void)
  177. {
  178.         Init();
  179.         SSD1316_Display_128x32();
  180.         while(1)
  181.         {
  182.                 SSD1316_Write_CMD(0xA6);
  183.                 Delay_x10ms(50);
  184.                 SSD1316_Write_CMD(0xA7);
  185.                 Delay_x10ms(50);
  186.         }
  187. }
  188. void I2C_Isr(void) interrupt 24
  189. {
  190.         _push_(P_SW2);
  191.         P_SW2|=EAXFR;
  192.         if(I2CMSST&MSIF)
  193.         {
  194.                 I2CMSST&=~MSIF;
  195.                 I2C_Busy=0;
  196.         }
  197.         _pop_(P_SW2);
  198. }
复制代码
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-03-06 07:36:42
已绑定手机

4

主题

5

回帖

32

积分

新手上路

积分
32
发表于 昨天 15:38 | 显示全部楼层

非常感谢!
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2026-03-06 07:36:42
已绑定手机

4

主题

5

回帖

32

积分

新手上路

积分
32
发表于 昨天 15:39 | 显示全部楼层
神*** 发表于 2026-3-6 10:43
https://www.stcaimcu.com/thread-18574-1-1.html

非常感谢!
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-7 11:12 , Processed in 0.116203 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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