⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yxkeyv1.0.c

📁 C51环境下的有线投票器的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
*       模块名:YxKey.c
*       功  能:系统主程序部分
*       时  间:2004.4.30
*
******************************************************************************/

/*
*/
#include <reg51.h>
#include <intrins.h>   /*nop等指令*/


#define   uint unsigned int
#define   uchar unsigned char


#define NOP _nop_();_nop_();_nop_();_nop_();

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 K0     =P1^0;
sbit K1     =P1^1;
sbit K2     =P1^2;
sbit K3     =P1^3;
sbit K4     =P1^4;
sbit K5     =P1^5;
sbit K6     =P1^6;
sbit K7     =P1^7;

sbit TR     =P3^3;
sbit SCL    =P3^4;
sbit SDA    =P3^5;
sbit LED    =P3^7;
//sbit LED2   =P1^7;


/*常数定义*/
#define C_T0H 0xB8  /*20ms=(65536-x)*12/11.0592 */
#define C_T0L 0x00

#define BANK_SERI 1

#define C_SERMAXN 16  /*串口缓冲区大小*/

/*收发转换需要2ms*/
#define C_HEADN   0  /*无线发送引导头长度 发送0x55的数目*/
/*不加延时,使用PC机接收 HeadN=60,加2ms延时,并使用无单片机的收发板时,可使用50*/
/*使用10时可以提高无线基站的扫描间隔到50ms,使用20时扫描间隔60ms效果好,但使用50时也60ms,why?*/

#define C_TIMERN   25

#define KK7  7
#define KDOT 10
#define KSPC 11
#define KPRE 12
#define KNEXT 13
#define KOK   14
#define KESC  15
#define KFUNC 16

/*内部数据*/
uchar bdata ICData; /*串行读写数据使用,可位寻址*/
sbit ICDataB0=ICData^0;
sbit ICDataB1=ICData^1;
sbit ICDataB2=ICData^2;
sbit ICDataB3=ICData^3;
sbit ICDataB4=ICData^4;
sbit ICDataB5=ICData^5;
sbit ICDataB6=ICData^6;
sbit ICDataB7=ICData^7;

uchar bdata P1Led;
sbit LED2=P1Led^7;

uchar bdata ICONS;/*液晶图标*/
sbit IconZT=ICONS^7; /*公司标徽*/
sbit IconTX=ICONS^4;
sbit IconRX=ICONS^6;
sbit IconSETUP=ICONS^0; /*设置*/
sbit IconCOL =ICONS^1;
sbit IconBATT =ICONS^2; /*弱电*/

uchar bdata Config1,Config2,Config3;
sbit bOneKey =Config1^0;/*功能限定:单按键输入*/

uchar data SerData[C_SERMAXN] ;/*串口数据区*/
uchar data SerN,SerHeadN,SerBufN;
bit bRcvOk,bSendOk;

bit bTimer,bKeyOk,bDot,bEnter,bKeyScan,bSetup,bFlash;
uchar data TimerN,PwrT,TimerTR,KonT;
uchar data AddL,AddH,SysMode;
uchar data KeyNo,InputN,IniPos;
uchar data InitOkNum,InitOkNum2;

unsigned int data TimerA,PwrTimer;
/*最后按键计时,延时关机计时,上电初始化标志*/

uchar data LcdBuf[6];/*液晶显示*/
uchar data KeyBuf[3];/*按键序列*/
uchar data IcBuf[6];/*EEPROM数据区*/
bit bAck; /*EEPROM中的应答标志*/


void SystemIni();
void ReadCmd();
void TstSend();
void TimerFunc();
void KeyScan();
void FuncInput();
void FuncSetup();
void PushSendBuf(uchar);
void StartSendBuf();
void Stop24();
bit  WrBytes24(unsigned int,unsigned char);
bit  RdBytes24(unsigned int,unsigned char);
void DelayMs(uchar);
void SendMoreKey();
void InputClr();

/*主程序开始*/
main()
{

    SystemIni();           /*系统初始化*/
    //while(1) {LED=0;LED2=0;}; //Test Current

    while(1)
    {
        if (bRcvOk) ReadCmd();
        if (bTimer) TimerFunc();
        if (bKeyScan) KeyScan();

        switch (SysMode)
        { case 0:
               FuncInput();
               break;
          default:
               SysMode=0;
               break;
        }
        PCON=PCON|0x01;//IDLE模式,减少耗电

    }
}

uchar LeftShift4(uchar *Source,uchar inData)/*左移4位入*/
{   uchar i;
    i=*Source>>4;
    *Source=(*Source<<4)|(inData & 0x0f);
    return i;
}

void KeyInBuf(uchar Key)
{  uchar iCode;
   iCode=LeftShift4(&KeyBuf[2],Key);
   iCode=LeftShift4(&KeyBuf[1],iCode);
   iCode=LeftShift4(&KeyBuf[0],iCode);
}

/*正常键盘输入*/
void FuncInput()
{    register uchar i;
     if (!bKeyOk) return;
     bKeyOk=0;
     //LED=~LED;
     TimerA=0;/*重新计时*/

     KeyInBuf(KeyNo);//to按键序列

     switch (KeyNo)
     {
        case KDOT: //dot
             if (bDot) return;
             bDot=1;
             if (InputN==0)
                {  LcdBuf[5]=0; InputN++;  }
             LcdBuf[5]=LcdBuf[5]|0x80;
             break;
        //case 11: //space
        //     break;
        case KPRE:
        case KNEXT:
             if (bEnter==1) return;
             if (LcdBuf[5]>0x7f) bDot=0;
             for (i=0;i<5;i++) LcdBuf[5-i]=LcdBuf[4-i];
             LcdBuf[0]=0x0f;
             if (InputN>0) InputN--;
             break;
        case KOK: //OK
             if (InputN>0)
                {  bEnter=1;
                   InputN=0;//后继重新输入
                  }
             return;
        case KESC: //ESC
        case KFUNC: //FUNC
             InputClr();
             break;
        default:  /*数字键*/
               if (InputN>5) InputN=0;//后继重新输入

               for (i=0;i<5;i++) LcdBuf[i]=LcdBuf[i+1];
               LcdBuf[5]=KeyNo;
               InputN++;
     }

     if (InputN==1)/*开机缺省显示消除*/
     {  for (i=0;i<5;i++) LcdBuf[i]=0x0f;
     }

}


void WriteIni()
{   IcBuf[0]=0xAA;IcBuf[1]=0x55;
    WrBytes24(0,2);

    IcBuf[0]=AddH;IcBuf[1]=AddL;
    IcBuf[2]=PwrT;IcBuf[3]=Config1;
    IcBuf[4]=Config2;IcBuf[5]=Config3;
    WrBytes24( 2,6);

}

void ReadIni()
{   uchar i;

    Stop24();
    for (i=0;i<6;i++)
    {
       RdBytes24(0,2);
       if ((IcBuf[0]==0xAA) && (IcBuf[1]==0x55)) i=7;
       DelayMs(10);
     }

    if ((IcBuf[0]!=0xAA) | (IcBuf[1]!=0x55))
    {
        AddH=99;AddL=99;//9999
        //AddH=0;AddL=1;//1

        PwrT=2;
        Config1=0;Config2=0;Config3=0;
        //WriteIni();//不改写
    }
    else
    {   RdBytes24(2,6);
        AddH=IcBuf[0];AddL=IcBuf[1];
        PwrT=IcBuf[2];
        Config1=IcBuf[3];
        Config2=IcBuf[4];
        Config3=IcBuf[5];
    }

}



void SendIni()
{  uchar data i,Crc;

        EA=0;SerN=0;TR=0;

          PushSendBuf(0xAA);
          PushSendBuf(0x55);
          PushSendBuf(0x0b);
          PushSendBuf(AddH);
          PushSendBuf(0x50);
          PushSendBuf(AddL);
          PushSendBuf(02);
          PushSendBuf(AddH);
          PushSendBuf(AddL );
          PushSendBuf(PwrT);
          PushSendBuf(Config1);
          PushSendBuf(Config2);
          PushSendBuf(Config3);

          Crc=0;
          for (i=1;i<SerData[2];i++)
              Crc=Crc^SerData[i+2];

          PushSendBuf(Crc);
          EA=1;
          StartSendBuf();

}



void TimerFunc()
  {   bTimer=0;

      LED2=~LED2;
      //SendMoreKey();
 }

/*多键结果*/
void SendMoreKey()
{  uchar data i,Crc;
          EA=0;SerN=0;TR=0;

          PushSendBuf(0xAA);
          PushSendBuf(0x55);
          PushSendBuf(0x0C);
          PushSendBuf(AddH);
          if (bEnter) PushSendBuf(0x52);else PushSendBuf(0x51);
          PushSendBuf(AddL);
          PushSendBuf(LcdBuf[0]);
          PushSendBuf(LcdBuf[1]);
          PushSendBuf(LcdBuf[2]);
          PushSendBuf(LcdBuf[3]);
          PushSendBuf(LcdBuf[4]);
          PushSendBuf(LcdBuf[5]);
          PushSendBuf(TimerA /256 );
          PushSendBuf(TimerA);

          Crc=0;
          for (i=1;i<SerData[2];i++)
              Crc=Crc^SerData[i+2];

          PushSendBuf(Crc);
          EA=1;
          StartSendBuf();

}

/*单键结果*/
void SendOneKey()
{  uchar data i,Crc;
          EA=0;SerN=0;TR=0;

          PushSendBuf(0xAA);
          PushSendBuf(0x55);
          PushSendBuf(0x05);//len
          PushSendBuf(AddH);
          PushSendBuf(0x53);
          PushSendBuf(AddL);
          PushSendBuf(LcdBuf[5]);
          //PushSendBuf(TimerA /256 );
          //PushSendBuf(TimerA);

          Crc=0;
          for (i=1;i<SerData[2];i++)
              Crc=Crc^SerData[i+2];

          PushSendBuf(Crc);
          EA=1;
          StartSendBuf();

}


/*处理系统命令*/
void ReadCmd50()
{    //uchar data i;
     switch (SerData[6])  /*子命令码*/
     {  case 0x1:/*显示编号*/
             break;
        case 0x2: /*读配置*/
             if ((KeyNo!=KOK)&&(KeyNo!=KK7)) break;

             SendIni();

             break;
        case 0x3:  /*写配置*/
             if ((KeyNo!=KOK)&&(KeyNo!=KK7)) break;

             AddH=SerData[7];
             AddL=SerData[8];
             PwrT=SerData[9];
             Config1=SerData[10];
             Config2=SerData[11];
             Config3=SerData[12];
             WriteIni();
             ReadIni();
             SendIni();
             break;

        case 0x4: /*延时关机*/
             PwrTimer=SerData[7]*256 + SerData[8];
             break;
        default: //认为是按模式扫描启动
             InputClr();
             break;
      }
     //Beep();
}

/*解读串口命令*/
void ReadCmd()
{    register uchar i,Crc;


     Crc=0;
     for (i=0;i<SerN-4;i++) Crc=Crc^SerData[i+3]; /*计算CRC,Len后Crc前的XOR值*/
     if(Crc!=SerData[SerN-1]) /*CRC效验不正确*/
        {  goto ReadClear;

        }

     LED2=~LED2;
     P1=P1Led;

     if (!((SerData[3]==AddH) && (SerData[5]==AddL)))

⌨️ 快捷键说明

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