STC32G端口设置问题 | 已解决
用STC端口2^6和2^7模拟I2C,同样的代码在STC15W4K48S上可以正常运行。尝试移植到STC32G12K128,总是无法点亮OLED12832屏幕,请各位大侠提供一些建议{:4_196:}。不想要外加上拉电阻(原来电路上没有加);也不想用硬件I2C(不想大改代码){:4_183:}
注:确定电路连接没问题。已尝试过设为准双向口;开内部上拉电阻;SDA设置为开漏+SCL设置为强推挽等均无效。
程序:
1, 打开内部 4K 上拉电阻
2,多加些 NOP 延时,速度快了 神农鼎 发表于 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;
}
} 由于 CPU构架 复杂程度 STC32 > STC8 > STC15, 总线的复杂程度增加, 引起 IO口翻转速度减慢.
解决方法 1: IO口 加上拉电阻, 可保持原通讯速率.
解决方法 2: 降低通讯速率 , 为原通讯速率 的1/2倍 试试, 如不行只能再降低 通讯速率. 否则会通讯不正常或丢失第一位数据.
感觉还是时序方面的原因,速度太快了,建议用逻辑分析仪看一下具体原因,找到合适的通信速率。 感谢大家!问题已解决,记录一下解决办法:
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 Uintunsigned int
#define Ulong unsigned long
#define uchar unsigned char
#define uintunsigned 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 com0c0: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+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+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;
}
}
可以用仿真器来访,查找软件的原因
硬件SWD仿真 STC32,用 【STC-USB Link1D 】全自动仿真/脱机下载 工具,有视频讲解 - 仿真/编译器/头文件 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
页:
[1]