c51单片机流水灯程序。求问大神他为什么把16进制数定义成unsign char #include

c51单片机流水灯程序。求问大神他为什么把16进制数定义成unsign char
#includereg52.h
#define uint unsigned int
#define uchar unsigned char
void delayxms(uint xms);
uchar code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯数据表
void delayxms(uint xms)//xms延时函数
{
uint i,j;
for(i=xms;i0;i--)
for(j=113;j0;j--);
}
void main()//主函数
{
uchar i;
while(1)
{
for(i=0;i8;i++)
{
P1=tab[i];
delayxms(200);
P1=0xff;
}
}
}

你把十六进制和16bit(16位)的概念搞混了。
同一个数字,可以用10进制表示、也可以用16进制表示,当然二进制、8进制等都可以,甚至你自己造个12进制都没问题。
比如你给一个变量a赋值为0xfe,a=0xfe,这个效果与下面这2种完全一样,看准了,是完全完全完全一样!!对单片机来说没有任何影响:
一、 a=254,(十进制的254等于16进制的fe)
二、 a=0376(八进制的376等于16进制的fe等于10进制254)
懂了没?
16进制数不一定需要16比特来存放,只要这个数对应的10进制数不超过255,(或者说不超过十六进制的0xff,或者说不超过8进制的377),它就卡一存放在uchar格式的变量里。追问

但是 比如我给仅仅给P1管脚附1。但是其他管脚连的灯也亮了,,其实我最大的问题是。比如我p0-7 共八个管脚。 八个灯。每个灯代表1bit格子。的话。我想操作一个变量的位。

谢谢您啊。 麻烦您了

追答

首先纠正你一个错误,不是p0-7,是P0.0-P0.7,或者P1.0-P1.7,你直接把P0当成一个bit是错误的,因为P0本身就是8个bit,即P0.1-0.7。
只操作一个bit的话也简单,比如你要控制p1.1,实际上1.1是第二bit,也就是说应该给P1整体赋值为二进制的0000 0010是不是,这样的话就只有p1.1亮了,那么你直接写P1=0X02就ok,因为0x02这个十六进制数对应的二进制数就是0000 0010.
为了更符合人类的直观思维,程序员都是这样写的,P1|=(1<<5)|(1<<2),或者P1|=0x11,这两句话效果是一样的,都是第2个和第5个灯亮,也即P1.1和P1.4亮。
另外51单片机本身就支持单个bit操作,P1.1和P1.4亮你也可以这样写:
sbit P11 P1^1;
sbit P14 P1^4;
P11=1;
P14=1;

追问

那个竖线什么意思啊

就是p1后面那个竖线。不是后面的

如果sbitp11那样。系统说p11什么没定义

追答

竖线是C语言的“或运算”,那个P要用大写

追问

大神。我想让。5 2先亮。再43。

为什么不行呢。。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-02
c51单片机流水灯程序。求问大神他为什么把16进制数定义成unsign char
----------那我反问下,为什么不可以? unsigned char 只是类型而已。只要<=255即可。 你可以写十进制,二进制,8进制。只要编译软件能识别即可。
第2个回答  2014-04-02
支持楼上的回答 楼主可能搞混了16进制和16位的概念, char或者unsigned char只是类型,和int float等一样,只是每种类型占用的存储空间不一样,16进制或者十进制这些只是数字的表现方式
相似回答