关于单片机c语言的一个问题

sbitsdat1_595=P2^0;sbitsclk1_595=P2^1;sbitrck1_595=P2^2;。。。voidsend2byte1(uintbyte2){... sbit sdat1_595 =P2^0;
sbit sclk1_595 =P2^1;
sbit rck1_595 =P2^2;




void send2byte1(uint byte2)
{
uchar c;
for(c=0;c<16;c++)
{
sclk1_595=0;
byte2=byte2>>1;
sdat1_595=CY;
sclk1_595=1;
sclk1_595=0;
}



void display(uchar *temp)
{
uchar i;
for(i=0;i<16;i++)
{
sendbyte2(~(*temp++));
sendbyte2(~(*temp++));
send2byte1(1<<i);
delay(1);
send2byte1(0);
}
这是单片机和74HC595搭配时候的一段程序,这个send2byte1()先右移又左移的是什么意思,还有那个进位CY读出来的是什么
展开
 我来答
做而论道
高能答主

2013-08-19 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.1亿
展开全部
for(c=0;c<16;c++)
{
sclk1_595=0;
byte2=byte2>>1;
sdat1_595=CY;
sclk1_595=1;
sclk1_595=0;
}
这是串行输出16位数的程序。
byte2=byte2>>1;是右移,最低位,移动到了 Cy。
CY读出来的是什么,就是16位数的最低位。

for(i=0;i<16;i++)
{
sendbyte2(~(*temp++));
sendbyte2(~(*temp++));
send2byte1(1<<i);
delay(1);
send2byte1(0);
}
这部分,应该结合外部电路,才能正确的分析。

如果驱动的是 LED 点阵显示屏,那么,估计就是:

先串行输出了两次,每次是 sendbyte2(~(*temp++));,应该是某一行的32个点阵数据;
之后,send2byte1(1<<i);,输出一个移动的高电平,应该是行选,使得一行发光;
循环16次,将有16行,轮流显示;
延时;
最后输出一串0,是关闭显示,起消隐作用。

按照这个情况,本程序,是用来驱动 16*32 的点阵 LED 显示屏的。
更多追问追答
追问
用c可以实现带进位的右移吗?这个右移是循环的吗?
追答
用c可以实现带进位的右移吗?
要是问的这么仔细,就要从汇编的角度,来讨论了。
C 程序,干的都是粗话。

这个右移是循环的吗?
不是。
百度网友3b1b680
2013-08-19 · TA获得超过966个赞
知道小有建树答主
回答量:978
采纳率:33%
帮助的人:616万
展开全部
8位数码管。传参数的时候,1<<i表示每次循环的时候,只有一个数码管亮,也就是显示一位数码管。段选择。
而函数里面的左移操作,是为了获得最后一位,左移以后,最后一位放到了CY里面,所以就把最后一位提取出来了。
追问
第一个函数是一个行驱动,第二个函数是一个显示函数,这个程序是实现16×16的led点阵屏的显示,所以第一个函数实现的应该是行扫描,但是他用的这个右移我无法理解,右移了之后还要取出进位,取出来的是什么
追答
看硬件接线图。595的每个引脚应该连着一个数码管。当一个引脚高的时候,就点亮了对应的数码管。
1<<0 1<<1 1<<2 1<<3 1<<4 1<<5 ..
分别点亮了最后一个,倒数第一个,倒数第二个。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jemmydeng
2013-08-19 · TA获得超过203个赞
知道小有建树答主
回答量:211
采纳率:0%
帮助的人:123万
展开全部
在void display(uchar *temp)里 send2byte1(1<<i)是把“1”右移i位,注意不是把i右移1位,不是搞错了。
跟后面的send2byte1(0)是相呼应的。前一句是把“1”右移i位后写到595去,后一句则是把前面写的"1"清除掉。

照猜测,应该是前一句把某位数码管选中点亮,后一句则把它熄灭。

在void send2byte1(uint byte2)里的byte2=byte2>>1,应该是为了把byte2里的最低位移到CY里,后面一句再把CY里的数据放出去。MCS51忘差不多了,这里的操作究竟能不能把最低位移到CY里我不确定。换我的话,我会用更明白的写法:

uchar c; 
uchar temp;
for(c=0;c<16;c++)
{
    sclk1_595=0;
    temp = (byte2 & 0x01);//取最低位
    sdat1_595=temp; //放最低位出去
    sclk1_595=1;
    sclk1_595=0;
 }
更多追问追答
追问
1是左移还是右移i位?我也搞不清这个取CY位到底成不成立,左移才会出现带进位的循环,右移数据直接丢了,书上是这么说的,但是这个程序我用proteus仿真出来的结果是对的,无法理解
追答
是左移,打错了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
JuggYe
2013-08-19 · 超过25用户采纳过TA的回答
知道答主
回答量:141
采纳率:100%
帮助的人:40.2万
展开全部
在display中调用了send2byte1(),这个左移是将1左移i位,参数值在改变。在send2byte1()中右移一位相当于除以2了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式