|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請問關于89c668在keilc7.2下編譯時內存模式問題 |
| 作者:yzgwxflove 欄目:單片機 |
最近我在做一個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 于 2005/1/17 12:33:00 發(fā)布:
大家?guī)兔纯窗?br> |
|
| 3樓: | >>參與討論 |
| 作者: zyx_nj 于 2005/1/17 13:31:00 發(fā)布:
你的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 于 2005/1/17 19:31:00 發(fā)布:
謝謝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ù)討論一下嗎?也非常歡迎大家提出分析。 我今晚看一下匯編代碼,明天告訴大家 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |