将89C52 代码转8051U 还需要注意什么
大家好,上篇帖子大家建议将89C52 芯片转换为8051U (或者AI8051U),目前已经换了芯片,但是代码烧录入新的电路系统后无法工作。通过查阅规格书,在89C52 代码中做了如下代换:1. 代码加入8051U 芯片 的头文件,将8051U 设置工作于8位模式。
2.P0 定义为开漏模式, 外接上拉电阻 驱动LCD,P1,P2,P3,P4口均定义位准双向口,
3. 使用片内RC震荡模式,烧录时输入12Mhz 频率,
4. 请问上述设置是否正确?是否还有别的寄存器需要设置?89C52 代码工作是正常的 但是烧录入8051U 电路后 LCD不能点亮,电路只能检测到有工作电流,按键都无反应。。。。。。
请大家不吝指教,谢谢大家
https://www.stcaimcu.com/data/do ... /STC89C52RC-RD+.pdf
看最新数据手册
除IO外设程序兼容外还要注意:
AI8051U速度过快,LCD可能反应不过来,用逻辑分析仪或示波器测一下IO是否有信号
P0开漏,外部10K上拉,可能无法高速通信,上升沿不够快
建议直接使用内部4K上拉(接收),不需要外部上拉
只发送可以直接设置为推挽
谢谢,再学习一下
点1602、12864、TFT及其他I8080/M6800兼容接口屏幕,建议直接学习、使用AI8051U的LCM_DMA:
https://www.stcaimcu.com/thread-11351-1-1.html
https://www.stcaimcu.com/thread-10402-1-1.html
windsuncloud 发表于 2025-4-22 23:27
谢谢,再学习一下
原电脑没有带,重新注册一个号来更新一下。 mdmikdqm 发表于 2025-5-3 21:35
原电脑没有带,重新注册一个号来更新一下。
现在能点亮LCD,程序的设计是先进入初始化设置,现在按设置键无法进入时间设置子程序对DS1302进行初始时间的写入数据,LCD屏幕显示也有闪烁现象,将主频设置为12MHz也是一样,按闹钟设置键后进入设置闹钟子程序LCD显示可以稳定不闪烁,按键功能也能部分实现比如数字的增减,分 秒 时的切换也可以实现,但是部分字符出现乱码。现在不知道是不是DS1302数据读取还是LCD1302写入部分出现问题。请大家指点一下这到底是什么原因。以下是初始化代码。
-------------------------------------------------------------------------------- void write_1602com(uchar com)//****液晶写入指令函数****
{
rs=0;//数据/指令选择置为指令
rw=0; //读写选择置为写
P0=com;//送入数据
delay(1);
en=1;//拉高使能端,为制造有效的下降沿做准备
delay(1);
en=0;//en由高变低,产生下降沿,液晶执行命令
}
void write_1602dat(uchar dat)//***液晶写入数据函数****
{
rs=1;//数据/指令选择置为数据
rw=0; //读写选择置为写
P0=dat;//送入数据
delay(1);
en=1; //en置高电平,为制造下降沿做准备
delay(1);
en=0; //en由高变低,产生下降沿,液晶执行命令
}
void Lcd_ram()
{
uintj,k=0,temp=0x40;
for(j=0;j<8;j++)
{
write_1602com(temp+j);
write_1602dat(num);
k++;
}
}
void lcd_init()//***液晶初始化函数****
{
write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,光标自动右移
write_1602com(0x01);//清显示
write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示
for(a=0;a<14;a++)
{
write_1602dat(tab1);//向液晶屏写日历显示的固定符号部分
//delay(3);
}
write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示
for(a=0;a<8;a++)
{
write_1602dat(tab2);//写显示时间固定符号,两个冒号
//delay(3);
}
}
/*********************over***********************/
/***************DS1302有关子函数********************/
//----------------------------------------
void write_1302(uchar addr, uchar dat)//向1302芯片写函数,指定写入地址,数据
{
uchar n;
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1; //然后将RST(CE)置高电平。
_nop_();
for (n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
_nop_();
}
for (n=0; n<8; n++)//写入8位数据
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
_nop_();
}
RST = 0;//传送数据结束
_nop_();
}
uchar read_1302(uchar addr )//从1302读数据函数,指定读取数据来源地址
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1;//然后将RST(CE)置高电平。
_nop_();
for(n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
dat1 = DSIO;//从最低位开始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
RST = 0;
_nop_(); //以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制
{
uchar Decimal;
Decimal=bcd/16*10+bcd%16;
return(Decimal );
} mdmikdqm 发表于 2025-5-3 22:30
现在能点亮LCD,程序的设计是先进入初始化设置,现在按设置键无法进入时间设置子程序对DS1302进行初始时 ...
有数据,能显示,说明时钟芯片通讯和液晶显示程序基本没有问题 感觉就是这里描述的运行速度过快的问题,改变延时子程序之后可以实现不闪烁,但是没有头绪如何对相应的指令运行时间进行调整。。。
页:
[1]