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

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

Keil c51編譯器問題,請進(jìn)來研究研究.急!

作者:qqkevin 欄目:單片機(jī)
Keil c51編譯器問題,請進(jìn)來研究研究.急!
小弟近來用SST的單片機(jī),想使用那單片機(jī)的IAP功能,今天程序?qū)懲暧肒EIL一仿真出了怪事,現(xiàn)在羅列出來給高手們看看.
#include <REG52.H>                                                  
sfr SFCF = 0xB1; /*FLASH配置位*/
sfr SFCM = 0xB2; /*FLASH命令位*/
sfr SFAL = 0xB3; /*FLASH地址低位*/
sfr SFAH = 0xB4; /*FLASH地址高位*/
sfr SFDT = 0xB5; /*FLASH數(shù)據(jù)位*/
sfr SFST = 0xB6; /*FLASH狀態(tài)位*/

#define SFCM_SE 0x0B; /*扇區(qū)擦除IAP指令*/
#define SFCM_VB 0x0C; /*字節(jié)校讀IAP指令*/
#define SFCM_PB 0x0E; /*字節(jié)編程IAP指令*/

void sector_erase(unsigned SHORT int dataAddr);
void main()
{
unsigned SHORT int destAddr = 0x80;
sector_erase(destAddr); /*寫數(shù)據(jù)前先擦除要寫的扇區(qū)*/

}


void sector_erase(unsigned SHORT int dataAddr)
{

SFCF = SFCF | 0x40; /*IAP使能*/
SFAH = dataAddr>>8; /*存入地址的高位字節(jié)*/
SFAL = dataAddr; /*存入地址的低位字節(jié)*/
SFCM = SFCM_SE; /*發(fā)出扇區(qū)擦除指令*/

return;
}

下面是KEIL編譯后的匯編指令:

    26: void sector_erase(unsigned SHORT int dataAddr)
C:0x0003    AD07     MOV      R5,0x07
C:0x0005    AC06     MOV      R4,0x06
    27: {
    28:  
    29: SFCF = SFCF | 0x40; /*IAP使能*/
C:0x0007    43B140   ORL      SFCF(0xB1),#0x40
    30: SFAH = dataAddr>>8; /*存入地址的高位字節(jié)*/
C:0x000A    8CB4     MOV      SFAH(0xB4),R4
    31: SFAL = dataAddr; /*存入地址的低位字節(jié)*/
C:0x000C    8DB3     MOV      SFAL(0xB3),R5
    32: SFCM = SFCM_SE; /*發(fā)出扇區(qū)擦除指令*/
    33:  
    34: return;
C:0x000E    75B20B   MOV      SFCM(0xB2),#0x0B
    35: }
C:0x0011    22       RET      
C:0x0012    787F     MOV      R0,#0x7F
C:0x0014    E4       CLR      A
C:0x0015    F6       MOV      @R0,A
C:0x0016    D8FD     DJNZ     R0,C:0015
C:0x0018    758107   MOV      SP(0x81),#0x07
C:0x001B    02001E   LJMP     main(C:001E)
    15: void main()
    16: {
    17: unsigned SHORT int destAddr = 0x80;
    18:  
    19:  
    20:  
C:0x001E    7F80     MOV      R7,#P0(0x80)
C:0x0020    7E00     MOV      R6,#0x00
    21: sector_erase(destAddr); /*寫數(shù)據(jù)前先擦除要寫的扇區(qū)*/
C:0x0022    020003   LJMP     sector_erase(C:0003)

看,sector_erase(unsigned SHORT int dataAddr);的入口變量恒為0x0607了,且無論我如何修改dataAddr的值,R4跟R5寄存器的值還是不變.也就是外部的值怎么都傳不到dataAddr里去.
我還寫多了兩個子程序byte_program(destAddr, origData);verifyData=byte_verify(destAddr);
還是會出現(xiàn)同樣的問題,請問大家之前有沒遇見過這個問題.該怎么解決呢?
還有個問題,IAP功能可以在KEIL的仿真環(huán)境下觀察EEPROM里面的數(shù)據(jù)嗎?

2樓: >>參與討論
lg3459
就這樣。。
R4、R5寄存器保存的是0X06、0X07單元的內(nèi)容,也就是MOV R4,R6,MOV R5,R7
再一個,SHORT 和int 都是16位的,沒必要定義2次吧?

3樓: >>參與討論
qqkevin
請問KEIL是不是..
原來是這樣,又學(xué)到東西了,謝謝樓上的高手.
請問在KEIL是不是不可以用查看CODE變量的方式來看IAP過的那些EEPROM寄存器的數(shù)值呢?
如果不可以的話那有沒什么比較方便的方法來驗(yàn)證我程序的效果呢?

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
有沒有人用過openTCP?我想知道在51上能跑多快
各們,小弟有一事不解...幫幫忙..
求助:誰有GAL16V8的編譯軟件
幾種2MByte串行flash,哪種價格最便宜?
求助:單片機(jī)控制直流電機(jī)閉環(huán)調(diào)速系統(tǒng)
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


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