《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

EMC8BIT单片机指令应用的误区与技巧
程序匠人 发表于 2005-5-21 23:47:00  阅读全文 | 回复(5) | 引用通告 | 编辑

EMC8BIT单片机从入门到精通之二:指令应用的误区与技巧

EMC的基本指令语法,其实也就57/58条,如何变化折腾,就看各位的修行造化了。
但是,新手上路总容易进入一些误区,而老鸟们的一些技巧也值得借鉴。
废话少说,言归正传,且看匠人娓娓道来……


 
 
1.减法指令的误区

    之一:关于ACC

    EMC的减法指令有三条,如下:
        SUB A,R (R-A→A)
        SUB R,A (R-A→R)
        SUB A,K (K-A→A)
    需要注意的是,不论A的位置在前面还是后面,A都是减数,不是被减数.

    也就是說如果我們想計算A-2的值,如果寫成:
        SUB A,@2   
    其實是執行2-A
   
    解決方法如下:
        ADD A,@256-2 或
        ADD A,@254
   

    之二:关于CY

    一般来说,加/减法都会影响到进位标志CY.
    在其它一些单片机指令系统中,当减法发生借位时,CY=1,未发生借位时CY=0.
    如果你以为EMC的减法也是如此,哈哈,你就要吃药了!
    原来,在EMC的指令系统中.当减法发生借位时,CY=0,未发生借位时CY=1.
    如果不注意这点,很容易在一些运算或判断程序中留下BUG

 

2.查表(散转)指令的误区
   
    之一:关于"ADD R2,A"指令

    在EMC153/156的指令系统中,没有TBL指令(这一点要切记),当要查表时只好用"ADD R2,A"(或MOV R2,A)来代替
    但是使用"ADD R2,A"时要注意,这条指令只能改变PC指针的低8位(即256字节),高位其它位一律清零!
    所以使用"ADD R2,A"时必须保证整个表格都在ROM的每一页的前256字节区间内.(153/156只有一页)

    大表格的使用受到了限制,而且为了将表格"挤入"00H~FFH的ROM空间,程序的结构受到破坏.

   

    之二:关于"TBL"指令

    刚才说道,"ADD R2,A"指令使用的诸多不爽之处.
    为此,EMC在447/458及后续的芯片的指令系统中,增加了一条新指令----就是TBL指令.
    TBL是查表指令.号称可以放在程序的任何位置.
    但是且慢----
    TBL指令的使用也要注意如下:
    首先,表格不能跨页(每1024字节为一页(PAGE))
    其次,表格也不能跨"段"
   
    何为"段"?----"段"是匠人自定义的一个概念:将每一页分为4段,每一段256个字节(如:00H~FFH是一段,100H~1FFH又是一段)   
   
    也就是说,每一个查表程序,除了TBL本身占用了一个字节以外表格长度必须<=255字节.而且整个查表程序必须在同一"段"内
   
    这个问题真是一个大大的陷阱!
    有时明明你的程序都已经调试好了,无意间调整了程序模块间的顺序或增加/减少了几条指令后,程序就不正常了.
    嘿嘿,检查你的LST文件吧,八成是TBL在做怪!
   
    另外,TBL还是没有解决大表格的查表问题,(只好象切豆腐一样,将大表格切成一个个小于255字节的小表格去查了)

3.关于“MOV R,R”指令

    这是一条很奇特的指令,首先,阁下不要误认这条指令,以为它是将一个寄存器的数据送到另一个寄存器中去。匠人开始接触EMC 8bit IC时,就曾经“中招”!后经过高手指点,方得解脱——我佛慈悲,呕米脱佛!

    看清楚了:"MOV R,R" 中的两个R是同一个寄存器,而它的动作是将寄存器的内容送到本身。

    如果你认为这是无意义的动作,那就大错特错了。
   
    按匠人的经验,这条指令至少有两个用处:


用处之一:判零

    此指令的用意在于它能影响Zero Flag,辨别寄存器的内容是否为零。

    如果要辨别某一个寄存器的值是否为零,一般我们会用
        MOV    A,R
        JBS    STTS,Z        ; R3,Zero Flag
    这两个指令,但是这会影响ACC原先的内容。若不要使用ACC,可能写成
        INC    R
        DEC    R
        JBS    STTS,Z
    这会用到三个指令。若使用MOV R,R的指令,不仅可达成相同功能,也可减少指令数目,可说是一举两得。
        MOV    R,R
        JBS    STTS,Z


用处之二:将I/O口的外部电平状态存入锁存器
   
    说到这里,要先介绍一下EMC的IO口特性了。
    EMC的IO口一般都是三态,可设置为    高阻(输入);或输出状态
    当IO口设置为输入状态时,只能“读”,不能“写”,CPU通过IO口直接“读”外部电平,如果这时发生“写”动作,则数据并不会输出,而是被存放到一个锁存器中,待到IO口变成输出状态时,再将锁存器中的数据送到IO口上。
    ——注意:在这里,源寄存器和目的寄存器虽然地址相同,但实质不是一回事了。(相当于一个门牌住着两户人家)

    假如有这么一条指令:MOV    R6,R6
    分析:先将R6口的外部电平状态读入,再送到R6的锁存器里。

    比如:R6口作电平翻转唤醒功能时,必须先将其外部电平保存到锁存器中
        MOV    R6,R6
    然后开启R6口电平翻转唤醒功能,当R6口状态与锁存器中发生变化时,即可触发相应中断。
    (R6的相应口必须设置为输入状态)   

 

 

再次提醒,“ MOV R,R”指令 不能用作两个寄存器间送数用,如果要在两个寄存器间送数,一定要通过中介公司——ACC。
   
    如果想减轻写程序的劳累,那就把下面这段宏插入到你的程序中去:
        MOV     MACRO    REG1,REG2
            MOV    A,REG2
            MOV    REG1,A
        ENDM
    这样,当你写“MOV REG1,REG2”时,系统会自动帮你转化成两条指令:
            MOV    A,REG2
            MOV    REG1,A

    ——领悟了否?我佛慈悲,呕米脱佛!


看《匠人手记》,与匠人同行!北航出版,正在热卖!

Re:EMC8BIT单片机指令应用的误区与技巧
Charles(游客)发表评论于2008-11-7 15:55:00  个人主页 | 引用 | 返回 | 删除 | 回复

Charles(游客)想更正一下,从更严谨的角度来说,EMC78系列的TBL指令是可以查大表的,至少查256行的表没问题,如果将TBL指令放在“段”的最后一个地址,则256行的表不会出错,如果采用更BT的方法,在一个8K ROM的单片机上做一个连续7K的表是完全没有问题的,我做过一个连续6K的表用于在Program ROM中存放一段语音数据,有兴趣的朋友可以发邮件到:chq_cn@163.com交流

以下为程序匠人的回复:
愿闻其详

看《匠人手记》,与匠人同行!北航出版,正在热卖!

支持顶~~~
OEIBXIM(游客)发表评论于2007-3-25 19:14:00  个人主页 | 引用 | 返回 | 删除 | 回复

OEIBXIM(游客)我支持顶~~~

看《匠人手记》,与匠人同行!北航出版,正在热卖!

Re:EMC8BIT单片机指令应用的误区与技巧
kbj305(游客)发表评论于2006-12-6 15:53:00  个人主页 | 引用 | 返回 | 删除 | 回复

kbj305(游客)经典啊

看《匠人手记》,与匠人同行!北航出版,正在热卖!

回复:EMC8BIT单片机指令应用的误区与技巧
星之目(游客)发表评论于2006-6-4 15:51:00  个人主页 | 引用 | 返回 | 删除 | 回复

星之目(游客)

多谢,多谢!

本人收益非前啊~收藏

看《匠人手记》,与匠人同行!北航出版,正在热卖!

回复:EMC8BIT单片机指令应用的误区与技巧
wzy_0649(游客)发表评论于2006-4-27 15:45:00  个人主页 | 引用 | 返回 | 删除 | 回复

wzy_0649(游客)受益匪浅啊。。。

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

    [AVR猎手的地盘]

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!