音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

請問關于89c668在keilc7.2下編譯時內存模式問題

作者:yzgwxflove 欄目:單片機
請問關于89c668在keilc7.2下編譯時內存模式問題
最近我在做一個89c668+cpld+lcd的系統(tǒng),開始程序比較小,我用的MEMORY MODEL是small,對lcd的操作沒有問題(編寫有菜單),后來程序寫大了,內存模式改成大,結果對lcd的操作沒有反應了(lcd無顯示),但是程序在運行(led閃爍),懷疑是89c668對ERAM的尋址問題,于是寫了下面的測試程序:

// ************************lcd.c 文件***********************
#include <reg66x.h>
#define LCD_c
#include "lcd.h"

//***********************************
//功能:獲得lcd當前狀態(tài)
//入口:無
//出口:狀態(tài)字
//***********************************
unsigned CHAR ReadLCDState()
{
    return LCD_COM;
}
//***********************************
//功能:讀lcd數(shù)據(jù)
//入口:無
//出口:lcd數(shù)據(jù)
//***********************************
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數(shù)據(jù)端

//*************************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,以及函數(shù)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
   運行正確

為什么會出現(xiàn)這種情況,大家?guī)臀曳治鲆幌掳,謝謝了

2樓: >>參與討論
yzgwxflove
大家?guī)兔纯窗?br> 
3樓: >>參與討論
zyx_nj
你的Exram管理有問題
你的lcd是用并口外擴,
#define LCD_COM             (*(unsigned CHAR xdata *)0x8000)                              //lcd指令端口
#define LCD_DAT             (*(unsigned CHAR xdata *)0x8100)                              //lcd數(shù)據(jù)端

這樣你就使用了擴展XRAm,
你的電路中如果沒有外擴XRAM,
你的i定義到XRAM,那,當然就不行了。

4樓: >>參與討論
yzgwxflove
謝謝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 能繼續(xù)討論一下嗎?也非常歡迎大家提出分析。

我今晚看一下匯編代碼,明天告訴大家

參與討論
昵稱:
討論內容:
 
 
相關帖子
幫忙推薦一個8位LED動態(tài)掃描的片子
24c32
keil如何抑制uchar code abc[5]={1,2,3,4,5};編譯警告
電子愛好者社區(qū)www.mcuwork.com/bbs歡迎大家來玩。。
求助用單片機控制游戲手柄的搖桿
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號