【已解决】51单片机数码管显示按键状态

2019-07-16 02:36发布

本帖最后由 yettt365 于 2013-2-8 19:39 编辑
  1. #include<reg51.h>
  2. #define uint  unsigned int
  3. #define uchar unsigned char
  4. sbit k1 = P3^1;
  5. sbit k2 = P3^2;
  6. uchar num1    = 0;
  7. uchar num2    = 0;
  8. uchar number  = 0;
  9. uchar key_val = 0;
  10. uchar code table[] ={
  11. 0xc0,0xf9,0xa4,0xb0,
  12. 0x99,0x92,0x82,0xf8,
  13. 0x80,0x90,0xff,0xc0,
  14. 0xbf,0x7f,
  15.                      };
  16. /**************延时函数↓***********************/
  17. void delay_ms(uint z)
  18. {
  19.    uint x, y ;
  20.    for(x = z; x > 0; x --)
  21.        for(y = 125; y > 0; y --);
  22. }
  23. /**************延时函数↑***********************/
  24. /**************数码管消抖显示函数↓*************/
  25.   void xs(uchar number)
  26.   {
  27.     uchar zheng = 13;
  28.     uchar fu    = 12;
  29.     uchar beiwei  = number/100;
  30.     uchar shiwei  = number/10%10;
  31.     uchar gewei   = number%10;
  32.     if(number >= 0)
  33.       {P2 = 0x01; P0 = table[zheng];delay_ms(2);}
  34. else if(number  < 0 )
  35. {P2 = 0x01; P0 = table[fu];   delay_ms(2);}
  36.     P2 = 0X02;
  37.     P0 = table[beiwei];
  38.     delay_ms(2);
  39.     P2 = 0X04;
  40.     P0 = table[shiwei];
  41.     delay_ms(2);
  42.     P2 = 0x08;
  43.     P0 = table[gewei ];
  44.     delay_ms(2);
  45.     delay_ms(2);
  46.   }
  47. /**************数码管消抖显示函数↑*************/
  48. /**************主函数↓主按键判断***************/
  49. void main(void)
  50. {
  51.    P0 = 0XFF;  // 端口置零
  52.    P1 = 0XFF;
  53.    P2 = 0XFF;
  54.    P3 = 0XFF;
  55.    key_val = P3;
  56.    while(1)
  57.    {
  58.    if(key_val != P3)
  59.      {
  60.       key_val = P3;
  61.       xs(number);
  62.       /******按键加数部分↓******/
  63.       while(k1 == 0&&k2 == 1)
  64.        {
  65.         xs(number);//延时消抖
  66.         if(++num1 > 100)        //按键时间>1s,num=101;<1s,num=num;
  67.              num1 = 101;
  68.        }
  69.       if(num1 > 0&&num1 <= 100)
  70.          number ++;
  71.       else if(num1 > 100)
  72.          number += 10;
  73.     /******按键加数部分↑******/
  74.     /******按键减数部分↓******/
  75.      while(k2 == 0&& k1 == 1)
  76.        {
  77.         xs(number);//延时消抖
  78.         if(++num2 > 100)        //按键时间>1s,num=101;<1s,num=num;
  79.              num2 = 101;
  80.        }
  81.        if(num2 > 0&&num2 <= 100)
  82.          number --;
  83.        else if(num2 > 100)
  84.          number -= 10;
  85.     /******按键减数部分↑******/
  86.      }
  87.      num1 = 0; num2 = 0;
  88.      xs(number);
  89.       
复制代码程序目的:
          此程序实现按k1键,小于1s,加1,大于1s,加10;  按k2键,小于1s,减1,大于1s,减10;
         目前已经可以实现此功能。
问题来了:
         不知道是不是当初c语言没学好,在c语言中一个数是否没有负数?0减1后是256;(TH0 = (65536-50000)/256; 也是256?)
         程序中xs()中有一步是判断number是否小于0:小于,第一个数码管显示“—”;大于,显示“。”  
   但,
            number似乎永远是>=06901028120272
;

我想应该是c语言基础没学好,  请指点一下具体那部分内容。谢谢


proteus电路图 proteus电路图
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
yettt365
1楼-- · 2019-07-16 04:26
问题好像是 数据类型的问题,以前一直没注意过,麻烦大家了。
starsnow
2楼-- · 2019-07-16 07:40
 精彩回答 2  元偷偷看……
yettt365
3楼-- · 2019-07-16 10:03
starsnow 发表于 2013-1-29 17:50
因为要用到负数,所以要把 uchar 改为 int 或 long 类型(根据你的数值最大值来定类型)。 ...

改成 int ,char ,lomg 都不行,0--后,直接256,if(number<0),没效果。
as_733
4楼-- · 2019-07-16 13:07
xs()函数是形参是不是无符号型啊????
number应该是有符号的
liuzhaoxin1020
5楼-- · 2019-07-16 15:59
不错的文件,值得收藏

一周热门 更多>