打印

问个问题

[复制链接]
1203|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liushachen|  楼主 | 2009-8-24 23:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用两个按键S22,S23控制数码管上显示的数加减
#include<reg52.h>
#define uchar unsigned char
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
/*sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;*/
sbit add=P2^6;
sbit dec=P2^7;
uchar m;
unsigned int d;

void display(uchar d1,uchar d2,uchar d3,uchar d4);
uchar  a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82};
void int1() interrupt 3
{
uchar d1,d2,d3,d4;
TR1=0;
TH1=0xfd;
TL1=0xff;
TR1=1;
ET1=1;
d4=d%10;
d3=(d/10)%10;
d2=(d/100)%10;
d1=(d/1000)%10;
display(d1,d2,d3,d4);
}
void main()
{
unsigned int i;
m=1;
d=1234;
TMOD=0x10;
TH1=0xfd;
TL1=0xff;
TR1=1;
EA=1;
ET1=1;
while(1)
{
  if(add==0||dec==0)
  {
   
   P2=P3;
   i=10000;
   while(i--);
   if(add==0)
    d++;
   if(dec==0)
    d--;
  }
}
}
void display(uchar d1,uchar d2,uchar d3,uchar d4)
{
if(m==1)
{
  P10=0;
  P11=P12=P13=1;
  P0=a[d1];
}
if(m==2)
{
  P11=0;
  P10=P12=P13=1;
  P0=a[d2];
}
if(m==3)
{
  P12=0;
  P11=P10=P13=1;
  P0=a[d3];
}
if(m==4)
{
  P13=0;
  P11=P12=P10=1;
  P0=a[d4];
}
m++;
if(m>=5)
  m=1;
}
问题一:变量d,为整型unsigned int d;开始显示1234,改为字符型则显示为0210,是因为字符型的要转化为整型来处理么?
问题二:主函数中的 unsigned int i;我把他放在P2=P3;的前面或者放在while(1)的前面都不对,按S32,S33都没反应,什么道理,请赐教!
谢谢!

相关帖子

沙发
FDLock| | 2009-8-24 23:47 | 只看该作者
问题一: uchar d;时,d=1234(即0x4d2)实际上d只能保存1字节数据0xd2,即为210,所以显示0210了。
        要保存大于255的数据,就不能使用uchar了。


问题二:C语言的局部变量,必须在函数的第一条可执行代码前定义。C++则可以随处定义。
        P2=P3;可能会有问题,因为它会读取P3口,如果P3.6和P3.7均为0,则P2.6和P2.7将会一直为低,就检测不到按键了。
        如果P2.6和P2.7都为0,则d++,然后d--,就相当于没有变化了,您可以跟踪调试找找原因。

使用特权

评论回复
板凳
yewuyi| | 2009-8-25 01:47 | 只看该作者
本帖最后由 yewuyi 于 2009-8-25 01:50 编辑

问题二:C语言的局部变量,必须在函数的第一条可执行代码前定义。C++则可以随处定义。
-----------------------------------
有一些C编译器也可以如同C++那样可以在使用前定义,而并没有强行规定必须在首行定义开始定义,呵呵,这个还是方便了很多的说。。。


UCHAR的问题纯粹是被类型变换掉了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

20

帖子

0

粉丝