51单片机点阵,问题在于为什么date必须是char型?

2019-07-15 15:37发布

#include<reg51.h>
#include<intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitRCLK=P3^5;
sbitSRCLK=P3^6;
sbitSER=P3^4;
ucharledduan[]={0x00,0x00,0x7E,0x81,0x81,0x81,0x7E,0x00};
ucharledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
voiddelay(uintz);
voidHC595(uchardate)  //date必须是char型
{
  uinta;
SRCLK=0;
  RCLK=0;   
  for(a=0;a<8;a++)
  {
    SER=date>>7;
    date<<=1;              
    SRCLK=1;
    SRCLK=0;
  }
  RCLK=1;
  
  RCLK=0;
}
voidmain()
{
    P0=0x7f;
  while(1)
  {    uchari=0;
  
    for(i=0;i<8;i++)
    {        
      P0=ledwei;
      HC595(ledduan);
      delay(1);
      HC595(0x00);
      }
    }
  
  }
                        
voiddelay(uintz)
{
    uintx,y;
    for(x=z;x>0;x--)
          for(y=100;y>0;y--);
}
问题在于为什么date必须是char型?是int型的话点阵就无法成功显示0
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
liujinyi016
1楼-- · 2019-07-15 16:29
应该是一这个变量的移位操作有关,
人中狼
2楼-- · 2019-07-15 19:45
595只有8位,如果用INT,移位后或者只输出高8位,或者只输出低8位。除非使用2个595级联,这样两个8位就可以使用INT
CKEAI
3楼-- · 2019-07-16 00:37
 精彩回答 2  元偷偷看……
人中狼
4楼-- · 2019-07-16 01:59
不是char变成int的问题,而是把一个16位的数转给一个8位的数会出什么问题的情况
CKEAI
5楼-- · 2019-07-16 04:13
人中狼 发表于 2018-7-19 11:11
不是char变成int的问题,而是把一个16位的数转给一个8位的数会出什么问题的情况

就是我不太理解那个移位,date是int型 是char型有什么区别
                                比如0x41        0100 0001(8位)  000....000 0100 0001(32位)  
                                         右移8位  0000 0001         000....000 0000 0001
          然后按照程序左移一位  照这样理解8位或32位应该都不影响最后结果
    但是事实是8位移 32位移是有影响的 是我想错了吗?
for(a=0;a<8;a++)
  {
    SER=date>>7;//此处date必须是char型
    date<<=1;              
    SRCLK=1;
    SRCLK=0;
  }问题就在这个移位上了
人中狼
6楼-- · 2019-07-16 07:04
没注意这个,的确跟移位没有关系,而是调用这个函数时所给的参数类型是什么,你的程序里的调用是 HC595(ledduan);,这里的参数是uchar ledduan,那么如果函数的定义里参数类型为int的话,就会不匹配了

一周热门 更多>