搜索
bottom↓
回复: 14

书上354页~~关于HC595实现串行输入并口输出的函数~~

[复制链接]

出0入0汤圆

发表于 2009-9-4 15:27:30 | 显示全部楼层 |阅读模式
书上的函数是这样的

void HC595_send_byte(unsigned char byte)//由低位到高位串出1字节
{
    unsigned char i;
    for(i=0;i<=7;i++)
    {
      HC595_data=byte&1<<i;
      HC595_clk=1;
      HC595_clk=0;
     }
}

我先要申明 马老师的这个函数写的很好 很简练~~

但是有一个不好的问题就在于 发送数据时是由低位到高位~~

这个在实际应用中会出现问题~~ 比如我要点亮一个数码管 让他输出数字0 数码管为共阳

比如 本来应该的数据是1100 0000

但是如果马老师用原来那个函数 输出来的结果就是0000 0011(从低位到高位输出)~~

从而数码管不能正常的显示~~

后面 我用马老师的那个函数改了个下面这样的

void HC595_send_byte(unsigned char byte)  //由高位到低位串出1字节
{
    unsigned char i;
    for(i=7;i>0;i--)     //或者是for(i=7;i>=0;i--)
    {
      HC595_data=byte&1<<i;
      HC595_clk=1;
      HC595_clk=0;
     }
}

仔细分析了下  应该都不能实现我要的那个高位到低位串出的结果~~

无奈之下 我又用了以前比较常规的方法~~

下面是我的函数

void HC595_send_byte(unsigned char byte)
{
        char i;
        for(i=0;i<8;i++)
        {
               
                if(byte&(1<<7))
                        HC595_data=1;
                else
                        HC595_data=0;
                HC595_clk=1;
                byte=byte<<1;
                HC595_clk=0;
               
        }
        HC595_Latch=1;
        HC595_Latch=0;
}

用了个if else 来判断是0还是1~~ 然后通过移位实现下一个数据的判断~~

通过8次循环实现了数据从高位到低位的串出~~

不知道关于数据从高位串出 马老师有比较好的方法吗??

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2009-9-4 17:22:56 | 显示全部楼层
扯淡,就这点C的水平?

HC595_data = byte &(0x80>>i);

出0入0汤圆

发表于 2009-9-5 19:59:12 | 显示全部楼层
呵呵,又看到马老师生气了。。。
看来我用的办法马老师也要生气了。。。:)
HC595 _DATA = byte&1<<(7-i);

出0入0汤圆

发表于 2009-9-5 21:09:04 | 显示全部楼层
多算了一次 7-i ,哪个好?

出0入0汤圆

发表于 2009-9-5 21:31:45 | 显示全部楼层
是的,8次循环每次都要多算一次,在AVR Studio里能清楚看到的。。。。
当然是位操作效率更高。。。

出0入0汤圆

发表于 2009-9-6 01:28:50 | 显示全部楼层
楼主位的自己的代码也是可以的。

我主要是针对他说我的代码不能从高位串出,而且还试图改过,最后放弃,好象意思说我的代码改不成从高位串出了。

出0入0汤圆

发表于 2009-9-6 08:56:19 | 显示全部楼层
是的,谢谢马老师。
我的本意也是如此,所以没考虑效率的问题。。。望老师见谅。:)

出0入0汤圆

发表于 2009-9-6 09:02:52 | 显示全部楼层
想跟楼主说的是:程序是和硬件的接线方式对应的

出0入0汤圆

发表于 2009-9-6 09:11:40 | 显示全部楼层
ls,你说得对。但lz估计是在硬件不改的基础上做程序修改的吧。。。
还有起始在马老师的书里关于串入并出和并入串出的高低位读取和发送的方向是有专门提醒的。

出0入0汤圆

发表于 2009-9-6 09:27:22 | 显示全部楼层
void HC595_send_byte(unsigned char byte) //由高位到低位串出1字节
{
    unsigned char i;
    i=0x80;
    while(i)
    {
      HC595_data=byte&i;
      HC595_clk=1;
      HC595_clk=0;
      i>>=1;
     }
}

出0入0汤圆

发表于 2009-9-6 09:49:57 | 显示全部楼层
ls举一反三,要是是2片595(或更多比如8片)呢?
和马老师的比哪个效率高?

出0入0汤圆

发表于 2009-9-6 09:53:18 | 显示全部楼层
你说呢?

出0入0汤圆

发表于 2009-9-6 10:07:01 | 显示全部楼层
我比较喜欢用if的方法判断是否置1
原因是直观
编译后代码与直接赋值无二
编译器都能支持

写得越规范,越好维护

出0入0汤圆

 楼主| 发表于 2009-9-8 10:22:32 | 显示全部楼层
呵呵 马老师骂的对~~

我本身是机械的~~ 也很少编程吧 C的水平确实不是很高 以前常常也很少考虑到代码的有效性和规范 就只为了实现最后的结果~~

之所以以前经常用IF来判断置一 也是习惯了~~

现在也还是个学生 而且本来也只是个AVR也是初学者~~

最近也是刚刚从ICC换成的CVAVR 所以一时对这个CVAVR专门定义位还不大适应~~

第一次看到马老师那个程序的时候 感觉真简练啊~~ 所以才有了这个愚蠢的问题~~

无论如何 还是谢谢马老师的回答 以后我会注意这个问题 写程序更加规范 更加有效吧~~

出0入0汤圆

发表于 2010-10-16 15:22:07 | 显示全部楼层
有意思
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 16:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表