这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 89c668,keilc7 请问关于89c668在keilc7.2下编译时内存模

共2条 1/1 1 跳转至

89c668,keilc7 请问关于89c668在keilc7.2下编译时内存模式问题

院士
2006-09-17 18:14:16     打赏
89c668,keilc7 请问关于89c668在keilc7.2下编译时内存模式问题



关键词: 89c668     keilc7     请问     关于     keilc    

院士
2006-12-22 22:43:00     打赏
2楼
问 最近我在做一个89c668CPLD+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 能继续讨论一下吗?也非常欢迎大家提出分析。

我今晚看一下汇编代码,明天告诉大家

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]