找回密码
 立即注册
查看: 999|回复: 6

STC32G端口设置问题 | 已解决

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2024-03-02 13:13:00

2

主题

11

回帖

146

积分

注册会员

积分
146
发表于 2024-2-7 18:43:35 | 显示全部楼层 |阅读模式
用STC端口2^6和2^7模拟I2C,同样的代码在STC15W4K48S上可以正常运行。尝试移植到STC32G12K128,总是无法点亮OLED12832屏幕,请各位大侠提供一些建议

不想要外加上拉电阻(原来电路上没有加);也不想用硬件I2C(不想大改代码)
注:确定电路连接没问题。已尝试过设为准双向口;开内部上拉电阻;SDA设置为开漏+SCL设置为强推挽等均无效。

程序:

STC32G_OLED0.91测试.rar

59.67 KB, 下载次数: 58

测试程序

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15626
发表于 2024-2-7 19:15:27 | 显示全部楼层
1, 打开内部 4K 上拉电阻
2,多加些 NOP 延时,速度快了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2024-03-02 13:13:00

2

主题

11

回帖

146

积分

注册会员

积分
146
发表于 2024-2-8 00:04:37 | 显示全部楼层
神*** 发表于 2024-2-7 19:15
1, 打开内部 4K 上拉电阻
2,多加些 NOP 延时,速度快了


//  WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  EAXFR = 1; //扩展寄存器(XFR)访问使能
  CKCON = 0; //提高访问XRAM速度
       
         
        P2M0 = 0x00; P2M1 = 0x00;
  P2PU = 0xff;



打开内部 4K 上拉电阻,降速还是不行


void I2C_3(Uchar mcmd)
{
Uchar length = 8;                        // Send Command

        while(length--)
        {
                if(mcmd & 0x80)
                {
                        SDA3=1;
                }
                else
                {
                        SDA3=0;
                }
                uDelay(3);
                SCL3=1;
                uDelay(3);
                SCL3=0;
                uDelay(3);
                mcmd = mcmd << 1;
        }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-2-8 07:41:29 | 显示全部楼层
由于 CPU构架 复杂程度 STC32 > STC8 > STC15, 总线的复杂程度增加, 引起 IO口翻转速度减慢.

解决方法 1: IO口 加上拉电阻, 可保持原通讯速率.

解决方法 2: 降低通讯速率 , 为原通讯速率 的1/2倍 试试, 如不行只能再降低 通讯速率. 否则会通讯不正常或丢失第一位数据.

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2025-05-02 08:15:40
已绑定手机

13

主题

1257

回帖

2975

积分

金牌会员

积分
2975
发表于 2024-2-8 08:28:52 | 显示全部楼层
感觉还是时序方面的原因,速度太快了,建议用逻辑分析仪看一下具体原因,找到合适的通信速率。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2024-03-02 13:13:00

2

主题

11

回帖

146

积分

注册会员

积分
146
发表于 2024-2-8 10:19:31 | 显示全部楼层
感谢大家!问题已解决,记录一下解决办法:
1. 转换时加延时;
2.模拟端口2^6、2^7换成2^0、2^1;前面两个端口模拟总是无法成功,加了延时也没有效果,原因不明。

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

#include <STC32G.h>
//#include "stc15w4k32s4.h"
//#include <reg52.h>
#include <intrins.h>



#define Uchar unsigned char
#define Uint  unsigned int
#define Ulong unsigned long
#define uchar unsigned char
#define uint  unsigned int


//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//  Pin Definition
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

//sbit SDA3=P2^6;                        //2_6串行的数据口51
//sbit SCL3=P2^7;                 //2_7串行的同步时钟52
sbit SDA3=P2^0;                        //2_6串行的数据口41
sbit SCL3=P2^1;                 //2_7串行的同步时钟42
sbit p3_0=P3^0;
sbit p3_1=P3^1;

//*********************************************************************0.66
char code color13[]={
/*--  调入了一幅图像:F:\工作\8051\OLED3\12832\1.bmp  --*/
/*--  宽度x高度=128x32  --*/
0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x41,0x41,0x41,0xE1,0xF1,0xF1,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xC1,0xE1,0xF1,0x31,0x11,0x31,
0xF1,0xE1,0xC1,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x81,0xE1,0xF1,0xF9,0xF9,0x01,
0x01,0x01,0x01,0x01,0x41,0x71,0x39,0x1F,0x4F,0x77,0x39,0x1F,0x0F,0x07,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
0x00,0xFF,0xFF,0xFF,0x00,0x00,0x60,0x78,0x5C,0x47,0x43,0x40,0xFF,0xFF,0xFF,0x40,
0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xE0,0x00,0x00,
0x08,0x08,0xC8,0x2F,0x2F,0x2F,0xC8,0x08,0x08,0xC0,0x20,0x20,0x20,0xCE,0x0E,0x2E,
0xEE,0x00,0x20,0xE0,0x20,0x00,0x00,0x40,0x20,0x20,0x23,0xC7,0x0F,0x0C,0xC8,0x2C,
0x2F,0x27,0xC3,0x00,0x20,0xE0,0x20,0x20,0x40,0x80,0x08,0x88,0x4F,0x2F,0x2F,0x48,
0x88,0x00,0x00,0x60,0x20,0xE0,0x20,0x60,0x00,0x00,0xC0,0x20,0x20,0x20,0x60,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xA0,0xBF,0xA0,0x80,
0x80,0x80,0xB0,0xA8,0xA4,0xA2,0xA1,0x80,0x80,0x9C,0xA3,0xA2,0xA3,0x9C,0x80,0xA0,
0xB8,0xA7,0x87,0xB8,0xA0,0x80,0x80,0x90,0xA0,0xA1,0xA1,0x9E,0x80,0x80,0xB0,0xA8,
0xA4,0xA2,0xA1,0x80,0xA0,0xBF,0xA0,0xA0,0x90,0x8F,0x80,0x8F,0x90,0xA0,0xA0,0x90,
0x8F,0x80,0x80,0x80,0xA0,0xBF,0xA0,0x80,0x80,0x80,0xB0,0xA1,0xA2,0xA2,0x9C,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF
};
char code color14[]={/*--  调入了一幅图像:F:\工作\8051\OLED3\12832\中文显示1.bmp  --*/
/*--  宽度x高度=128x32  --*/
0x00,0x20,0xA0,0x78,0x20,0xF8,0x20,0x00,0x00,0x00,0x10,0xF8,0x00,0x00,0x00,0x00,
0xF0,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0xF8,0x88,
0x88,0x88,0xFE,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x20,0x10,0xF8,0x06,0x20,0x20,
0x7E,0x90,0x88,0x88,0x84,0xE0,0x00,0x00,0x00,0x00,0x00,0x80,0x7E,0x80,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xF2,0x92,0x92,0x92,0x9E,0x80,0x80,
0x00,0x00,0x08,0x08,0x08,0xFE,0x08,0x08,0x08,0xFE,0x08,0x08,0x00,0x00,0x20,0x24,
0xA4,0xFC,0xA2,0x22,0x20,0xF8,0x08,0x08,0xF8,0x00,0x00,0x00,0xFE,0x02,0x4A,0x4A,
0xFA,0x4A,0xCA,0x4A,0x02,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x02,0x0F,0x02,0x0F,0x02,0x02,0x00,0x00,0x00,0x08,0x0F,0x08,0x00,0x00,0x00,
0x07,0x08,0x08,0x08,0x07,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x01,0x00,
0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x02,0x02,0x02,0x02,0x02,0x1F,
0x02,0x02,0x02,0x02,0x02,0x82,0x00,0x10,0x08,0x84,0x02,0x01,0x00,0x01,0x02,0x04,
0x08,0x18,0x08,0x00,0x00,0x1F,0x10,0x08,0x84,0x00,0x03,0x04,0x08,0x10,0x10,0x1C,
0x00,0x01,0x11,0x09,0x05,0x03,0x01,0x01,0x03,0x05,0x09,0x11,0x01,0x00,0x04,0x03,
0x00,0x1F,0x00,0x01,0x00,0x0F,0x04,0x04,0x07,0x00,0x00,0x00,0x1F,0x0A,0x0A,0x0A,
0x0B,0x0A,0x0A,0x0B,0x0A,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x20,0xE0,0x3C,0x20,0xE0,0x3C,0x20,0x00,0x00,0x08,0x08,0xFC,0x00,0x00,0x00,
0x00,0x00,0x38,0x04,0x04,0x04,0xC4,0x38,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00,
0x00,0x00,0x00,0xFE,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0xFE,0x04,0x00,
0x00,0x10,0x08,0x04,0xFE,0x01,0x01,0x08,0x88,0x3F,0x44,0x44,0x42,0x43,0x72,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x1F,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x79,0xC9,0x49,0x49,0x4F,0x40,0x40,0x00,
0x00,0x00,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x00,
0x00,0x00,0x12,0x12,0xD2,0xFE,0x91,0x11,0x11,0x00,0xFC,0x04,0x04,0x04,0xFC,0x00,
0x00,0x02,0x1F,0x02,0x02,0x1F,0x02,0x02,0x00,0x00,0x10,0x10,0x1F,0x10,0x10,0x00,
0x00,0x00,0x18,0x14,0x12,0x11,0x10,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,
0x00,0x00,0x00,0x03,0x01,0x01,0x01,0x01,0x7F,0x01,0x01,0x01,0x01,0x03,0x00,0x00,
0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
0x00,0x00,0x20,0x10,0x08,0x06,0x01,0x00,0x00,0x00,0x03,0x06,0x0C,0x18,0x30,0x10,
0x00,0x00,0x00,0x7F,0x20,0x10,0x08,0x00,0x00,0x01,0x06,0x08,0x10,0x20,0x78,0x00,
0x00,0x01,0x01,0x41,0x21,0x19,0x0F,0x05,0x01,0x01,0x03,0x05,0x19,0x71,0x21,0x01,
0x00,0x08,0x04,0x03,0x00,0x7F,0x00,0x07,0x02,0x00,0x1F,0x08,0x08,0x08,0x1F,0x00
};

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

void         delay_ms(Uint t)
{
        Uchar i,j;
        while(--t)
        {
        i=50;       
        j=100;

                while(--j)
                        while(--i);
        }
}
void uDelay(Uchar l)
{
        while(l--);
}


void Delay(Uchar n)
{
Uchar i,j,k;

        for(k=0;k<n;k++)
        {
                for(i=0;i<131;i++)
                {
                        for(j=0;j<15;j++)
                        {
                                uDelay(203);       
                        }
                }
        }
}



//****************************************************************************
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//  Read/Write Sequence
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void I2C_3(Uchar mcmd)
{
Uchar length = 8;                        // Send Command

        while(length--)
        {
                if(mcmd & 0x80)
                {
                        SDA3=1;
                }
                else
                {
                        SDA3=0;
                }
                uDelay(3);
                SCL3=1;
                uDelay(3);
                SCL3=0;
                uDelay(3);
                mcmd = mcmd << 1;
        }
}


void I2C_Ack3()
{
        SDA3=1;
        uDelay(3);
        SCL3=1;
        uDelay(3);
        SCL3=0;
        uDelay(3);
}


void I2C_NAck3()
{
        SDA3=0;
        uDelay(3);
        SCL3=1;
        uDelay(3);
        SCL3=0;
        uDelay(3);
}


void I2C_Start3()
{
        SDA3=0;
        uDelay(3);
        SCL3=1;
        uDelay(3);
        SCL3=0;
        uDelay(3);
        I2C_3(0x78);
        I2C_Ack3();
}


void I2C_Stop3()
{
        SCL3=1;
        uDelay(5);
        SDA3=0;
        uDelay(5);
        SDA3=1;
        uDelay(5);
}


void Write_Command3(Uchar Data)
{
        I2C_Start3();
        I2C_3(0x00);
        I2C_Ack3();
        I2C_3(Data);
        I2C_Ack3();
        I2C_Stop3();
}


void Write_Data3(Uchar Data)
{
        I2C_Start3();
        I2C_3(0x40);
        I2C_Ack3();
        I2C_3(Data);
        I2C_Ack3();
        I2C_Stop3();
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

void        LCD_Init3(void)
{


        Write_Command3(0xae);        //--turn off oled panel

        Write_Command3(0x00);        //--set low column address
        Write_Command3(0x10);        //--set high column address

        Write_Command3(0x00);        //--set start line address

        Write_Command3(0xb0);        //--set page address

        Write_Command3(0x81);        //--set contrast control register
        Write_Command3(0xff);

        Write_Command3(0xa1);        //--set segment re-map 127 to 0   a0:0 to seg127
        Write_Command3(0xa6);        //--set normal display

        Write_Command3(0xc8);        //--set com(N-1)to com0  c0:com0 to com(N-1)

        Write_Command3(0xa8);        //--set multiples ratio(1to64)
        Write_Command3(0x1f);        //--1/64 duty

        Write_Command3(0xd3);        //--set display offset
        Write_Command3(0x00);        //--not offset

        Write_Command3(0xd5);        //--set display clock divide ratio/oscillator frequency
        Write_Command3(0x80);        //--set divide ratio

        Write_Command3(0xd9);        //--set pre-charge period
        Write_Command3(0x04);

        Write_Command3(0xda);        //--set com pins hardware configuration
        Write_Command3(0x00);

        Write_Command3(0xdb);        //--set vcomh
        Write_Command3(0x30);

        Write_Command3(0x8d);        //--set chare pump enable/disable
        Write_Command3(0x14);        //--set(0x10) disable
        //Write_Command3(0x10);        //--set(0x10) disable
        Write_Command3(0xaf);        //--turn on oled panel
        //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=void         LCD_Init(void)
}


//***********************************************************************
void clr_display3(void)
{
        Uchar i,j;
        for(j=0;j<4;j++)
        {
                Write_Command3(0x22);//--set page1
                Write_Command3(j);//--set start page
                Write_Command3(0x03);//--set end page

                for(i=0;i<128;i++)                                                  //显示单色数据到LCD
                {
                        Write_Data3(0x00);
                }
        }
}
                       
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void pic13(void)
{
        Uchar i,j;
        Uint k;
        k=0;
        for(j=0;j<4;j++)
        {
                Write_Command3(0x22);//--set page1
                Write_Command3(j);//--set start page
                Write_Command3(0x03);//--set end page

                for(i=0;i<128;i++)                                                  //显示单色数据到LCD
                {
                        Write_Data3(color13[k]);
                        k=k+1;
               
                }
        }
}


void pic14(void)
{
        Uchar i,j;
        Uint k;
        k=0;
        for(j=0;j<4;j++)
        {
                Write_Command3(0x22);//--set page1
                Write_Command3(j);//--set start page
                Write_Command3(0x03);//--set end page

                for(i=0;i<128;i++)                                                  //显示单色数据到LCD
                {
                        Write_Data3(color14[k]);
                        k=k+1;
               
                }
        }
}
                       
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void main()
{
        WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
        EAXFR = 1; //扩展寄存器(XFR)访问使能
        CKCON = 0; //提高访问XRAM速度
       
         
        P2M0 = 0x00; P2M1 = 0x00;
  P2PU = 0xff;

        LCD_Init3();
        p3_0=1;p3_1=0;       
        while(1)

        {   
                pic13();
                delay_ms(10);
                pic14();
                delay_ms(10);
                p3_0=~p3_0;

        }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15626
发表于 2024-2-8 17:23:39 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 15:44 , Processed in 0.210623 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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