gmumain.c

来自「该程序实现六位LED的动态扫描显示,能设置波特率,」· C语言 代码 · 共 985 行 · 第 1/3 页

C
985
字号
//******************************************************************************
//***eeprom里存储的数据:10高;20低;30倍率;40地址;50拨特率;60起始位;70两次按下DS差值;80掉电保护
//********************************************************************************
#include <reg51.H>
#include <stdio.h>
#include <intrins.h>
#include <math.h>
#include <stdlib.h>
#include <absacc.h>
#include <string.h>

#define set_value  2
#define left_value 4
#define up_value   8
#define ds_value   16

#define dot_value 2

sbit watchdog = P1^0;

sbit set_key  = P1^1;
sbit left_key = P1^2;
sbit up_key   = P1^3;
sbit ds_key   = P1^4;

sbit int0     = P3^2;
sbit int1     = P3^3;
//**********************************************************************
//**********************************************************************
//**********************************************************************
sbit a0=ACC^0;			//定义ACC的位,利用ACC操作速度最快
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;

sbit sda   = P3^6;
sbit scl   = P3^7;

sbit low_alert     = P1^5;
sbit high_alert    = P1^6;

//**********************************************************************
//**********************************************************************
//**********************************************************************

code unsigned char tab_value[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
code unsigned char tab_asc2[]={
                               0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                               0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                               0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,
                               0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xff,0xff,0xff,0xff,0xff,
                               0xff,0x83,0xff,0xa1,0x86,0x23,0x33,0x89,0xff,0xff,0xff,0xc7,0x2f,0xff,0xff,0x8c,//A---0X41
                               0x8c,0xff,0xff,0xff,0xff,0xae,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
                               0xff,0x83,0x2a,0xa1,0x86,0xff,0xff,0x89,0xff,0xbf,0xff,0xc7,0xff,0xff,0xba,0x8c,    //a----0x61
                               0x8c,0x70,0xbb,0x62,0x2b,0x2c,0xff,0xff,0xe3,0x39,0xff,0xff,0xff,0xff,0xff,0xff,
                               };
idata unsigned char dis_big_value[7],zxg[6];
idata unsigned char dis_big_point;
idata unsigned char dis_bit;
idata unsigned char menu_exit_flag;
idata unsigned char d_flag;
idata char flash_times;


idata long high_limit;   //h
idata long low_limit;    //l
idata long offect_value; //d
idata long enlarge_ref;  //b
idata unsigned char baut_set; //p
idata unsigned char address_set; //e
idata long power_off_value;

idata long tht_counter;
idata unsigned long zxg_counter;
idata char count_add_flag;

void disvalue_big_asc(unsigned char *temp);
void dis_value(long value_temp,unsigned char dot_add,unsigned char start_add);
unsigned char key_scan(void);
void delay(int delaytime);
void delayms(int delaytime);
void display_bit(unsigned char value_temp,unsigned char flash_bit,unsigned char dot_flag);
void setmenu_hld(unsigned char hld_flag);
void setmenu_b(void);
void setmenu_p(void);
void setmenu_e(void);
void menu_list(void);

//***************************************
void s24(void);
void p24(void);
unsigned char rd24(void);
void wd24(unsigned char dd);
unsigned char read(unsigned int address);
void write(unsigned int address,unsigned char dd);
unsigned int read_int(unsigned int address);
void write_int(unsigned int address,unsigned int dd);
long read_long(unsigned int address);
void write_long(unsigned int address,long dd);
void ini_judge_value(void);
//***************************************
void initial(void)
    {
    //IE=0x82;//只打开定时器0就可以可,不必打开拨特率发生器的定时器
    IE=0x83;    //只打开定时器0就可以可,不必打开拨特率发生器的定时器
    TCON=0x05;  //外部中断打开,并为边沿触发
    TMOD=0x20;
    SCON=0x50;
    TH1=0xf9;
    TL1=0xf9;
    PCON=0x80;
    ES = 0;

    TH0=0xB0;      //显示中断
    TL0=0xff;
    TR0=1;
    dis_big_point=1;
    dis_bit = 0;
    dis_big_value[0]=0xff;
    dis_big_value[1]=0xff;
    dis_big_value[2]=0xff;
    dis_big_value[3]=0xff;
    dis_big_value[4]=0xff;
    dis_big_value[5]=0xff;
    delayms(5);

    ini_judge_value();
	zxg_counter = 0;

    high_alert   = 1;
    low_alert    = 1;

    }
void  int_ex_0() interrupt 0
    {
    unsigned char i;
    i = int1;
    if(i==1){
             zxg_counter = zxg_counter + 1;
	     count_add_flag = 1;
             }
    else {
    	  zxg_counter = zxg_counter-1;
          count_add_flag = 2;
          }
    if(zxg_counter<0) zxg_counter=0;
    }
void  inttime0() interrupt 1
    {
    TH0=0xdd;      //这个是显示中断,每次先置显示初值
    TL0=0x00;         //溢出很快的
    dis_big_point = 1;
    dis_big_point = dis_big_point<<dis_bit;

    P0 = 0;
    P2 = dis_big_value[dis_bit];
    P0 = dis_big_point;

    dis_bit = dis_bit + 1;
    if (dis_bit > 5) dis_bit = 0;
    watchdog = 0;
    watchdog = 1;
    }
void main(void)
    	{
        unsigned char temp,j;
        unsigned char ds_flag;
        unsigned char power_off_flag;
        long display_sub_value;
        long display_temp;
        long zxg_temp_value;
        long zxg_ttt;
        long zxg_hhh;
        long i;
        long qishi_1,qishi_2;
          ds_flag = 0;
          power_off_flag=0;
          zxg_counter = 0;
          initial();
          qishi_1 = offect_value;
          zxg_temp_value = power_off_value;
        while(1){
                 qishi_2 = read_long(60);
                 if(qishi_2 != qishi_1){write_long(60,qishi_2);d_flag = 1;}
                 else d_flag = 0;
                 
                 if(!power_off_flag){
                                     power_off_flag = 1;
                                     tht_counter = zxg_temp_value;
                                     zxg_ttt     = zxg_temp_value;
                                     }
                 if(power_off_flag){
       
                                    if(d_flag == 1){
                                                    d_flag = 0;
                                                //    write_long(80,0);
                                                    tht_counter = zxg_counter*(zxg[3]*100+zxg[2]*10+zxg[1]) + qishi_2*10;
                                                   }
                                    else
                                    tht_counter = zxg_counter*(zxg[3]*100+zxg[2]*10+zxg[1]) + zxg_ttt;
                                   }
             	 if(tht_counter > 99900 || tht_counter<0) tht_counter=0;
                 if(count_add_flag == 2) dis_big_value[5] = 0xbf;
                 else  dis_big_value[5] = 0xff;

                 if(zxg_temp_value != tht_counter)
                                   {
                                     zxg_temp_value = tht_counter;
                                     write_long(80,zxg_temp_value);
                                   }

                 if((tht_counter/10)>high_limit) high_alert   = 0;
                 else high_alert   = 1;
                 if((tht_counter/10)< low_limit) low_alert    = 0;
                 else low_alert    = 1;

                 temp = key_scan();
                 if(temp == set_value) menu_list();

                 if(temp == ds_value){
                                     if(ds_flag == 0){
                                                      ds_flag = 1;
                                                      display_temp = 0;
                                                      zxg_counter = 0;
                                                      }
                                     else {               
                                           ds_flag = 0;
                                           zxg_counter = 0;
                                           for(j = 0; j<5; j++){
                                            for(i = 0;i <100; i++){
                                                                   disvalue_big_asc("      ");
                                                                   delay(10);
                                                                   }                                           
                                            for(i = 0;i <100; i++){
                                                                    dis_value(display_temp ,3,1);
                                                                    delay(10);
                                                                    }
                                                                 }
                                           write_long(70, display_temp);       //l
                                           }
                                     }

                 if(temp== left_value){
                                       display_sub_value = read_long(70);
                                       dis_value(display_sub_value,3,1);
                                       delayms(500);
                                       }

                 if(ds_flag == 0)   dis_value(tht_counter ,3,1);
                 else {//ds_flag=1;
                       if(count_add_flag == 1){
                                               count_add_flag = 0;
                                               display_temp = zxg_counter*(zxg[3]*100+zxg[2]*10+zxg[1]);
                                               dis_big_value[5] = 0xff;
                                               //display_sub_value = display_temp;
                                              }
                       if(count_add_flag == 2){
                                               count_add_flag = 0;
                                               display_temp = zxg_counter*(zxg[3]*100+zxg[2]*10+zxg[1]);
                                               dis_big_value[5] = 0xbf;
                                              //display_sub_value = display_temp - tht_counter;
                                              }
                        dis_value(display_temp ,3,1);
 //                       delayms(700);
                       }
                 }
        }

void ini_judge_value(void)
      {
       high_limit      = read_long(10); //h
       low_limit       = read_long(20); //l
       enlarge_ref     = read_long(30); //b
       address_set     = read(40);      //e
       baut_set        = read(50);      //p
       offect_value    = read_long(60); //d
       power_off_value = read_long(80);

       zxg[1] = enlarge_ref%10;
       enlarge_ref = enlarge_ref/10;
       zxg[2] = enlarge_ref%10;
       enlarge_ref = enlarge_ref/10;
       zxg[3] = enlarge_ref%10;
       enlarge_ref = enlarge_ref/10;
       zxg[4] = enlarge_ref%10;
       enlarge_ref = enlarge_ref/10;
       zxg[5] = enlarge_ref%10;
       }
void disvalue_big_asc(unsigned char *temp)
             {
	     	 unsigned char tempp[7];
	         unsigned char i;
             for(i=1;i<7;i++)
		        {
                 tempp[i]=0xff;
                 tempp[i]=tab_asc2[*temp];
		         temp++;
		        }
             dis_big_value[0] = tempp[6];
	         dis_big_value[1] = tempp[5];
	         dis_big_value[2] = tempp[4];
             dis_big_value[3] = tempp[3];
	         dis_big_value[4] = tempp[2];
	         dis_big_value[5] = tempp[1];
	     }
void dis_value(long value_temp,unsigned char dot_add,unsigned char start_add)
             {
	         unsigned char temp[6];
             unsigned char tht_temp;
             long thttht;
             char i;
             char j;
             thttht = value_temp;
             tht_temp = dot_add;
             temp[1] = tab_value[thttht%10]; //个位
             thttht=thttht/10;
 	         temp[2] = tab_value[thttht%10]; //十位
             thttht=thttht/10;
 	         temp[3] = tab_value[thttht%10]; //百位
             thttht=thttht/10;
 	         temp[4] = tab_value[thttht%10]; //千位
             thttht=thttht/10;
 	         temp[5] = tab_value[thttht%10]; //万位

             switch(tht_temp){//点亮小数点;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?