📄 yxktvtest.c
字号:
/******************************************************************************
* 模块名: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 + -