书上354页~~关于HC595实现串行输入并口输出的函数~~
书上的函数是这样的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次循环实现了数据从高位到低位的串出~~
不知道关于数据从高位串出 马老师有比较好的方法吗?? 扯淡,就这点C的水平?
HC595_data = byte &(0x80>>i); 呵呵,又看到马老师生气了。。。
看来我用的办法马老师也要生气了。。。:)
HC595 _DATA = byte&1<<(7-i); 多算了一次 7-i ,哪个好? 是的,8次循环每次都要多算一次,在AVR Studio里能清楚看到的。。。。
当然是位操作效率更高。。。 楼主位的自己的代码也是可以的。
我主要是针对他说我的代码不能从高位串出,而且还试图改过,最后放弃,好象意思说我的代码改不成从高位串出了。 是的,谢谢马老师。
我的本意也是如此,所以没考虑效率的问题。。。望老师见谅。:) 想跟楼主说的是:程序是和硬件的接线方式对应的 ls,你说得对。但lz估计是在硬件不改的基础上做程序修改的吧。。。
还有起始在马老师的书里关于串入并出和并入串出的高低位读取和发送的方向是有专门提醒的。 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;
}
} ls举一反三,要是是2片595(或更多比如8片)呢?
和马老师的比哪个效率高? 你说呢? 我比较喜欢用if的方法判断是否置1
原因是直观
编译后代码与直接赋值无二
编译器都能支持
写得越规范,越好维护 呵呵 马老师骂的对~~
我本身是机械的~~ 也很少编程吧 C的水平确实不是很高 以前常常也很少考虑到代码的有效性和规范 就只为了实现最后的结果~~
之所以以前经常用IF来判断置一 也是习惯了~~
现在也还是个学生 而且本来也只是个AVR也是初学者~~
最近也是刚刚从ICC换成的CVAVR 所以一时对这个CVAVR专门定义位还不大适应~~
第一次看到马老师那个程序的时候 感觉真简练啊~~ 所以才有了这个愚蠢的问题~~
无论如何 还是谢谢马老师的回答 以后我会注意这个问题 写程序更加规范 更加有效吧~~ 有意思
页:
[1]