微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51新入门求助!关于数码管和独立键盘模块

51新入门求助!关于数码管和独立键盘模块

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
sbit s2=P3^0;
uchar hex=0;
uchar counter=0;
uchar code leddata[]={

                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                        };
void delay(uchar msec);//延时函数的声明
void timer_ini();          //定时器的初始化
void display(uchar hex);         //数码管的显示
void main()
{
        timer_ini();         //初始化定时器
         while(1)
         {
                
                if(s2==0)
                {
                        delay(5);
                        if(s2==0)                           //按下s3,关闭定时器停止计时
                        {
                                TR1=0;
                                for(;!s2;);
                                   TR1=1;                                                //弹出s3,定时器开始计时
                        }
                       
                }
                if(TF1==1)        //如果定时器溢出
                {
                  TF1=0;  //置0       
                  TH1=(65536-46082)/256;
          TL1=(65536-46082)%256;  //重新初始化
                  counter++        ;
                  
                }
                if(counter==20)
                {       
                        counter=0;
                        hex++;
                        if(hex==16)
                {
                        hex=0;
                }
                }
       
                display(hex);
        }
}
void delay(uchar msec)
{
        uchar o_circle;
        uchar i_circle;
        for(o_circle=msec;o_circle>0;msec--)
                for(i_circle=112;i_circle>0;i_circle--);
}
void timer_ini()
{
            wela=1;
            P0=0xf0;
            wela=0;
                P0=0XFF;
        TMOD=0x10;// 定时器1,工作模式1,16位定时器
        TH1=(65536-46082)/256;
        TL1=(65536-46082)%256;
        TR1=1;// Start timer NO.1         //定时50ms
}
void display(uchar hex)
{
        dula=1;
        P0=leddata[hex];
        dula=0;
}   所实现功能应该是数码管前4位间隔1s显示0~F.按下独立键盘S2数码管停止跑数,松开s2数码管继续跑数 。不过该程序是按下s2后再松开,数码管停止计数。恳请大神帮帮小弟!谢谢!

暂时只看到中断服务程序有错~~~~~

奇怪,这个问题我昨天貌似回答过了,怎么没了?难道是小编又发一次吗?

进去调试模式,仿真看看,有可能卡在  for(;!s2;;)出不来了。或者改变表达方式试试,如把 for(;!s2;;)改为  delay(2000)

自己多用心检查代码

谢谢

谢谢

没有,没有

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top