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

📄 yxktvtest.c

📁 C51环境下的KTV用的娱乐投票器
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************
*       模块名:YxKtv.c
*       功  能:系统主程序部分
*       时  间:2004.8.2
*
******************************************************************************/

/*学会使用预编译指令控制不同硬件版本
 #if (条件) ,还有#ifdef  #ifndef
  C语言指令,不用{}包括
 #else
 #endif
*/

//串口命令数据使用idata类型,编译使用rs(256),可使用80H后的数据区
//注意:函数预定义的变量说明要和实现体保持一致,否则参数传递错误
//void Prints(char,char,char data *,char);第3个参数char data *就必须有data

//为什么SendAck()中如果指定Using 1,内部变量Crc却使用RAM0的07
//如果串口中断Using 0,串口中断中并没有保护R0-R7的代码,引起错误,例如液晶显示乱

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

/*AT89LS52专用的*/
sfr AUXR=0x8E ;/*WDT等控制*/
/*b0=1不输出ALE信号 b3=0 WDT复位是RST脚输出高电平 b4=1 IDLE模式下WDT停止 */
sfr WDTRST=0xA6 ;/*轮流写1E和E1可复位WDT(16384个机器周期内,约32ms?),第一次是启动*/

#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 P07    =P0^7;

sbit LCDRS  =P2^0;
sbit LCDRW  =P2^1;
sbit LCDE   =P2^2;
sbit LCDPSB =P2^3;
sbit LCDRST =P2^4;
sbit LCDLED =P2^5;
sbit SCL    =P2^6;
sbit SDA    =P2^7;

sbit TR     =P3^4;
sbit LED    =P3^7;

/*常数定义*/

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

#define BANK_SERI 1

#define C_SERMAXN 16  /*串口缓冲区大小 最多显示64个字符*/

/*收发转换需要2ms*/
#ifdef WXKEY
 #define C_HEADN   20  /*无线发送引导头长度 发送0x55的数目*/
#else
 #define C_HEADN   0
#endif

#define C_TIMERN   25
#define C_LED  30
#define C_LOOPT 25

#define KDOT 10
#define KDEL 11
#define KOK  12
#define KESC 13
#define KFUNC1 14
#define KFUNC2 15

/*内部数据*/
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 Config1,Config2,Config3;
sbit Config1_0=Config1^0;
sbit Config1_1=Config1^1;

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,KonT;
uchar data AddL,AddH,SysMode;
uchar data KeyNo,InputN,IniPos,DataPos,InputMode;

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

uchar data LcdBuf[6];/*液晶显示*/

uchar data IcBuf[10];/*EEPROM数据区*/
bit bAck; /*EEPROM中的应答标志*/

uchar data LcdX,LcdY;
bit bSendAck;//在发送应答
#define C_CHARN 68
uchar idata CharData[C_CHARN];
bit bLoopShow,bRcvChar,bLoop;//
uchar LoopT,LoopPos,CharN,Money,Crc,SleepN;

#define VERSION 10

void SystemIni();
void ReadCmd();
void TstSend();
void LcdInit();
void ShowNums();
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);
bit  CheckMima();
void ShowIni();
void SendIni();
void Beep();
void DelayMs(uchar);
void RstTR();/*TR100E接收不正常后复位TR100E*/
void Tst24();
void InputClr();
void SaveKey(uchar);
void ReadKey(uchar);

void LcdWrCmd(uchar);
void LcdWrData(uchar);
void LcdClr(uchar);
void Prints(uchar,uchar,uchar data *,uchar);
void ShowLoop();
void WrBytes(uchar,uchar data *,uchar);
void ShowEprom();
void ShowMoney();

//液晶数据地址
uchar code DDRAMTAB[]={0x80,0x90,0x88,0x98,};

/*主程序开始*/
main()
{
    AUXR=0x11;

    SystemIni();           /*系统初始化*/

    WDTRST=0x1E; /*start WDT*/
    WDTRST=0xE1;

    while(1)
    {
        WDTRST=0x1E; /*Reset WDT*/
        WDTRST=0xE1;

        if (bRcvOk) ReadCmd();
        if (bTimer) TimerFunc();
        if (bKeyScan) KeyScan();
        if (bKeyOk) Beep();
        if (bLoop) ShowLoop();

      switch (SysMode)
        { case 0:
               FuncInput();
               break;
          case 1: //Setup
               FuncSetup();
               break;
          default:
               SysMode=0;
               break;
        }

        PCON=PCON|0x01;//IDLE模式,减少耗电
    }
}

void InputNum()
{ uchar data i;
  switch (InputMode)
  {
    case 0:
         break;
    case 2:
         LcdBuf[5]=KeyNo;
         InputN=1;
         break;
    case 3:
         Money=KeyNo;
         //if (Money>99) Money=99;
         ShowMoney();
         break;
    default:
        //if (InputN>5) return;
        if (bEnter) return;//修改为Enter后不可再输入
        for (i=0;i<5;i++) LcdBuf[i]=LcdBuf[i+1];
        LcdBuf[5]=KeyNo;
        InputN++;
  }
}
/*正常键盘输入*/
void FuncInput()
{    register uchar i;
     if (!bKeyOk) return;
     bKeyOk=0;
     //LED=~LED;

     if (InputMode==0) return;
     SleepTimer=PwrT*120;

     TimerA=0;/*重新计时*/

     switch (KeyNo)
     {
        case KDOT: //dot
             if (InputMode!=1) return;
             if (bDot) return;
             bDot=1;
             if (InputN==0)
                {  LcdBuf[5]=0; InputN++;  }
             LcdBuf[5]=0x0a;
             break;
        //case 11: //space
        //     break;
        case KDEL:
             if (InputMode==3)
             { if (Money>0) Money--;
               ShowMoney();
               break;
             }
             if (bEnter==1) return;
             if (LcdBuf[5]==0x0a) 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 (InputMode==3)
             {  if (Money<99 ) Money++;
                ShowMoney();
                break;
             }
             if (InputN>0)
                {  bEnter=1;
                   //InputN=6;
                   }
             else return;
             break;

        case KESC: //ESC
             if (InputMode==3)
             {  Money=0;
                ShowMoney();
                break;
             }
             InputClr();
             break;
        case KFUNC1: //FUNC
        case KFUNC2:
             break;
        default:  /*数字键*/
             InputNum();
     }

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

     ShowNums();
}


void WriteIni()
{   IcBuf[0]=0xAA;IcBuf[1]=0x55;
    IcBuf[2]=AddH;IcBuf[3]=AddL;
    IcBuf[4]=PwrT;IcBuf[5]=Config1;
    IcBuf[6]=Config2;IcBuf[7]=Config3;
    WrBytes24( 0,8);

}

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))
    {
        //IcBuf[0]=0xAA;IcBuf[1]=0x55;
        //WrBytes24(0,2);

        AddH=99;AddL=99;//999
        PwrT=2;
        Config1=3;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 ShowIni()
{  uchar data i;
   unsigned int data iTemp;

   LcdBuf[0]=IniPos+0x80;
   LcdBuf[1]=0x0f;
   switch (IniPos)
   {
      case 1:/*地址编号*/
           InputN=2;
           iTemp=AddH;
           i=iTemp/10;
           LcdBuf[2]=i;
           iTemp=iTemp-i*10;
           LcdBuf[3]=iTemp;
           iTemp=AddL;
           i=iTemp/10;
           LcdBuf[4]=i;
           iTemp=iTemp-i*10;
           LcdBuf[5]=iTemp;
           break;
      case 2:/*关机延时*/
           InputN=4;LcdBuf[2]=0x0f;LcdBuf[3]=0x0f;
           iTemp=PwrT;
           i=iTemp /10;
           LcdBuf[4]=i;
           iTemp=iTemp-i*10;
           LcdBuf[5]=iTemp;
           break;
      case 3://无线频点
           InputN=5;LcdBuf[2]=0x0f;LcdBuf[3]=0x0f;LcdBuf[4]=0x0f;
           LcdBuf[5]=Config1&0x3;
           break;
      case 4://软件版本
           InputN=4;LcdBuf[2]=0x0f;LcdBuf[3]=0x0f;
           iTemp=VERSION;
           i=iTemp /10;
           LcdBuf[4]=i|0x80;
           iTemp=iTemp-i*10;
           LcdBuf[5]=iTemp;
           break;

   }
   ShowNums();
}

void SaveIni()
{
   unsigned int data iTemp;

   switch (IniPos)
   {
      case 1:
           AddH=LcdBuf[2]*10+LcdBuf[3];
           AddL=LcdBuf[4]*10+LcdBuf[5];
           break;
      case 2:
           iTemp=LcdBuf[4]*10+LcdBuf[5];
           PwrT=iTemp;
           break;
      case 3:
           iTemp=LcdBuf[5]&0x3;
           Config1=iTemp;

   }
   WriteIni();
}

/*强制关机*/
void PwrOff()
{
       return;
}

/*自动按格式输入数字*/
void InpKey()
{
     if (KeyNo>10) return;
     LcdBuf[InputN]=KeyNo;
     ShowNums();

     InputN++;
     if (InputN<6 ) return;
     for (InputN=1;InputN<6;InputN++)
      {
         if ((LcdBuf[InputN]& 0x0f )<10) return;
      }
     InputN=5;
}

void SaveKey(uchar iPos)
{   uchar data iAddr,i;
    for (i=0;i<6;i++)
    { IcBuf[i]=LcdBuf[i];
    }
    iAddr=iPos*8+0x20;
    WrBytes24(iAddr,6);

}
void ReadKey(uchar iPos)
{
    uchar data iAddr,i;
    iAddr=iPos*8+0x20;
    RdBytes24(iAddr,6);
    for (i=0;i<6;i++)
    { LcdBuf[i]=IcBuf[i];
    }
    TimerA=0;

}
/*键盘设置*/
void FuncSetup()
{
     uchar data i;
     return;
}

bit CheckMima()
{    uchar code MIMATAB[] =
     {1,2,0x83,9,9,9};
     uchar data i;
     for (i=0;i<6;i++)
       { if (LcdBuf[i]!=MIMATAB[i]) return 0;}
     return 1;
}

void TimerFunc()
{  uchar i;

      bTimer=0;

      LED=~LED;
      if (LedTimer>0)
      { LCDLED=0;
        LedTimer--;
      }else LCDLED=1;

  if (InputMode>0)
  {   if ((bFlash)&&(!bEnter))
      { bFlash=0;
      LcdWrCmd(0x9C);//pos
      LcdWrData(' ');
      for (i=0;i<6;i++) LcdWrData(0x20);
      LcdWrData(' ');
      }
      else
      { bFlash=1;
        ShowNums();
      }
  };

  if (--SleepTimer==0)
  {  SleepTimer=PwrT*120;
     if (--SleepN==0)
     { SleepN=3;
       LcdInit();//显示公司信息
       SleepTimer=40;//20sec
       bLoop=0;
       bLoopShow=0;
       }
     else
      ShowEprom();
  }
 }

/*统一的发送按键结果*/
void SendInfo(uchar iPos,uchar iMode)
{  uchar data i,Crc;

    if (iPos<0x80)
    {
        if (iPos!=0)
         {
              iPos=iPos&0x0f;
              if (iPos!=DataPos)
              { //收到不同的DataPos时表示已经启动新的扫描
              DataPos=iPos;
              InputClr();
              ShowNums();
              for (i=0;i<10;i++) IcBuf[i]=0;//多人1投票器

⌨️ 快捷键说明

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