找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 292|回复: 2
打印 上一主题 下一主题
收起左侧

下面程序显示和按键代码哪里不对?

[复制链接]
跳转到指定楼层
楼主
ID:72649 发表于 2024-1-3 06:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include"stc8h.h"
#include <INTRINS.H>


bit t0zd0b=0;


//code unsigned char NixieTable[]={//段码
//// 0    1    2    3    4    5    6    7    8    9
//  0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,
//};


//unsigned char NixieTable[]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};


//        #define a 0x08            // AAAAA   P27-P20  a~dp  1111  1111
//        #define b 0x04            // F   B       P27  26 25 24 23 22 21 20
//        #define c 0x02            // F   B        a    b  c  d  e  f  g  dp
//        #define d 0x01            // GGGGG
//        #define e 0x80            // E   C
//        #define f 0x40            // E   C
//        #define g 0x20            // DDDDD  DP
//        #define db 0x10
//        #define NEG 0x10             //负号号的宏定义


        #define a 0x80            // AAAAA   P27-P20  a~dp  1111  1111
        #define b 0x40            // F   B       P27  26 25 24 23 22 21 20
        #define c 0x20            // F   B        a    b  c  d  e  f  g  dp
        #define d 0x10            // GGGGG
        #define e 0x08            // E   C
        #define f 0x04            // E   C
        #define g 0x02            // DDDDD  DP
        #define db 0x01
        #define NEG 0x02            //负号号的宏定义


const  char  NixieTable[]={


                                                                                                        ~(a+b+c+d+e+f),      //Displays"0"
                                                                                                        ~(b+c),              //Displays"1"
                                                                                                        ~(a+b+d+e+g),        //Displays"2"     
                                                                                                        ~(a+b+c+d+g),        //Displays"3"
                                                                                                        ~(b+c+f+g),          //Displays"4"
                                                                                                        ~(a+d+f+g+c),        //Displays"5"     
                                                                                                        ~(a+c+d+e+f+g),      //Displays"6"
                                                                                                        ~(a+b+c),            //Displays"7"
                                                                                                        ~(a+b+c+d+e+f+g),    //Displays"8"
                                                                                                        ~(a+b+c+d+f+g),      //Displays"9"
                                 g                   //Displays"-"
                                                                                                } ;


        #undef a
        #undef b
        #undef c
        #undef d
        #undef e
        #undef f
        #undef g
        #undef db
                                                                                               
unsigned int caiji_wendu,tingzhi_wendu,kaiji_wendu,x_display;
unsigned int msecond;
                                                                                               
sbit tingzhi_key_up = P0^3 ;
sbit tingzhi_key_down = P5^4 ;
sbit kaiji_key_up = P3^6 ;
sbit kaiji_key_down = P3^7 ;       
                                                                                               
#define KEY1 1
#define KEY2 2
#define KEY3 3
#define KEY4 4                                                                                       


char keynum;                        //延时函数


sbit On_off = P3^4 ;               
sbit out = P3^5 ;       
sbit FMQ = P3^2 ;       


//#define SMG_WeiShu  10  //数码管位数
//idata unsigned char SMG_HuanCun[SMG_WeiShu];//数码管缓存               
unsigned char SMG_HuanCun[10]={0,0,0,0,0,0,0,0,0,0};
                                                                                               
void IO_csh();
void Delay1us(unsigned char xus)        ;
void Delay1ms(unsigned char xms );
void delay_1ms(void);
void delay_ms(unsigned int var);       
void Timer0_init();
void Timer1_Init(void);
void adc_Init(void);
void Nixie(unsigned char Location,Number);       
unsigned char KeyScan(unsigned char mode);
void datapros();


unsigned int  Get_ADC12bitResult(unsigned char channel) ;
unsigned int get_temperature(unsigned int adc);
                                                                                               
void IO_csh()
{
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0xc0;
    P2M0 = 0xff; P2M1 = 0x00;
    P3M0 = 0x34; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;
    P6M0 = 0x00; P6M1 = 0x00;
    P7M0 = 0x00; P7M1 = 0x00;
                On_off =1 ;               
                out = 0 ;       
                FMQ = 0 ;       
}


void Delay1us(unsigned char xus)        //@11.0592MHz
        {
                while(xus--)
                        {
                        _nop_();
                        _nop_();
                        _nop_();
                        }
        }


void Delay1ms(unsigned char xms )        //@11.0592MHz
{
        unsigned char data i, j;
while(xms--)
{
        i = 15;
        j = 90;
        do
        {
                while (--j);
        } while (--i);
}
}




///*
//必须开启T0中断,延时函数才起作用
//*/


//void delay_1ms(void)
//{
//       unsigned char i = 4; //每次256us,1ms中断4次
//        while (i)
//                          {
//                if (t0zd0b)
//                {
//                        t0zd0b = 0; //清除时间中断标志
//                        --i;
//                }
//        }
//}


//void delay_ms(unsigned int var)    //延时单位为毫秒,最多延时65.535秒(65535mS)
//{
//        while (var--)
//        {
//                delay_1ms();
//        }
//}


//#define d_s(s) delay_ms((s)*100ul)//延时单位为秒
                                                                                               
void Timer0_init()  //1ms
{
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
                                TL0 = 0xCD;                                //设置定时初始值
                                TH0 = 0xD4;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;      //开T0中断      
}


void Timer1_Init(void)                //1毫秒@11.0592MHz
{
    TMOD = 0x00;
    TL1 = 0xCD;;                                 //65536-11.0592M/12/1000
    TH1 = 0xD4;
    TR1 = 1;                                    //启动定时器
    ET1 = 1;                                    //使能定时器中断
//    EA = 1;
}




void adc_Init(void)                //1毫秒@11.0592MHz
{
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x00;
    ADC_CONTR = 0xc0;                           //使能并启动ADC模块
    EADC = 1;                                   //使能ADC中断
//    EA = 1;
}


void Nixie(unsigned char Location,Number)
{
        switch(Location)
        {
                case 1:P10=1;P11=1;P12=1;P13=1;P14 = 1;P15 = 1;P33 = 1;P00 = 0;P01 = 1;P02 = 1;break;
                case 2:P10=1;P11=1;P12=1;P13=1;P14 = 1;P15 = 1;P33 = 1;P00 = 1;P01 = 0;P02 = 1;break;
                case 3:P10=1;P11=1;P12=1;P13=1;P14 = 1;P15 = 1;P33 = 1;P00 = 1;P01 = 1;P02 = 0;break;
               
                case 4:P10=0;P11=1;P12=1;P13=1;P14 = 1;P15 = 1;P33 = 1;P00 = 1;P01 = 1;P02 = 1;break;
    case 5:P10=1;P11=0;P12=1;P13=1;P14 = 1;P15 = 1;P33 = 1;P00 = 1;P01 = 1;P02 = 1;break;
                case 6:P10=1;P11=1;P12=0;P13=1;P14 = 1;P15 = 1;P33 = 1;P00 = 1;P01 = 1;P02 = 1;break;
                case 7:P10=1;P11=1;P12=1;P13=0;P14 = 1;P15 = 1;P33 = 1;P00 = 1;P01 = 1;P02 = 1;break;
               
                case 8:P10=1;P11=1;P12=1;P13=1;P14 = 0;P15 = 1;P33 = 1;P00 = 1;P01 = 1;P02 = 1;break;
                case 9:P10=1;P11=1;P12=1;P13=1;P14 = 1;P15 = 0;P33 = 1;P00 = 1;P01 = 1;P02 = 1;break;
                case 10:P10=1;P11=1;P12=1;P13=1;P14 = 1;P15 = 1;P33 = 0;P00 = 1;P01 = 1;P02 = 1;break;
        }
        P2=NixieTable[Number];


//        Delay1ms(1);//消影,循环太快会使数码管乱位的现象  加了此两句显示不正常,全部8
//        P2=0x00;
}


void main()
{   
        unsigned char  i;
    unsigned int j;
       
          IO_csh();       
    Timer0_init() ;
    Timer1_Init() ;
                adc_Init() ;
          EA = 1;
                On_off = 1 ;
               
                tingzhi_wendu = 055 ;
          caiji_wendu = 2345;
                kaiji_wendu = 012 ;
       
        while(1)
        {
   
//                                        FMQ = !FMQ ;   //测试端口
datapros()        ;
               
                        SMG_HuanCun[3] = caiji_wendu/1000%10;
                        SMG_HuanCun[4] = caiji_wendu/100%10;
                        SMG_HuanCun[5] = caiji_wendu/10%10;
                        SMG_HuanCun[6] = caiji_wendu%10;
               
       
               


               
                        Nixie(4,SMG_HuanCun[3] );
      Delay1us(100)        ;
                  Nixie(5,SMG_HuanCun[4]);
      Delay1us(100)        ;
                  Nixie(6,SMG_HuanCun[5]);
      Delay1us(100)        ;       
                        Nixie(7,SMG_HuanCun[6]);
      Delay1us(100)        ;
/*以下显示数字准确,上面显示为什么不准确*/
       
               
//                        Nixie(1        ,1);                                             
//                        Delay1us(100)        ;
//                        Nixie(2        ,2);
//                        Delay1us(100)        ;
//                        Nixie(3,        3);
//                        Delay1us(100)        ;
//               
//                        Nixie(4        ,4);
//      Delay1us(100)        ;
//                  Nixie(5        ,5);
//      Delay1us(100)        ;
//                  Nixie(6        ,6);
//      Delay1us(100)        ;       
//                        Nixie(7        ,7);
//      Delay1us(100)        ;


//                        Nixie(8        ,8);
//      Delay1us(100)        ;
//                  Nixie(9        ,9);
//      Delay1us(100)        ;
//                  Nixie(10        ,0);
//      Delay1us(100)        ;




//                 if(t0zd0b)   //1ms到
//        {
//            t0zd0b = 0;
//            if(++msecond >= 300)    //300ms到
//            {
//                msecond = 0;
//                                                       
////  


//                                                       
//                j = Get_ADC12bitResult(7);  //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误


//                if(j < 4096)
//                {
//                       caiji_wendu = get_temperature(j); //计算温度值


////                    if(caiji_wendu >= 400)    F0 = 0, caiji_wendu -= 400;       //温度 >= 0度
////                    else            F0 = 1, caiji_wendu  = 400 - j;   //温度 <  0度
//                                                                                                                                                                  Nixie(1        ,caiji_wendu%10);
////                                                                                 Delay1us(10)        ;
//                                                                                                Nixie(2        ,caiji_wendu/10%10);
////                                                                                 Delay1us(10)        ;
//                                                                                                Nixie(3        ,caiji_wendu/100%10+0x01);
////                                                                                 Delay1us(10)        ;
//                                                                                                Nixie(4        ,caiji_wendu/1000%10);
////                                                                                 Delay1us(10)        ;




////                    if(j%10 == 0)   
////                                                                                        Nixie(1        ,0);
////                    if(F0)
////                                                                                        Nixie(4        ,0x01);     //显示-




//                }
////                else    //错误
////                {
////                    for(i=0; i<8; i++)


////                                                                        Nixie(4        ,0x01);
////                }
//            }
//        }
   
               




        }
}


SMG_SaoMiao()interrupt 1
{      //数码管扫描定时器0
                if(TF0)
                TF0=0;
                TL0 = 0xCD;                                //设置定时初始值
                TH0 = 0xD4;                                //设置定时初始值
                t0zd0b=1;
                key();
//                                FMQ = !FMQ ;   //测试端口
//    datapros();
}       
       
       
void TM1_Isr() interrupt 3      //定时器1
{
    idata unsigned char HM;
          if(++HM>1){//调节刷新速度
                HM=0;
          ADC_CONTR=0xC7;//开始测量ADC


//                        FMQ = !FMQ ;   //测试端口
        }                             
       
}       
       
       
void ADC_Isr() interrupt 5
{


//                idata unsigned char b,c;
//                idata unsigned int a;
//    ADC_CONTR &= ~0x20;                         //清中断标志
//          a=4096-(ADC_RES<<8|ADC_RESL);
//        caiji_wendu = a;
}




//========================================================================
// 函数: u16 Get_ADC12bitResult(u8 channel)
// 描述: 查询法读一次ADC结果.
// 参数: channel: 选择要转换的ADC.
// 返回: 12位ADC结果.
// 版本: V1.0, 2012-10-22
//========================================================================
unsigned int Get_ADC12bitResult(unsigned char channel)  //channel = 0~15
{
    ADC_RES = 0;
    ADC_RESL = 0;


    ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;    //启动 AD 转换
    _nop_();
    _nop_();
    _nop_();
    _nop_();


    while((ADC_CONTR & 0x20) == 0)  ;   //wait for ADC finish
    ADC_CONTR &= ~0x20;     //清除ADC结束标志
    return  (((unsigned int)ADC_RES << 8) | ADC_RESL);
}




//  MF52E 10K at 25, B = 3950, ADC = 12 bits
unsigned int code temp_table[]={
        140,    //;-40  0
        149,    //;-39  1
        159,    //;-38  2
        168,    //;-37  3
        178,    //;-36  4
        188,    //;-35  5
        199,    //;-34  6
        210,    //;-33  7
        222,    //;-32  8
        233,    //;-31  9
        246,    //;-30  10
        259,    //;-29  11
        272,    //;-28  12
        286,    //;-27  13
        301,    //;-26  14
        317,    //;-25  15
        333,    //;-24  16
        349,    //;-23  17
        367,    //;-22  18
        385,    //;-21  19
        403,    //;-20  20
        423,    //;-19  21
        443,    //;-18  22
        464,    //;-17  23
        486,    //;-16  24
        509,    //;-15  25
        533,    //;-14  26
        558,    //;-13  27
        583,    //;-12  28
        610,    //;-11  29
        638,    //;-10  30
        667,    //;-9   31
        696,    //;-8   32
        727,    //;-7   33
        758,    //;-6   34
        791,    //;-5   35
        824,    //;-4   36
        858,    //;-3   37
        893,    //;-2   38
        929,    //;-1   39
        965,    //;0    40
        1003,   //;1    41
        1041,   //;2    42
        1080,   //;3    43
        1119,   //;4    44
        1160,   //;5    45
        1201,   //;6    46
        1243,   //;7    47
        1285,   //;8    48
        1328,   //;9    49
        1371,   //;10   50
        1414,   //;11   51
        1459,   //;12   52
        1503,   //;13   53
        1548,   //;14   54
        1593,   //;15   55
        1638,   //;16   56
        1684,   //;17   57
        1730,   //;18   58
        1775,   //;19   59
        1821,   //;20   60
        1867,   //;21   61
        1912,   //;22   62
        1958,   //;23   63
        2003,   //;24   64
        2048,   //;25   65
        2093,   //;26   66
        2137,   //;27   67
        2182,   //;28   68
        2225,   //;29   69
        2269,   //;30   70
        2312,   //;31   71
        2354,   //;32   72
        2397,   //;33   73
        2438,   //;34   74
        2479,   //;35   75
        2519,   //;36   76
        2559,   //;37   77
        2598,   //;38   78
        2637,   //;39   79
        2675,   //;40   80
        2712,   //;41   81
        2748,   //;42   82
        2784,   //;43   83
        2819,   //;44   84
        2853,   //;45   85
        2887,   //;46   86
        2920,   //;47   87
        2952,   //;48   88
        2984,   //;49   89
        3014,   //;50   90
        3044,   //;51   91
        3073,   //;52   92
        3102,   //;53   93
        3130,   //;54   94
        3157,   //;55   95
        3183,   //;56   96
        3209,   //;57   97
        3234,   //;58   98
        3259,   //;59   99
        3283,   //;60   100
        3306,   //;61   101
        3328,   //;62   102
        3351,   //;63   103
        3372,   //;64   104
        3393,   //;65   105
        3413,   //;66   106
        3432,   //;67   107
        3452,   //;68   108
        3470,   //;69   109
        3488,   //;70   110
        3506,   //;71   111
        3523,   //;72   112
        3539,   //;73   113
        3555,   //;74   114
        3571,   //;75   115
        3586,   //;76   116
        3601,   //;77   117
        3615,   //;78   118
        3628,   //;79   119
        3642,   //;80   120
        3655,   //;81   121
        3667,   //;82   122
        3679,   //;83   123
        3691,   //;84   124
        3702,   //;85   125
        3714,   //;86   126
        3724,   //;87   127
        3735,   //;88   128
        3745,   //;89   129
        3754,   //;90   130
        3764,   //;91   131
        3773,   //;92   132
        3782,   //;93   133
        3791,   //;94   134
        3799,   //;95   135
        3807,   //;96   136
        3815,   //;97   137
        3822,   //;98   138
        3830,   //;99   139
        3837,   //;100  140
        3844,   //;101  141
        3850,   //;102  142
        3857,   //;103  143
        3863,   //;104  144
        3869,   //;105  145
        3875,   //;106  146
        3881,   //;107  147
        3887,   //;108  148
        3892,   //;109  149
        3897,   //;110  150
        3902,   //;111  151
        3907,   //;112  152
        3912,   //;113  153
        3917,   //;114  154
        3921,   //;115  155
        3926,   //;116  156
        3930,   //;117  157
        3934,   //;118  158
        3938,   //;119  159
        3942    //;120  160
};


/********************  计算温度 ***********************************************/
// 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度.
// 为了通用, ADC输入为12bit的ADC值.
// 电路和软件算法设计: Coody
/**********************************************/


#define     D_SCALE     10      //结果放大倍数, 放大10倍就是保留一位小数
unsigned int get_temperature(unsigned int adc)
{
    unsigned int code *p;
    unsigned int i;
    unsigned char  j,k,min,max;
   
    adc = 4096 - adc;   //Rt接地
    p = temp_table;
    if(adc < p[0])      return (0xfffe);
    if(adc > p[160])    return (0xffff);
   
    min = 0;        //-40度
    max = 160;      //120度


    for(j=0; j<5; j++)  //对分查表
    {
        k = min / 2 + max / 2;
        if(adc <= p[k]) max = k;
        else            min = k;
    }
         if(adc == p[min])  i = min * D_SCALE;
    else if(adc == p[max])  i = max * D_SCALE;
    else    // min < temp < max
    {
        while(min <= max)
        {
            min++;
            if(adc == p[min])   {i = min * D_SCALE; break;}
            else if(adc < p[min])
            {
                min--;
                i = p[min]; //min
                j = (adc - i) * D_SCALE / (p[min+1] - i);
                i = min;
                i *= D_SCALE;
                i += j;
                break;
            }
        }
    }
    return i;
}






unsigned char KeyScan(unsigned char mode)                   //按键状态检测函数
{
        static unsigned char keyen=1;
        if(mode==1)
        {
                keyen=1;
        }
        if(keyen==1&&(tingzhi_key_up==0||tingzhi_key_down==0||kaiji_key_up==0||kaiji_key_down==0))          //检测按键是否按下
        {
                Delay1ms(10);  //消抖处理
                keyen=0;           //如果按下keyen=0;
                if(tingzhi_key_up==0)return KEY1;           //检测哪个按键按下,返回值
                else if(tingzhi_key_down==0)return KEY2;
                else if(kaiji_key_up==0)return KEY3;
                else if(kaiji_key_down==0)return KEY4;                               
        }
        else if(tingzhi_key_up==1&&tingzhi_key_down==1&&kaiji_key_up==1&&kaiji_key_down==1)                //检测按键是否松手
        {
                keyen=1;   //如果松手keyen=1;
        }
        return 0;       
}


void datapros()                //按键显示值函数
{
        unsigned char key=KeyScan(0);          //key=按键检测函数0
        switch(key)
        {
                case 1:  tingzhi_wendu++;if(keynum==100)keynum=0; break;  //按键1
                case 2:  tingzhi_wendu--;if(keynum<=0)keynum=99; break;   //按键2
                case 3:  kaiji_wendu++;if(keynum==100)keynum=0; break;                                            //按键3
                case 4:  kaiji_wendu--;if(keynum<=0)keynum=99; break;
        }
                        SMG_HuanCun[0] = tingzhi_wendu/100%10;
                        SMG_HuanCun[1] = tingzhi_wendu/10%10;
                        SMG_HuanCun[2] = tingzhi_wendu%10;
       
                        Nixie(1        ,SMG_HuanCun[0]);
                        Delay1us(100)        ;
                        Nixie(2        ,SMG_HuanCun[1]);
                        Delay1us(100)        ;
                        Nixie(3        ,SMG_HuanCun[2]);
                        Delay1us(100)        ;
       
                        SMG_HuanCun[7] = kaiji_wendu/100%10;
                        SMG_HuanCun[8] = kaiji_wendu/10%10;
                        SMG_HuanCun[9] = kaiji_wendu%10;       
       
                        Nixie(8,SMG_HuanCun[7]);
      Delay1us(100)        ;
                  Nixie(9,SMG_HuanCun[8]);
      Delay1us(100)        ;
                  Nixie(10,SMG_HuanCun[9]);
      Delay1us(100)        ;               
}








































分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2024-1-3 20:39 | 只看该作者
#define后面,同一行,不要加//
回复

使用道具 举报

板凳
ID:161164 发表于 2024-1-4 09:25 | 只看该作者
什么叫准确?什么叫不准确?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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