关于单片机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读出来的是什么 展开
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读出来的是什么 展开
4个回答
展开全部
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 显示屏的。
{
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 程序,干的都是粗话。
这个右移是循环的吗?
不是。
展开全部
8位数码管。传参数的时候,1<<i表示每次循环的时候,只有一个数码管亮,也就是显示一位数码管。段选择。
而函数里面的左移操作,是为了获得最后一位,左移以后,最后一位放到了CY里面,所以就把最后一位提取出来了。
而函数里面的左移操作,是为了获得最后一位,左移以后,最后一位放到了CY里面,所以就把最后一位提取出来了。
追问
第一个函数是一个行驱动,第二个函数是一个显示函数,这个程序是实现16×16的led点阵屏的显示,所以第一个函数实现的应该是行扫描,但是他用的这个右移我无法理解,右移了之后还要取出进位,取出来的是什么
追答
看硬件接线图。595的每个引脚应该连着一个数码管。当一个引脚高的时候,就点亮了对应的数码管。
1<<0 1<<1 1<<2 1<<3 1<<4 1<<5 ..
分别点亮了最后一个,倒数第一个,倒数第二个。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在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仿真出来的结果是对的,无法理解
追答
是左移,打错了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在display中调用了send2byte1(),这个左移是将1左移i位,参数值在改变。在send2byte1()中右移一位相当于除以2了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询