困惑:关于点阵屏中74hc595芯片的写一个字节程序。 声明:这个程序是可以正确运行的。 20

声明:这个程序是可以正确运行的。程序如下:voidSendByte(unsignedchardat){unsignedchari;for(i=0;i<8;i++){SRC... 声明:这个程序是可以正确运行的。

程序如下:

void SendByte(unsigned char dat)
{
unsigned char i;

for(i=0;i<8;i++)
{
SRCLK=0;
SER=dat&0x80;
dat<<=1;
SRCLK=1;
}

}

我的困惑是:
程序前面有 sbit SER = P1^5;位定义过的,那么SER 就是位操作,而0x80并不是一位呀?

例如:SendByte(0x80);那么SER=0x80&0x80,于是SER=0x80,这是不匹配的呀。

谁能帮忙一下,谢谢。
展开
 我来答
出发吧90后
2012-03-05
知道答主
回答量:2
采纳率:0%
帮助的人:3305
展开全部
我知道,其实这个你要看595的内部结构的,因为他的数据是串行的,所以dat&0x80是取dat的最高位送到595,循环8次,把一个完整的8位数送到595。 SER=dat&0x80; dat<<=1;这两句是缺一不可的。
广州晶晟电子
2023-10-12 广告
OSC有源晶振是一种电子元件,它需要接电源才能工作,一般有四个引脚,其中有两个是电源输入引脚,有正负极之分。它是石英晶体震荡器的简称,英文名为Crystal。石英晶体震荡器的应用范围非常广,包括通讯系统、时钟电路、显卡、网卡、主板等配件的各... 点击进入详情页
本回答由广州晶晟电子提供
zouxiarong8
2011-09-07 · 超过23用户采纳过TA的回答
知道答主
回答量:47
采纳率:0%
帮助的人:61.9万
展开全部
SER是一位,后面的数按位与完之后SER只取最高位而已,明白???
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
064ieyq336
2011-08-27 · TA获得超过208个赞
知道答主
回答量:506
采纳率:0%
帮助的人:275万
展开全部
/*****************************************************
16*128 LED点阵屏 C 程序
******************************************************
声明:
本程序供大家学习之用,用勿用于商业用途。尊重版权。

编写:邓椿薪
时间:2006年1月20日 晚
邮箱:love2151@xinhuanet.com
*******************************************************

//595连级输出数据,138行驱动。P0_1为移动速度高速/*点阵显示汉字程串口输出字符数据,
//P2口输出行扫描信号,P2_7输出595锁存信号。*/

#define uchar unsigned char
#define uint unsigned int

#include <REG51.H>
#include <CODESUB.H>

uchar yid,h,d=12; //YID为移动计数器,H为行段计数器。
uint zimuo,zimuo1; //字模计数器

uchar BUFF[18]; //缓存
void in_data(void); //调整数据
void rxd_data(void); //发送数据

void in_data1(char h);
void rxd_data1(void);
void sbuf_out1(void);

void sendsw(uchar k); //发送段代码
void sbuf_out(void); //16段扫描
void key(void);

sbit AN1=P3^4;
sbit AN2=P3^5;

sbit clk=P3^3;

unsigned code sw[16]={0x7f,0x6f,0x5f,0x4f,0x3f,0x2f,0x1f,0x0f,0xf7,
0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0}; /*16行段码*/

/********************************************/
void main(void)
{ uchar i;
zimuo1=sizeof(hanzi)-6*32;//(zishu+9)*32;
yid=0;
zimuo=0;
while(1)
{
while(yid<100) //数据移位。
{
for(i=0;i<D;I++) if(zimuo 后移一个字, zimuo="zimuo+32*5;//zimuo+32;" yid="0;" } 移动一步 yid++; sbuf_out1();key(); { 移动速度>zimuo1) //总数减7个字。
zimuo=0;
}

}

void sbuf_out1()
{
char i;
for(h=0;h<32;h++)
{

in_data1(h);
clk=1;
rxd_data1();
if(h>=16)
else i=h;
sendsw(sw[i]);

}

}

/******************************************************/

void in_data1(char h)
{
char s,i;
if(h>=16)
{i=(h-16);

for(s=5;s>=0;s--) //h为向后先择字节计数器,zimuoo为向后先字计数器
{
// if(zimuo%32)
BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*i]; //把第一个字模的第一个字节放入BUFF1中,第二个字模和第一个字节放入BUFF3中
BUFF[2*s]=hanzi[zimuo+0+32*s+2*i]; // 把第一个字模的第二个字节放入BUFF0中,第二个字模的第二个字节放入BUFF1中
}
}
else
{
i=h;
for(s=5;s>=0;s--) //h为向后先择字节计数器,zimuoo为向后先字计数器
{
// if(zimuo%32)
BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*i]; //把第一个字模的第一个字节放入BUFF1中,第二个字模和第一个字节放入BUFF3中
BUFF[2*s]=hanzi[zimuo+0+32*s+2*i]; // 把第一个字模的第二个字节放入BUFF0中,第二个字模的第二个字节放入BUFF1中
}
}

}

/*******************************************************/

void rxd_data1(void) //串行发送数据
{
char s;
for(s=0;s<10;s++) //发送5字节数据
{

SBUF=255-BUFF[s];//把BUFF中的字节从大到小移位相或后发送输出。
while(!TI);TI=0; //等待发送中断
}
}

void sendsw(uchar k)
{
TI=0;
SBUF=k;
while(!TI);TI=0;
clk=0;

}

void key(void)
{
uchar a,b;
if(AN1==0)
{
for(a=0;a<10;a++)
}
if(AN1==0)
{while(AN1==0)
{}
if(AN1)
{d++;
if(d>100)
d=100;
}
}
}
if(AN2==0)
{for(a=0;a<10;a++)
}
if(AN2==0)
{while(AN2==0)
{}
if(AN2)
{d--;
if(d==0)
d=1;
}
}
}
}
不是我写的,但我想会对你有用。
追问
这种程序我能理解的,答非所问。谢谢。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式