找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于8051单片机开发板秒表程序问题,数组没办法初始化

[复制链接]
ID:419421 发表于 2019-1-1 19:19 | 显示全部楼层 |阅读模式
求助QAQ,一直是这样查了好久看不出来问题。数组没办法初始化。。谱中的板子
qq_pic_merged_1546340613743.jpg s.png TIM截图20190101185954.png TIM截图20190101190132.png TIM截图20190101190141.png
  1. #include <reg52.h>
  2. typedef unsigned char u8;
  3. typedef unsigned int u16;
  4. typedef unsigned long u32;

  5. sbit LSA = P2^2;        //38译码器引脚编号,选择数码管
  6. sbit LSB = P2^3;
  7. sbit LSC = P2^4;
  8. sbit number = P0;    //发送转换表(段码)
  9. sbit key1 = P3^1;    //开始/暂停
  10. sbit key2 = P3^0;    //复位
  11. sbit key3 = P3^2;    //
  12. sbit key4 = P3^3;    //

  13. u8 code smgduan[17] = {
  14.     0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  15.     0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
  16.     };//数码管转换表

  17. u8 LedBuff[8] = {
  18.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  19.     } ;//数码管缓冲区
  20. u8 KeySt[4] = {
  21.     1, 1, 1, 1
  22.     };//按键电平状态储存区

  23. bit StopwatchRunning = 1;    //秒表是否运行(确定是否暂停)
  24. bit StopwatchRefresh = 1;    //秒表是否要刷新
  25. u8    DecimalPart = 0;        //计数小数部分
  26. u16    IntegerPart = 0;        //计数整数部分
  27. u8    T0RH = 0;                //T0重装高位
  28. u8    T0RL = 0;                //T0重装低位
  29. void ConfigTimer0(u16 ms); //配置定时器
  30. void StopwatchDisplay(); //显示函数(数字分割显示)
  31. void KeyDriver(); //检测按键,执行指令(主函数中调用)

  32. void main()
  33. {
  34.     EA = 1;    //打开总中断
  35.     ConfigTimer0(2);    //定时器2ms

  36.     while(1)
  37.     {
  38.         if(StopwatchRefresh)   //是否更新数码管显示
  39.         {
  40.             StopwatchRefresh = 0;
  41.             StopwatchDisplay();
  42.         }
  43.         KeyDriver();    //调用按键驱动
  44.     }
  45. }
  46. /*函数部分*/
  47. void ConfigTimer0(u16 ms)//配置定时器
  48. {
  49.     u32 tmp;
  50.    
  51.     tmp = 12000000 / 12;
  52.     tmp = (tmp * ms) / 1000;
  53.     tmp = 65536 - tmp;
  54.     tmp += 18;
  55.     T0RH = (u8)(tmp >> 8);
  56.     T0RL = (u8)tmp;
  57.     TMOD &= 0XF0;    //仅改变后四位(置零)
  58.     TMOD |= 0X01;
  59.     TH0 = T0RH;
  60.     TL0 = T0RL;
  61.     ET0 = 1;
  62.     TR0 = 1;        
  63. }
  64. void StopwatchDisplay()//显示函数(数字分割显示)
  65. {
  66.     signed char i;
  67.     u8 buf[4];    //

  68.     LedBuff[0] = smgduan[DecimalPart % 10];     //小数转换
  69.     LedBuff[1] = smgduan[DecimalPart / 10];
  70.     buf[0] = IntegerPart % 10;
  71.     buf[1] = (IntegerPart / 10) % 10;
  72.     buf[2] = (IntegerPart / 100) % 10;
  73.     buf[3] = (IntegerPart / 1000) % 10;
  74.     for(i = 3; i >= 1; i --) //整数高位0转换为空
  75.     {
  76.         if(buf[i] == 0)
  77.         {
  78.             LedBuff[i + 2] = 0XFF;
  79.         }
  80.         else break;
  81.     }
  82.     for( ; i >= 0; i --)    //整数转换
  83.     {
  84.         LedBuff[i + 2] = smgduan[buf[i]];
  85.     }
  86.     LedBuff[2] &= 0X80;     //小数点
  87. }
  88. void StopwatchAction()//秒表的启动与暂停
  89. {
  90.     if (StopwatchRunning)    //已启动则停止
  91.         StopwatchRunning = 0;
  92.     else                     //未启动则启动
  93.         StopwatchRunning = 1;
  94. }
  95. void StopwatchReset()//秒表复位
  96. {
  97.     StopwatchRunning = 0;
  98.     DecimalPart = 0;
  99.     IntegerPart = 0;
  100.     StopwatchRefresh = 1;
  101. }
  102. void KeyDriver()//检测按键,执行指令(主函数中调用)
  103. {
  104.     u8 i;
  105.     static u8 backup[4] = {1, 1, 1 , 1};//键值对比样本   

  106.     for(i = 0; i < 4; i ++)
  107.     {
  108.         if(backup[i] != KeySt[i])
  109.         {
  110.             if(backup[i] != 0)
  111.             {
  112.                 if(i == 1)
  113.                 {
  114.                     StopwatchReset();
  115.                 }
  116.                 else if(i == 2)
  117.                 {
  118.                     StopwatchAction();
  119.                 }
  120.             }
  121.             backup[i] = KeySt[i];    //刷新备份,作为下次判定样本   
  122.         }
  123.     }
  124. }
  125. void KeyScan()//按键扫描,定时中断调用
  126. {
  127.     u8 i;
  128.     static u8 keybuf[4]    = {
  129.         0xFF, 0xFF, 0xFF, 0xFF
  130.     };
  131.     keybuf[0] = (keybuf[0] << 1) | key1;  //键值输入
  132.     keybuf[1] = (keybuf[1] << 1) | key2;
  133.     keybuf[2] = (keybuf[2] << 1) | key3;
  134.     keybuf[3] = (keybuf[3] << 1) | key4;

  135.     for(i = 0; i < 4; i ++)
  136.     {
  137.         if(keybuf[i] == 0X00)
  138.         {
  139.             KeySt[i] = 0;
  140.         }
  141.         else if(keybuf == 0XFF)
  142.         {
  143.             KeySt[i] = 1;
  144.         }
  145.     }

  146. }
  147. void LedScan()//数码管扫描,定时中断调用
  148. {
  149.     static u8 i = 0;

  150.     number = 0X00;
  151.     //LS = (LS & 0XE3) | (i << 2);
  152.     for(i = 0;i < 5;i++)
  153.     {
  154.         switch(i)     //位选,选择点亮的数码管,
  155.         {
  156.             case(0):
  157.                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  158.             case(1):
  159.                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  160.             case(2):
  161.                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  162.             case(3):
  163.                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  164.             case(4):
  165.                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  166.             case(5):
  167.                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  168.             case(6):
  169.                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  170.             case(7):
  171.                 LSA=1;LSB=1;LSC=1; break;//显示第7位   
  172.         }
  173.     }
  174.     P0 = LedBuff[i];
  175.     //if(i < 5) i ++;
  176.     //else i = 0;

  177. }
  178. void StopwatchCount()//秒数统计
  179. {
  180.     if(StopwatchRunning)
  181.     {
  182.         DecimalPart ++;
  183.         if(DecimalPart >= 100)
  184.         {
  185.             DecimalPart = 0;
  186.             IntegerPart ++;
  187.             if(IntegerPart > 10000)
  188.             {
  189.                 IntegerPart = 0;
  190.             }   
  191.         }
  192.         StopwatchRefresh = 1;  //提醒刷新
  193.     }
  194. }
  195. void InterruptTimer0() interrupt 1 //中断函数
  196. {
  197.     static u8 tmr10ms = 0;
  198.    
  199.     TH0 = T0RH;
  200.     TL0 = T0RL;
  201.     LedScan();
  202.     KeyScan();
  203.     tmr10ms ++;
  204.     if(tmr10ms >= 5) //10ms记一次数
  205.     {
  206.         tmr10ms = 0;
  207.         StopwatchCount();
  208.     }   
  209. }
复制代码


回复

使用道具 举报

ID:164602 发表于 2019-1-2 08:23 | 显示全部楼层
一点看法吧——程序我还没有读通
第一:你照片上的右四位数码管的点亮的问题,不是什么数组初始化问题,是消隐问题
            case(7):
                LSA=1;LSB=1;LSC=1; break;//显示第7位   
        }
    }
    P0 = LedBuff[i];
                j=10;                                                 //扫描间隔时间设定
                while(j--);       
                P0=0x00;//消隐
我在你的显示函数中加点东西,就不亮了,就只有最左的数码管是亮的。
第二:看你的程序结构(虽然没全部读通),但你的显示和按键函数都放在中断里,是很不好的——一是让你的定时很不准确,二是显示和按键在不中断时不能执行——我有你同样的板子,按键根本没用,长按都不行,具体原因还没找到,但这个结构很不好,其实就是编程思路问题。
我这里有别人的一个程序,给你看看,功能是完整的哦——一键秒表

//上电待令,按键k3计时开始,再按计时停止,再按清0,再按开始,周而复始。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;//连接译码器,选择点亮的数码管
sbit k3=P3^2;//外部中断按键
uchar code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uchar Cntus=0,Cnt100ms,Cnt1s=0;//中断计时变量
bit zantin=0;                                        //暂停标志


/***********定时器初始化程序****************/
void Timer0Init(void)                //2500微秒@12.000MHz
{
        TMOD= 0x01;                //设置定时器模式
        TL0 = 0x3C;                //设置定时初值
        TH0 = 0xF6;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        EA=1;                        //开总中断
        ET0=1;                //开定时器0中断
}
/***********按键扫描程序****************/
void keyscan()        
{
        static uint count2=0,count1=0;        //计数变量                        
        static bit key_sign=0;                                //按键状态标志
        if(k3==0)                                //检测输入如果为0
        {
                count1++;                                        //计数延时消抖
                if((count1>=500)&&(key_sign==0))//检测按键如果为0
                {                        
                        key_sign=1;                //按键状态标志置1,防止重复响应
                        count2++;
                        if(count2>=3)
                                count2=0;
                        switch(count2)
                        {
                                case 0:        Cntus=0;
                                                Cnt100ms=0;
                                                Cnt1s=0;        break;//清0
                                case 1:        zantin=1;   break;//计时
                                case 2:        zantin=0;        break;//暂停
                        }               
                }
        }
        else
        {
                count1=0;                                //计数变量清0
                key_sign=0;                                //按键状态标志清0
        }
}
void display()//显示程序
{
        static uchar  i=0;
        P0=0x00;//消隐
        switch(i)
        {
                case(0):
                LSA=0;LSB=1;LSC=1;P0=table[Cnt1s/10];i++; break;//显示第5位
                case(1):
                LSA=1;LSB=0;LSC=1;P0=table[Cnt1s%10]|0x80;i++; break;//显示第6位
                case(2):
                LSA=0;LSB=0;LSC=1;P0=table[Cnt100ms];i=0; break;//显示第7位
        }
}
/***************主程序****************/
void main()
{
        Timer0Init();                                //定时器初始化
        while(1)
        {
                keyscan();                                //按键扫描
        }
}
/**************中断服务程序*****************/
void timer0() interrupt        1//2500微秒@11.0592MHz
{
        TL0 = 0x00;                //设置定时初值
        TH0 = 0xF7;                //设置定时初值
        Cntus++;                                        //中断变量Cntus自+1
        if(Cntus>=40)                                //10ms
        {
                Cntus=0;                                //清0
                if(zantin==1)                        //暂停/启动
                        Cnt100ms++;                        //毫秒计数
                if(Cnt100ms>=10)
                {
                        Cnt100ms=0;
                        Cnt1s++;                                //秒计数
                        if(Cnt1s>=60)
                                Cnt1s=0;
                }
        }
        display();                                        //显示程序
}
回复

使用道具 举报

ID:419421 发表于 2019-1-3 21:19 | 显示全部楼层
HC6800-ES-V2.0 发表于 2019-1-2 08:23
一点看法吧——程序我还没有读通
第一:你照片上的右四位数码管的点亮的问题,不是什么数组初始化问题,是 ...

我把程序改了下,可是按键时只有第一次按下有作用,有时复位键有作用,我怀疑是按键消抖作用需要时间太长,和扫描形成了时间差,您觉得是不是有这样的可能。普中的板子是会在长按按键一段时间后自动取消置高电平的吗?
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;
  5. typedef unsigned long u32;

  6. sbit LS = P2;        //38译码器引脚编号,选择数码管
  7. sbit number = P0;    //发送转换表(段码)
  8. sbit key1 = P3^1;    //复位
  9. sbit key2 = P3^0;    //开始/暂停
  10. sbit key3 = P3^2;    //
  11. sbit key4 = P3^3;    //

  12. u8 code smgduan[17] = {
  13.     0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  14.     0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
  15.     };//数码管转换表

  16. u8 LedBuff[8] = {
  17.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  18.     } ;//数码管缓冲区
  19. u8 KeySt[4] = {
  20.     1, 1, 1, 1
  21.     };//按键电平状态储存区

  22. bit StopwatchRunning = 0;    //秒表是否运行(确定是否暂停)
  23. bit StopwatchRefresh = 1;    //秒表是否要刷新
  24. u8    mseconds = 0;        //计数毫秒部分
  25. u8    seconds = 0;         //计数秒部分
  26. u8          minutes = 0;                   //计数分钟部分
  27. u8    T0RH = 0;                //T0重装高位
  28. u8    T0RL = 0;                //T0重装低位
  29. void ConfigTimer0(u16 ms); //配置定时器
  30. void StopwatchDisplay(); //显示函数(数字分割显示)
  31. void KeyDriver(); //检测按键,执行指令(主函数中调用)
  32. void LedScan();
  33. void KeyScan();
  34. void main()
  35. {
  36.     EA = 1;    //打开总中断
  37.     ConfigTimer0(2);    //定时器2ms

  38.     while(1)
  39.     {
  40.         if(StopwatchRefresh)   //是否更新数码管显示
  41.         {
  42.             StopwatchRefresh = 0;
  43.             StopwatchDisplay();
  44.         }
  45.                 LedScan();
  46.                 KeyScan();
  47.         KeyDriver();    //调用按键驱动
  48.     }
  49. }
  50. /*函数部分*/
  51. void ConfigTimer0(u16 ms)//配置定时器
  52. {
  53.     u32 tmp;
  54.    
  55.     tmp = 11059260 / 12;
  56.     tmp = (tmp * ms) / 1000;
  57.     tmp = 65536 - tmp;
  58.     tmp += 18;                 //时间补偿
  59.     T0RH = (u8)(tmp >> 8);
  60.     T0RL = (u8)tmp;
  61.     TMOD &= 0XF0;    //仅改变后四位(置零)
  62.     TMOD |= 0X01;
  63.     TH0 = T0RH;
  64.     TL0 = T0RL;
  65.     ET0 = 1;
  66.     TR0 = 1;        
  67. }
  68. void StopwatchDisplay()//显示函数(数字分割显示)
  69. {
  70.     signed char i;
  71.     u8 buf[2]; u8 minbuf[2];   

  72.     LedBuff[0] = smgduan[mseconds % 10];     //毫秒转换
  73.     LedBuff[1] = smgduan[mseconds / 10];
  74.     buf[1] = seconds % 10;
  75.     buf[2] = (seconds / 10) % 10;
  76.     minbuf[1] = (minutes) % 10;
  77.     minbuf[2] = (minutes / 10) % 10;
  78.     for(i = 1; i < 3; i ++) //秒位数字转换0
  79.     {
  80.         if(buf[i] == 0)
  81.         {
  82.             LedBuff[i + 2] = 0X00;
  83.         }
  84.         else break;
  85.     }
  86.         for(i = 1; i < 3; i ++) //分位数字转换0
  87.         {
  88.                 if(minbuf[i] == 0)
  89.         {
  90.             LedBuff[i + 5] = 0X00;
  91.         }
  92.         else break;       
  93.         }
  94.     for(i = 1 ; i < 3; i ++)    //秒和分位数字转换
  95.     {
  96.         LedBuff[i + 2] = smgduan[buf[i]];
  97.                 LedBuff[i + 5] = smgduan[minbuf[i]];       
  98.     }
  99.     LedBuff[2] = 0X40;     //"-"符号显示
  100.         LedBuff[5] = 0x40;
  101. }
  102. void StopwatchAction()//秒表的启动与暂停
  103. {
  104.     if (StopwatchRunning)    //已启动则停止
  105.         StopwatchRunning = 0;
  106.     else                     //未启动则启动
  107.         StopwatchRunning = 1;
  108. }
  109. void StopwatchReset()//秒表复位
  110. {
  111.     StopwatchRunning = 0;
  112.     mseconds = 0;
  113.     seconds = 0;
  114.         minutes = 0;
  115.     StopwatchRefresh = 1;
  116. }
  117. void KeyDriver()//检测按键,执行指令(主函数中调用)
  118. {
  119.     static u8 i;
  120.     static u8 backup[4] = {1, 1, 1 , 1};//键值对比样本   

  121.     for(i = 0; i < 4; i ++)
  122.     {
  123.         if(backup[i] != KeySt[i])
  124.         {
  125.             if(backup[i] != 0)
  126.             {
  127.                 if(i == 0)
  128.                 {
  129.                     StopwatchReset();        //重置
  130.                 }
  131.                 else if(i == 1)
  132.                 {
  133.                     StopwatchAction();        //开始/暂停
  134.                 }
  135.             }
  136.             else if(i == 1)
  137.             {
  138.                 StopwatchAction();        //开始/暂停
  139.             }
  140.                         backup[i] = KeySt[i];    //刷新备份,作为下次判定样本   
  141.         }
  142.     }
  143. }
  144. void KeyScan()//按键扫描
  145. {
  146.         u8  i = 0;
  147.     static u8 keybuf[4]    = {
  148.         0xFF, 0xFF, 0xFF, 0xFF
  149.     };
  150.         keybuf[0] = (keybuf[0] << 1) | key1;  //键值输入,8次分位输入,消抖
  151.     keybuf[1] = (keybuf[1] << 1) | key2;
  152.     keybuf[2] = (keybuf[2] << 1) | key3;
  153.     keybuf[3] = (keybuf[3] << 1) | key4;

  154.     for(i = 0; i < 4; i ++)
  155.     {
  156.         if(keybuf[i] == 0X00)
  157.         {
  158.             KeySt[i] = 0;
  159.         }
  160.         else if(keybuf == 0XFF)
  161.         {
  162.             KeySt[i] = 1;
  163.         }
  164.     }
  165. }
  166. void LedScan()//数码管扫描
  167. {
  168.     u8 i = 0;
  169.         for( ; i < 8; i ++)
  170.     {
  171.                 P2 = (P2 & 0XE3) | (i << 2);
  172.                 P0 = LedBuff[i];
  173.                 _nop_();                                        //延时两个机器周期
  174.                 _nop_();
  175.                 P0 = 0x00;
  176.         }
  177. }
  178. void StopwatchCount()//秒数统计
  179. {
  180.     if(StopwatchRunning)
  181.     {
  182.         mseconds ++;
  183.         if(mseconds >= 100)
  184.         {
  185.             mseconds = 0;
  186.             seconds ++;
  187.             if(seconds >= 60)
  188.             {
  189.                 seconds = 0;
  190.                                 minutes ++;
  191.             }
  192.                         if(minutes >= 60)
  193.                         {
  194.                                         minutes = 0;
  195.                         }   
  196.         }
  197.         StopwatchRefresh = 1;  //提醒刷新
  198.     }
  199. }
  200. void InterruptTimer0() interrupt 1 //中断函数
  201. {
  202.     static u8 tmr10ms = 0;
  203.    
  204.     TH0 = T0RH;
  205.     TL0 = T0RL;
  206.     tmr10ms ++;
  207.     if(tmr10ms >= 5) //10ms记一次数
  208.     {
  209.         tmr10ms = 0;
  210.         StopwatchCount();
  211.     }   
  212. }
复制代码
回复

使用道具 举报

ID:419421 发表于 2019-1-3 21:27 | 显示全部楼层
HC6800-ES-V2.0 发表于 2019-1-2 08:23
一点看法吧——程序我还没有读通
第一:你照片上的右四位数码管的点亮的问题,不是什么数组初始化问题,是 ...

而且复位之后无法重新启动,求帮助
回复

使用道具 举报

ID:213173 发表于 2019-1-4 11:21 | 显示全部楼层
凛夏寒烟 发表于 2019-1-3 21:27
而且复位之后无法重新启动,求帮助

给你改写成单键操作8位24小时百分秒表,有详细注释,应该能看得懂,经仿真无误。

#include <AT89X52.H>

#define number P0
#define wela P2
typedef unsigned int u16 ;
typedef unsigned char u8 ;

sbit key1=P3^0;
//sbit key2=P3^1;
//sbit wela_A=P2^2;       
//sbit wela_B=P2^3;       
//sbit wela_C=P2^4;       

u8 code smgduan[16] = {
    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
    };//数码管转换表

u8 LedBuff[8];//数码管缓冲区

u8 Cntus=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0,Cnthour=0;                //中断计时变量

bit suspend=0;                                        //暂停标志
void LedScan();                                        //显示程序声明
void keyscan();                                        //按键扫描程序声明

/***********按键扫描程序****************/
void keyscan()       
{
        static u8 count2=0,count1=0;        //计数变量                       
        static bit key_sign=0;                                        //按键状态标志
        if(key1==0)                                //检测输入如果为0
        {
                count1++;                                        //计数延时消抖
                if((count1>=100)&&(key_sign==0))//检测按键如果为0
                {                       
                        key_sign=1;                //按键状态标志置1,防止重复响应
                        count2++;
                        if(count2>=3)
                                count2=0;
                        switch(count2)
                        {
                                case 0:        Cntus=0;
                                                        Cnt10ms=0;
                                                        Cnt1s=0;
                                                        Cnt1min=0;
                                                        Cnthour=0;        break;//清0
                                case 1:        suspend=1;  break;//计时
                                case 2:        suspend=0;        break;//暂停
                        }               
                }
        }
        else
        {
                count1=0;                                //计数变量清0
                key_sign=0;                                //按键状态标志清0
        }
}

/***********定时器初始化程序****************/
void Timer0Init()        //2500微秒@11.0592MHz
{
        TMOD = 0x01;        //设置定时器模式
        TL0 = 0x00;                //设置定时初值
        TH0 = 0xF7;                //设置定时初值
        TF0 = 0;                        //清除TF0标志
        TR0 = 1;                        //定时器0开始计时
        EA=1;                                //开总中断
        ET0=1;                        //开定时器0中断
}
void StopwatchDisplay()//数字分解
{
        LedBuff[0]=Cnthour/10;
        LedBuff[1]=Cnthour%10;
        LedBuff[2]=Cnt1min/10;
        LedBuff[3]=Cnt1min%10;
        LedBuff[4]=Cnt1s/10;
        LedBuff[5]=Cnt1s%10;
        LedBuff[6]=Cnt10ms/10;
        LedBuff[7]=Cnt10ms%10;
}

/***************主程序****************/
void main()
{
        Timer0Init();                                //定时器初始化
        while(1)
        {
                keyscan();                                //按键扫描
                StopwatchDisplay();
        }
}
/**************中断服务程序*****************/
void timer0() interrupt        1//2500微秒@11.0592MHz
{
        TL0 = 0x00;                                        //设置定时初值
        TH0 = 0xF7;                                        //设置定时初值
        Cntus++;                                                //中断变量Cntus自+1
        if(Cntus>=4)                                //10ms
        {
                Cntus=0;                                        //清0
                if(suspend==1)                        //暂停/启动
                        Cnt10ms++;                        //毫秒计数
                if(Cnt10ms>=100)
                {
                        Cnt10ms=0;
                        Cnt1s++;                                //秒计数
                        if(Cnt1s>=60)
                        {
                                Cnt1s=0;
                                Cnt1min++;                //分计数
                                if(Cnt1min>=60)
                                {
                                        Cnt1min=0;
                                        Cnthour++;        //时计数
                                        if(Cnthour>=24)
                                                Cnthour=0;
                                }
                        }
                }
        }
        LedScan();                                        //显示程序
}
void LedScan()//显示程序
{
        static u8 i=0;        //计数变量
        number=0x00;        //消隐
        wela=i<<2;                 //送位码
        if((i%2==1)&&(i!=7))//送段码
                number=smgduan[LedBuff]|0x80;//加点
        else         number=smgduan[LedBuff];
        if(++i>=8)
                i=0;
/*
        switch(i)
        {
                case 0: wela=i<<2; number=smgduan[LedBuff[0]];i++;break;
                case 1: wela=i<<2; number=smgduan[LedBuff[0]]|0x80;i++;break;
                case 2: wela=i<<2; number=smgduan[Cnt1min/10];it++;break;
                case 3: wela=i<<2; number=smgduan[Cnt1min%10]|0x80;i++;break;
                case 4: wela=i<<2; number=smgduan[Cnt1s/10];i++;break;                               
                case 5: wela=i<<2; number=smgduan[Cnt1s%10]|0x80;i++;break;                               
                case 6: wela=i<<2; number=smgduan[Cnt10ms/10];i++;break;       
                case 7: wela=i<<2; number=smgduan[Cnt10ms%10];i=0;break;       
        }*/
}
回复

使用道具 举报

ID:419421 发表于 2019-1-4 12:01 | 显示全部楼层
wulin 发表于 2019-1-4 11:21
给你改写成单键操作8位24小时百分秒表,有详细注释,应该能看得懂,经仿真无误。

#include

多谢多谢
回复

使用道具 举报

ID:213173 发表于 2019-1-4 13:16 | 显示全部楼层

根据电路图J21跳线帽要接在VCC与LE,否则74HC573打不开,段码送不了。 无标题.jpg

无标题1.jpg

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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