共2条
1/1 1 跳转至页
89c668,keilc7 请问关于89c668在keilc7.2下编译时内存模式问题
问
最近我在做一个89c668+CPLD+lcd的系统,开始程序比较小,我用的memory model是small,对lcd的操作没有问题(编写有菜单),后来程序写大了,内存模式改成大,结果对lcd的操作没有反应了(lcd无显示),但是程序在运行(led闪烁),怀疑是89c668对ERAM的寻址问题,于是写了下面的测试程序:
// ************************lcd.c 文件***********************
#include <reg66x.h>
#define LCD_c
#include "lcd.h"
//***********************************
//功能:获得lcd当前状态
//入口:无
//出口:状态字
//***********************************
unsigned char ReadLCDState()
{
return LCD_COM;
}
//***********************************
//功能:读lcd数据
//入口:无
//出口:lcd数据
//***********************************
unsigned char ReadLCDData()
{
while (0x03!=(0x03&ReadLCDState())) {;}
return LCD_DAT;
}
//************************************
//功能:按命令设置lcd
//入口:命令(无参)
//出口:无
//************************************
void SetLCD(unsigned char command)
{
while (0x03!=(0x03&ReadLCDState())) {;}
LCD_COM=command;
}
//************************************
//功能:按命令设置lcd
//入口:命令(单参)?
//出口:无
//************************************
void SetLCD1(unsigned char parameter1,
unsigned char command)
{
while (0x3!=(0x03&ReadLCDState())) {;}
LCD_DAT=parameter1;
while (0x3!=(0x03&ReadLCDState())) {;}
LCD_COM=command;
}
//************************************
//功能:按命令设置lcd
//入口:命令(双参)
//出口:无
//************************************
void SetLCD2(unsigned char parameter1,
unsigned char parameter2,
unsigned char command)
{
while (0x3!=(0x03&ReadLCDState())) {;}
LCD_DAT=parameter1;
while (0x3!=(0x03&ReadLCDState())) {;}
LCD_DAT=parameter2;
while (0x3!=(0x03&ReadLCDState())) {;}
LCD_COM=command;
}
//***************************************
//功能:lcd初始化
//入口:无
//出口:无
//***************************************
void LCDInit(void)
{
SetLCD2(0x00,0x00,TEXT_ADD);
SetLCD2(0x00,0x00,TEXT_ADD);
SetLCD2(WINDOW_WIDTH,0x00,TEXT_WIDTH);
SetLCD2(0x00,0x08,GRAPHICS_ADD);
SetLCD2(WINDOW_WIDTH,0x00,GRAPHICS_WIDTH);
SetLCD(DISPLAY_MODE);
SetLCD(TEXT_GRAPHICS_ON);
}
//*************************************
//功能:清除屏幕
//入口:无
//出口:无
//*************************************
void ClearScreen()
{
unsigned int xdata i; //在i的存储类型不同时测试
SetLCD2(0x00,0x00,DISPLAY_ADD);
SetLCD(START_AUTO_WRITE);
for (i=0;i<=0x2000;i++)
{
while (0x08!=(0x08&ReadLCDState())) {;}
LCD_DAT=0x00;
}
SetLCD(END_AUTO_WRITE);
}
//*************************lcd.h**********************
//一些宏定义省略
#define LCD_COM (*(unsigned char xdata *)0x8000) //lcd指令端口
#define LCD_DAT (*(unsigned char xdata *)0x8100) //lcd数据端
//*************************main.c*********************
#include <reg668.h>
#include "lcd.h"
void main()
{
LCDInit();
ClearScreen();
SetLCD2(0x00,0x08,DISPLAY_ADD);
SetLCD1(0x55,DATA_WRITE);
while (1){;}
}
内存模式在data和xdata,以及函数void ClearScreen()中的i局部变量在data和xdata下,分别编译,结果如下:
1:memory model:data
i :data
结果:data=9.0 xdata=0 code=248
运行正确
2:memory model:data
i :xdata
结果:data=9.0 xdata=2 code=271
运行错误(无显示)
3:memory model:xdata
i :data
结果:data=11 xdata=0 code=257
运行正确
4: memory model:xdata
i :xdata
结果:data=9.0 xdata=0 code=248
运行正确
为什么会出现这种情况,大家帮我分析一下吧,谢谢了 答 1: 大家帮忙看看啊 答 2: 你的Exram管理有问题你的lcd是用并口外扩,
#define LCD_COM (*(unsigned char xdata *)0x8000) //lcd指令端口
#define LCD_DAT (*(unsigned char xdata *)0x8100) //lcd数据端
这样你就使用了扩展XRAm,
你的电路中如果没有外扩XRAM,
你的i定义到XRAM,那,当然就不行了。 答 3: 谢谢zyx_nj ,不过...非常感谢zyx_nj ,不过在第四种情况下:
4: memory model:xdata
i :xdata
结果:data=9.0 xdata=0 code=248
运行正确
i定义在xdata中,运行仍然正确。
只是在第二中情况下,运行才是错误的。
另外,keil c 中的选项,我选中了:使用片内ERAM(0X0000--0X1EFF),i应该被分配在其中吧。
zyx_nj 能继续讨论一下吗?也非常欢迎大家提出分析。
我今晚看一下汇编代码,明天告诉大家
// ************************lcd.c 文件***********************
#include <reg66x.h>
#define LCD_c
#include "lcd.h"
//***********************************
//功能:获得lcd当前状态
//入口:无
//出口:状态字
//***********************************
unsigned char ReadLCDState()
{
return LCD_COM;
}
//***********************************
//功能:读lcd数据
//入口:无
//出口:lcd数据
//***********************************
unsigned char ReadLCDData()
{
while (0x03!=(0x03&ReadLCDState())) {;}
return LCD_DAT;
}
//************************************
//功能:按命令设置lcd
//入口:命令(无参)
//出口:无
//************************************
void SetLCD(unsigned char command)
{
while (0x03!=(0x03&ReadLCDState())) {;}
LCD_COM=command;
}
//************************************
//功能:按命令设置lcd
//入口:命令(单参)?
//出口:无
//************************************
void SetLCD1(unsigned char parameter1,
unsigned char command)
{
while (0x3!=(0x03&ReadLCDState())) {;}
LCD_DAT=parameter1;
while (0x3!=(0x03&ReadLCDState())) {;}
LCD_COM=command;
}
//************************************
//功能:按命令设置lcd
//入口:命令(双参)
//出口:无
//************************************
void SetLCD2(unsigned char parameter1,
unsigned char parameter2,
unsigned char command)
{
while (0x3!=(0x03&ReadLCDState())) {;}
LCD_DAT=parameter1;
while (0x3!=(0x03&ReadLCDState())) {;}
LCD_DAT=parameter2;
while (0x3!=(0x03&ReadLCDState())) {;}
LCD_COM=command;
}
//***************************************
//功能:lcd初始化
//入口:无
//出口:无
//***************************************
void LCDInit(void)
{
SetLCD2(0x00,0x00,TEXT_ADD);
SetLCD2(0x00,0x00,TEXT_ADD);
SetLCD2(WINDOW_WIDTH,0x00,TEXT_WIDTH);
SetLCD2(0x00,0x08,GRAPHICS_ADD);
SetLCD2(WINDOW_WIDTH,0x00,GRAPHICS_WIDTH);
SetLCD(DISPLAY_MODE);
SetLCD(TEXT_GRAPHICS_ON);
}
//*************************************
//功能:清除屏幕
//入口:无
//出口:无
//*************************************
void ClearScreen()
{
unsigned int xdata i; //在i的存储类型不同时测试
SetLCD2(0x00,0x00,DISPLAY_ADD);
SetLCD(START_AUTO_WRITE);
for (i=0;i<=0x2000;i++)
{
while (0x08!=(0x08&ReadLCDState())) {;}
LCD_DAT=0x00;
}
SetLCD(END_AUTO_WRITE);
}
//*************************lcd.h**********************
//一些宏定义省略
#define LCD_COM (*(unsigned char xdata *)0x8000) //lcd指令端口
#define LCD_DAT (*(unsigned char xdata *)0x8100) //lcd数据端
//*************************main.c*********************
#include <reg668.h>
#include "lcd.h"
void main()
{
LCDInit();
ClearScreen();
SetLCD2(0x00,0x08,DISPLAY_ADD);
SetLCD1(0x55,DATA_WRITE);
while (1){;}
}
内存模式在data和xdata,以及函数void ClearScreen()中的i局部变量在data和xdata下,分别编译,结果如下:
1:memory model:data
i :data
结果:data=9.0 xdata=0 code=248
运行正确
2:memory model:data
i :xdata
结果:data=9.0 xdata=2 code=271
运行错误(无显示)
3:memory model:xdata
i :data
结果:data=11 xdata=0 code=257
运行正确
4: memory model:xdata
i :xdata
结果:data=9.0 xdata=0 code=248
运行正确
为什么会出现这种情况,大家帮我分析一下吧,谢谢了 答 1: 大家帮忙看看啊 答 2: 你的Exram管理有问题你的lcd是用并口外扩,
#define LCD_COM (*(unsigned char xdata *)0x8000) //lcd指令端口
#define LCD_DAT (*(unsigned char xdata *)0x8100) //lcd数据端
这样你就使用了扩展XRAm,
你的电路中如果没有外扩XRAM,
你的i定义到XRAM,那,当然就不行了。 答 3: 谢谢zyx_nj ,不过...非常感谢zyx_nj ,不过在第四种情况下:
4: memory model:xdata
i :xdata
结果:data=9.0 xdata=0 code=248
运行正确
i定义在xdata中,运行仍然正确。
只是在第二中情况下,运行才是错误的。
另外,keil c 中的选项,我选中了:使用片内ERAM(0X0000--0X1EFF),i应该被分配在其中吧。
zyx_nj 能继续讨论一下吗?也非常欢迎大家提出分析。
我今晚看一下汇编代码,明天告诉大家
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |