查看: 3927|回复: 8

单片机I/O操作技巧

[复制链接]
  • TA的每日心情
    奋斗
    2016-8-26 01:52
  • 签到天数: 120 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2012-10-20 13:12:28 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 Kite 于 2012-10-20 13:17 编辑

           玩儿单片机也有一年多了,总感觉自己好像缺点什么东西。总之,电子学道路漫长,还得一步步走下去……

           说了点题外话,下面进入正题。。。

           I/O口作为CPU与外设进行数据传输的重要通道,在单片机系统中起着极其重要的作用。此文中,笔者将根据自己的个人经验介绍一些常用的单片机I/O操作技巧。为了避免读者视觉疲劳,现总结成3个简单的题目,欢迎大家参与讨论


    例一:有一16位I/O口PORTx,要求将其高4位和低4位(0000 0000 0000 0000)凑成一个8位数据口控制LCD1602,待发送的数据设为DATA_OUT.请用C语言实现(不超过3条语句,格式参照以下实例)

                         
    用51单片机8位并行口时:
    /* 此处控制信号代码忽略 */
    P0 = DATA_OUT;
    /* 此处控制信号代码忽略 */



    例二:将例一中的高低4位分别改为[13:10]和[6:3]两个位段(0000 0000 0000 0000)


    例三:将例一中高低4位分别改为[13:11]和[6:2]两个位段(0000 0000 0000 0000)



    回复

    使用道具 举报

  • TA的每日心情
    开心
    2015-1-1 01:21
  • 签到天数: 354 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-10-20 13:35:43 | 显示全部楼层
    不知道移位处理会不会麻烦!

    按说移位是最有效率的方式了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-26 01:52
  • 签到天数: 120 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2012-10-20 14:05:39 | 显示全部楼层
    shamowangzi 发表于 2012-10-20 13:35
    不知道移位处理会不会麻烦!

    按说移位是最有效率的方式了!

    我一般用的也是移位,你试着把代码写一下,看咱俩想的是不是一样的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-1-1 01:21
  • 签到天数: 354 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-10-20 15:11:38 | 显示全部楼层
    本帖最后由 shamowangzi 于 2012-10-20 15:17 编辑
    Kite 发表于 2012-10-20 14:05
    我一般用的也是移位,你试着把代码写一下,看咱俩想的是不是一样的


    呵!不是很擅长这方面的操作;
    a=(((a<<8) & 0xf0) | (a&0xf)) ;

    听说:
    a=c/16;
    b=c%16;
    也可以实现对高四和低四位截取!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-26 01:52
  • 签到天数: 120 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2012-10-20 17:03:21 | 显示全部楼层
    shamowangzi 发表于 2012-10-20 15:11
    呵!不是很擅长这方面的操作;
    a=(((a

    和你的想法类似
    我一般也是把数据先分离,然后移到相应位,最后赋给端口寄存器

    PORTx = (DATA_OUT/16 <<12) | (DATA_OUT%16)

    PORTx = (DATA_OUT&0xf0)<<8 | (DATA_OUT&0x0f)

    就是不知道用"/"和"%"和用移位比较哪个比较快,或者说有没有更好的处理方法
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-1-1 01:21
  • 签到天数: 354 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-10-20 17:05:22 | 显示全部楼层
    Kite 发表于 2012-10-20 17:03
    和你的想法类似
    我一般也是把数据先分离,然后移到相应位,最后赋给端口寄存器

    按说用“/”和“%”要经过一次计算!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-26 01:52
  • 签到天数: 120 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2012-10-20 17:15:48 | 显示全部楼层
    shamowangzi 发表于 2012-10-20 17:05
    按说用“/”和“%”要经过一次计算!

    主要反汇编不怎么懂,没法儿算
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2015-8-24 10:58:20 | 显示全部楼层
    要看是那个系列的单片机,
    用汇编的半字节交换指令,大部分都有。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-25 08:50 , Processed in 0.172580 second(s), 28 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.