找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1527|回复: 6
收起左侧

为什么按键加,设置时间999分钟为上限,为什么加到255自动复位从0开始?附单片机代码

[复制链接]
ID:858009 发表于 2021-12-10 16:42 | 显示全部楼层 |阅读模式
代码设置的上限是999分钟,为什么加到255分钟之后,再按加就变为0了,求解原因

代码:
  1. #include "CH554.H"                                                   
  2. #include "Debug.H"
  3. #include "GPIO.H"
  4. #include "HT1621.H"
  5. #include "Timer.H"
  6. #include "stdio.h"
  7. #include <string.h>
  8. #include <intrins.h>

  9. #define uchar unsigned char
  10. #define uint  unsigned int
  11. //                    //  0    1    2    3    4    5    6    7    8    9        
  12. uchar code tabe1[11] = {0xF0,0x00,0xD0,0x90,0x20,0xB0,0xF0,0x10,0xF0,0xB0};
  13. uchar code tabe2[11] = {0xA0,0xA0,0x60,0xE0,0xE0,0xC0,0xC0,0xA0,0xE0,0xE0};

  14. sbit key1 = P3^3;   //分钟加
  15. sbit key2 = P3^4;   //分钟减
  16. uchar min,min0,min1,min2,sec,sec1,sec2,count;

  17. void delay_ms(uint z)                //延时程序1
  18. {
  19.         uint x,y;
  20.         for(x=z;x>0;x--)
  21.          for(y=110;y>0;y--);
  22. }
  23. /*******************************************************************************
  24. * Function Name  : void Display_Init()
  25. * Description    : 时间显示
  26. *******************************************************************************/
  27. void Display_Init(uchar min0,uchar min1,uchar min2,uchar sec1,uchar sec2)
  28. {
  29.         Write_1621(3,tabe1[min0],4);
  30.         Write_1621(4,tabe2[min0],4);
  31.         Write_1621(5,tabe1[min1],4);
  32.         Write_1621(6,tabe2[min1],4);
  33.         Write_1621(7,tabe1[min2],4);
  34.         Write_1621(8,tabe2[min2],4);
  35.         Write_1621(11,tabe1[sec1],4);
  36.         Write_1621(12,tabe2[sec1],4);
  37.         Write_1621(13,tabe1[sec2],4);
  38.         Write_1621(14,tabe2[sec2],4);
  39. }
  40. /*******************************************************************************
  41. * Function Name  : void Timer0_Init()
  42. * Description    : 定时器初始化
  43. *******************************************************************************/
  44. void Time0_Init()
  45. {
  46.         count = 0;
  47.         min   = 0;
  48.         sec   = 59;
  49.         mTimer0Clk12DivFsys();                                     //T0定时器时钟设置
  50.         mTimer_x_ModInit(0,1);                                     //T0定时器模式设置
  51.         mTimer_x_SetData(0,0xC350);                                //T0定时器赋值
  52.         mTimer0RunCTL(1);                                          //T0定时器启动
  53.         ET0   = 1;                                                 //T0定时器中断开启
  54.         EA    = 1;
  55. }
  56. /*******************************************************************************
  57. * Function Name  : mTimer0Interrupt()
  58. * Description    : CH554定时计数器0定时计数器中断处理函数
  59. *******************************************************************************/
  60. void        mTimer0Interrupt( void ) interrupt INT_NO_TMR0 using 1           //timer0中断服务程序,使用寄存器组1
  61. {
  62.         mTimer_x_SetData(0,0xC350);                                          //非自动重载方式需重新给TH0和TL0赋值        
  63.         count++;
  64.         if(count==10)
  65.         {
  66.         count=0;
  67.                 if(sec==0)
  68.                 {
  69.                         if(min!=0)
  70.                         {
  71.                                 sec=59;
  72.                                 min--;
  73.                         }
  74.                         else
  75.                         {
  76.                                 mTimer0RunCTL(0);                                          //T0定时器停止
  77.                         }
  78.                 }
  79.                 else sec--;
  80.         }
  81. }
  82. void main( )
  83. {
  84.         Time0_Init();
  85.         Init_1621();       //初始化HT1621
  86.         HT1621_all_off();  //清空LCD显示
  87.         while(1)
  88.         {
  89.                 if(key1==0)
  90.                 {
  91.                         delay_ms(100);
  92.                         if(key1==0)
  93.                         {
  94.                                 if(min!=999)
  95.                                 {
  96.                                         min++;
  97.                                 }
  98.                         }
  99.                         while(!key2);
  100.                         delay_ms(1000);
  101.                         while(!key2);
  102.                 }
  103.                 if(key2==0)
  104.                 {
  105.                         delay_ms(100);
  106.                         if(key2==0)
  107.                         {
  108.                                 if(min!=0)
  109.                                 {
  110.                                         min--;
  111.                                 }
  112.                         }
  113.                         while(!key1);
  114.                         delay_ms(1000);
  115.                         while(!key1);
  116.                 }
  117.                 min0=min/100;
  118.                 min1=min%100/10;
  119.                 min2=min%10;
  120.                 sec1=sec/10;
  121.                 sec2=sec%10;
  122.                 Display_Init(min0,min1,min2,sec1,sec2);
  123.         }
  124. }
复制代码


回复

使用道具 举报

ID:139866 发表于 2021-12-10 17:16 | 显示全部楼层
本帖最后由 天ノ忆 于 2021-12-10 17:18 编辑

既然想加到999,为什么把变量用数据长度为256的unsigned char定义
回复

使用道具 举报

ID:57657 发表于 2021-12-10 17:26 | 显示全部楼层
min变量要用uint类型
回复

使用道具 举报

ID:824490 发表于 2021-12-10 17:26 | 显示全部楼层
因为你是用牛来拉火车了。。。
unsigned char 取值范围:0-255,溢出了。
回复

使用道具 举报

ID:858009 发表于 2021-12-10 17:27 | 显示全部楼层
npn 发表于 2021-12-10 17:26
min变量要用uint类型

懂了,好像声明错了,谢谢
回复

使用道具 举报

ID:858009 发表于 2021-12-10 17:28 | 显示全部楼层
名字不是重点 发表于 2021-12-10 17:26
因为你是用牛来拉火车了。。。
unsigned char 取值范围:0-255,溢出了。

懂了,范围弄错了,谢谢
回复

使用道具 举报

ID:908826 发表于 2021-12-10 20:26 | 显示全部楼层
变量范围问题,嘿嘿嘿,uchar就是0~255
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表