打印

问一个数据类型转换的问题?

[复制链接]
1980|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
binsea|  楼主 | 2011-2-9 10:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zq1987731| | 2011-2-9 10:05 | 只看该作者
unsigned char么,范围0~255

key1 * 1000 == 8000 == 0x1F40
(unsigned char)key1 == 0x40
key2 * 100 == 900 == 0x384
(unsigned char)key2 == 0x84

key1 + key2 = 0xC4

这是基础...............

使用特权

评论回复
板凳
binsea|  楼主 | 2011-2-9 10:06 | 只看该作者
如果char的值不能超过127的话,我改了一下还是不行。
unsigned char key1=8,key2=9;
unsigned int temp;
temp=key1*10+key2;
temp=temp*100;

使用特权

评论回复
地板
zq1987731| | 2011-2-9 10:06 | 只看该作者
按LZ的意图,改成下面这样才是正解——
temp=(unsigned int)key1*1000+(unsigned int)key2*100;

使用特权

评论回复
5
binsea|  楼主 | 2011-2-9 10:13 | 只看该作者
还是不行,加完怎么显示 -2230

使用特权

评论回复
6
binsea|  楼主 | 2011-2-9 10:23 | 只看该作者
我用的是int不是unsigned int,所以出现了负数

使用特权

评论回复
7
binsea|  楼主 | 2011-2-9 12:20 | 只看该作者
好像不是数据类型的问题是我的程序有问题,大家帮我看看吧?
我是想要从键盘按下的数字取出数据,比如说按下8和9,要求取出89.但是在程序里面没法区分你是第几次按键,所以我加了个计数器。
if((P1&0x0F)!=0x0F) //是否有按键按下,由于程序前后关联比较多没法全部发出来,就不要深究了 
{
if(uc_KeyShock==250) //防抖,不要深究
{
k=k+1; //这里是计数器,判断是第几次按键
if (k==1)
{
vKeyProcess(ucKeyScan()); //扫描键盘,并把扫描结果进行处理,程序太多不要深究
key1=ul_Number; //看这里,第一次按键后把按下的数字赋给key1
}
if (k==2)
{
vKeyProcess(ucKeyScan()); //扫描键盘,并把扫描结果进行处理,不要深究
key2=ul_Number; //看这里,第二次按键,把值赋给key2
}
uc_KeyShock=0; //恢复防抖动标志初始值。
}
else uc_KeyShock++; //如果有抖动则不执行键扫描,增加计数。
}



temp=(int)key1*1000 + (int)key2*100 //把两次按键组合成一个数字放大100倍。我怀疑前面通过计数器取出来的key1和key2是有问题的,但是不知道怎么取出两次按键的值再组合成一个数字


k的初值是0.由于前后程序较多没办法全部发出来,只请大家帮忙看看怎么取出两次按键的值并组合成一个数字?

使用特权

评论回复
8
binsea|  楼主 | 2011-2-9 12:27 | 只看该作者
我再写个大体的框架让大家看的更明白,格式就不讲究了。

k=0;
if (当按键被按下)
{
      k=k+1;
        if (k==1表示第一次按键)
            {
                 执行键扫描;
           把得到的键值赋给key1;
             }
          if (k==2第二次按键)
             {
               键扫描;
          把得到的值赋给key2;
              }
}

这样把两次按键所得到的值赋给key1和key2好像不对,但是矩阵键盘扫描程序没办法区分并得到两次按键的值。

大家有没有别的方法能得到两次按键的值?

使用特权

评论回复
9
刘前辈| | 2011-2-9 12:58 | 只看该作者
本帖最后由 刘前辈 于 2011-2-9 13:14 编辑

LZ没错,稍微改一下:
unsigned char key1=8,key2=9;
unsigned int temp;
temp=key1*0x1000+key2*0x100;   //或者 temp=( key1<<12 )+( key2<<8 );


结果:temp=0x8900;

.

使用特权

评论回复
10
binsea|  楼主 | 2011-2-9 13:11 | 只看该作者
帮我看看8楼的问题

使用特权

评论回复
11
刘前辈| | 2011-2-9 13:30 | 只看该作者
矩阵按键扫描标准程序书上一大把,若一定要自己写正确的,需要一步步调试,发现自己的错误,例如:先写这一段:
k=0;
if (当按键被按下)
{
      k=k+1;
        if (k==1表示第一次按键)
            {
                 执行键扫描;
           把得到的键值赋给key1;
             }
}
     while(1);    //运行到此停止。上面几条语句结果正确?(我看尽是错……)


如果10条语句运行结果都不正确,还怎么往下写?

.

使用特权

评论回复
12
binsea|  楼主 | 2011-2-9 13:35 | 只看该作者
那请问怎么得到两次按键的结果呢? 因为键盘扫描程序是不分第几次按键的。按一次得到一次。

我不知道我的问题表述清楚没有? 很简单就是要得到两次或者多次按键的值,组合成一个数字,赋给一个变量供其他程序使用

使用特权

评论回复
13
刘前辈| | 2011-2-9 13:54 | 只看该作者
明白你的意思了。其实特简单:所有单片机实验板都有多次按键实验程序:4个LED显示,按一个键码,移动一位。最多可以按4次键,需要N个键组合有效,那就输入N个键后按“回车”键确认即可。(一位数码有效就输入一位数+回车。)——这像银行输入取款密码一样(设置1位~18位密码都可以,何况你的系统是固定2位,更简单了。)。家里的电话号码输入也是一回事。
网上书上找不到的话,我送你一个。

.

使用特权

评论回复
14
binsea|  楼主 | 2011-2-9 14:14 | 只看该作者
谢谢,我的邮箱 8772011@qq.com

使用特权

评论回复
15
binsea|  楼主 | 2011-2-9 15:45 | 只看该作者
急求8楼问题    :'(

使用特权

评论回复
16
刘前辈| | 2011-2-9 17:51 | 只看该作者
晚上帮你找一个精彩的。

使用特权

评论回复
17
mmax| | 2011-2-10 00:04 | 只看该作者
8# binsea

晕,你这样肯定不行。

不管按几次键,只能进if(k==1)的判断里面,==2是进不去的。

可以试着这样
unsigned char NewKey = 0;
unsigned char OldKey = 0;

if(按键按下)
{
    OldKey = NewKey;
    NewKey = 按键值;
}

有两个要注意的:
1)你两次按键怎么区分?按键是沿触发进if(按键按下)的,还是电平进去的。按一下会不会多次进这个判断。
2)你程序中有没有中断,如果有中断,并且用到key值的话,可能在第一个赋值语句有效后被中断打断,中断完后再执行第二个语句。有可能稍微有点信号完整性的问题。

使用特权

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

本版积分规则

1

主题

34

帖子

1

粉丝