📄 hand_902_ok.c
字号:
// D.RE口、RG0、RF4完成键盘接口功能。
//==============================================================================================
void main(void)
{
//-------------------------------------------------
SYZT1_DDR=output;
SYZT1_OUT=1; //自动关机/开机控制端
NOP;
SYZT1_OUT=1; //自动关机/开机控制端
init(); //主程序初示化
speaker(); //‘嘀’一声。/
delayms(500);
//------------------------------------------------
init(); //主程序初示化
delayms(1000);
lcdinit(); //液晶初示化程序
certifylogincode(); //确认密码输入界面,同时确认用户登记。
readrepeaterlist();
INTCONbits.GIE=1; //开总中断
while(1)
{
//------------------------------------------
if(elontime>15000) //背光自动关断控制。
{
YJLEDCON_DDR=output;
YJLEDCON_OUT=1;
yjelflag=1;
elontime=0;
speaker();
}
if(key==lamp) //lamp 按键处理;
{
yjbg(yjelflag);
speaker();
key=0;
}
if(key||displaynextpage) Function(); //按键处理
//-----------------------------------------自动关机处理
if((systermruntime>5000*(setshutdownreg+1))|SDYSWIT_IN)
{
systermruntime=0;
SYZT1_DDR=output; //关闭电源
SYZT1_OUT=0;
speaker();
//while(1);
}
//-------------------------------------------电池电压检测部分
if(batdet_time>10000) //电池电压检测电路
{
batdet_time=0;
switch(batdet())
{
case 0:
break;
case 1:
printscr(7,0,'c',"电池欠压,请充电!",buffer.ichar);
speaker();
delayms(500);
speaker();
break;
case 2:
printscr(7,0,'c',"电池已充满!",buffer.ichar);
speaker();
delayms(500);
speaker();
break;
default:
break;
}
}
}
}
//****************************************************************************************
// 以下为子程序
/****************************************************************************************
函数:void readpassword(void)
功能:从系统eeprom中读出用户密码。
参数:无
返回值:无
*****************************************************************************************/
void readpassword(void)
{
uchar temp_count,temp_data;
for(temp_count=0;temp_count<6;temp_count++) password[temp_count]=read_word1(temp_count);
NOP;
read_dword(0x00,64);
NOP;
for(temp_count=0;temp_count<6;temp_count++) password1[temp_count]=read_word1(temp_count+16);
NOP;
}
/*****************************************************************************************
函数:void readrepeaterlist(void);
功能:将外部EEPROM中的有关的中继器信息读入内部。
----------------------------------------------------------------------
uint record_total; //当前中继器下的总抄表记录总算。
uint record_start_address; //为当前有效中继器地址下对应的第一个表在eeprom中的存储地址。
uchar repeater_total; //手抄器中中继器的总数。
uchar meter_buffer[112]; //用于存储从EEPROM中读出的表信息11=11×10=110+2=112。包含:数据包序号2+表类型1+表地址7+校验和1
uchar water_buffer[202]; //用于存放超取的表信息20=20×10=200+2=202,包含:数据包序号2+当前读数5+结算日读数5+前2月读数5+ST1+抄表结果1+校验和1
uchar repeater_buffer[256]; //用于存放从EEPROM中度读取的中继器2=4*63+4=252。
************************************************************************/
void readrepeaterlist(void)
{
uint i;
uchar j;
//----------------------------------------------------------
for(i=0;i<248;i++) buffer.ichar[i]=0;
read_dword(0x200,248);
for(i=0;i<248;i++)
{
repeater_buffer[i]=buffer.ichar[i];
repeater_buffer[i+1]=0;
repeater_buffer[i+2]=0;
}
i=0;
do
{
if(repeater_buffer[i*5]==0xee) break; //计算中继器总数。
else i++;
}
while(i<49);
repeater_total=i; //计算总的中继器数
}
/***********************************************************************
函数:void init(void)
功能:初始化
参数:无
返回值:无
************************************************************************/
void certifylogincode(void)
{
uchar charh,charl;
printscr(0,0,'c',"******************************",buffer.ichar);
printscr(3,6,'c',"操作员:抄表员",buffer.ichar);
printscr(4,6,'c',"密 码:",buffer.ichar);
printscr(7,0,'c',"操作员类型选择请按'.'!",buffer.ichar);
printscr(8,0,'c',"******************************",buffer.ichar);
printscr(9,5,'c',"优倍电气股份有限公司",buffer.ichar);
//displaylcdtime();
printhand(3);
//-------------------------------------------------------------------
}
/**********************************************************************
功能:实现根据输入的行列值设置光标的位置
***********************************************************************/
void setscraddress(uchar line,uchar clum)
{
uchar charh,charl;
//-----------------------------------
charh=(line*496+clum+480)/256;
charl=(line*496+clum+480)%256;
lcdwritecom(0x46); //设置光标地址
lcdwritedata(charl); //csrl=0x00;
lcdwritedata(charh); //csrh=0x00;同时设置该地址作为显示缓冲区的当前地址指针。
}
/*********************************************************************************
函数:void init(void)
功能:初始化
参数:无
返回值:无
? For USART1:
- bit SPEN (RCSTA1<7>) must be set (= 1)
- bit TRISC<7> must be set (= 1)
- bit TRISC<6> must be cleared (= 0)
? For USART2:
- bit SPEN (RCSTA2<7>) must be set (= 1)
- bit TRISG<2> must be set (= 1)
- bit TRISG<1> must be cleared (= 0)
----------------------------------------------------------------------------------
更新日期:2004.06.29
========================================================================================*/
void init(void) //初始化函数
{
uchar i;
//***********************************************************
INTCONbits.GIE=0; //关总中断
//-----------------------------------------------------------RD为8为数据口.
PSPCONbits.PSPMODE=0; //设置普通I/O
//-----------------------------------------------------------RF
ADCON0=0X00; //AD无效,全部为数字口
ADCON1=0x0F; //
CHARGEDET_DDR=output;
CHARGEDET_OUT=0;
//-----------------------------------------------------------RC
RCSTA1bits.SPEN=0; //1 = Serial port enabled, 0= Serial port disabled (configures RX/DT and TX/CK pins as serial port pins)
DDRC=0B10000000; //INT_RTC_DDR=input;RXD1_IN=input;
LATC=0B00100100; //写保护EEPROM,电源控制端打开。
//-----------------------------------------------------------RE
DDRE=0B00000111; //RE0~RE2:INPUT;RE3~RE7:OUTPUT.
LATE=0B00000111; //OUTPUT 0.
ROW4_DDR=input;
//-----------------------------------------------------------RB
DDRB=0B00000000; //SED1335
LATB=0B00111111; //
//------------------------------------------------------------RG
DDRG=0B00001101; //SED1335
LATG=0B11111111; //
//*********************************中断设置初始化***************
RCONbits.IPEN=0; //中断无优先级
//******************** 计数器1初始化****************************
T0CON=0x00;
T3CON=0X00;
T1CON=0x09; //1:4预分 后分频,TMR1允许
TMR1L=0x00; //2d=0010,1101
TMR1H=0xec; //
CMCON=0x07; //关闭比较器
INTCONbits.PEIE=1; //外部设备中断开
//---------------------------------------------------------------------关闭液晶和cmbus总线电压
CBUS_VDD_CON_DDR=output;
CBUS_VDD_CON_OUT=0; //关闭CMBUS总线的18V;
YJVDDCON_DDR=output;
YJVDDCON_OUT=1;
YJREST_DDR=output;
YJREST_OUT=1;
SDYSWIT_DDR=input;
//----------------------------------------------------------------------相关寄存器清零操作。
yjelflag=0;
systermruntime=0; //为系统无操作运行时间:runtime*9ms.
elontime=0; //为液晶背光有效时间。
displaytime=0; //刷屏时间设置
displaynextpage=0;; //用于表示有新页面显示。
usernumber=0; //当前登陆的用户号
step_count0=3;
step_count1=0;
step_count2=1;
key=0;
setbandreg=71;
setshutdownreg=1;
for(i=0;i<30;i++)
{
line1buffer[i]=0;
line2buffer[i]=0;
line3buffer[i]=0;
line4buffer[i]=0;
line5buffer[i]=0;
line6buffer[i]=0;
line7buffer[i]=0;
line8buffer[i]=0;
}
functionhandle=0;functionhandle0=0;functionhandle1=0;functionhandle2=0;functionhandle3=0;
PIE1bits.TMR1IE=1; //允许定时器TMR1产生中断
//--------------------------------------------------
return;
}
/*========================================================================================*
函数:void speaker(void)
创建日期:2004.7.2
作者:rojam
功能:声音提示功能
参数:
返回值:无
*========================================================================================*/
void speaker(void)
{
SPEAKER_DDR=output;
SPEAKER_OUT=0;
delayms(6);
SPEAKER_OUT=1;
return;
}
/*========================================================================================*
函数:void displaylcdtime()
创建日期:2004.7.2
作者:rojam
功能:在第十行处显示系统时间
参数:
返回值:无
*========================================================================================*/
void displaylcdtime()
{
uchar i;
uchar temp_buffer[26];
static uchar rom xqhznum[]=
{0xc8,0xd5,0xd2,0xbb,0xb6,0xfe,0xc8,0xfd,0xcb,0xc4,0xce,0xe5,0xc1,0xf9}; //星期
// 日 一 二 三 四 五 六
readtime();
for(i=0;i<26;i++) buffer.ichar[i]=1;
temp_buffer[0]='2'; //"2000年00月00日";
temp_buffer[1]='0';
temp_buffer[2]=rtc_buf[0];
temp_buffer[3]=rtc_buf[1];
temp_buffer[4]=0xc4;
temp_buffer[5]=0xea; //0xc4,0xea为‘年’的内码。
//--------------------------------
temp_buffer[6]=rtc_buf[2]; //buffer.ichar[1]&0x0f
temp_buffer[7]=rtc_buf[3]; //(buffer.ichar[1]&0xf0)>>4
temp_buffer[8]=0xd4; //0xd4,0xc2为‘月’的内码。
temp_buffer[9]=0xc2;
//----------------------------------
temp_buffer[10]=rtc_buf[4];//buffer.ichar[2]&0x0f
temp_buffer[11]=rtc_buf[5];//(buffer.ichar[2]&0xf0)>>4
temp_buffer[12]=0xc8;
temp_buffer[13]=0xd5; //0xc8,0xd5为‘日’的内码。
//------------------------------
temp_buffer[14]=0xd0; //"星期00 00时 00分"
temp_buffer[15]=0xc7; //星
temp_buffer[16]=0xc6;
temp_buffer[17]=0xda;
temp_buffer[18]=xqhznum[rtc_buf[7]*2]; //注:RTC_BUF[6]为无用数据。
temp_buffer[19]=xqhznum[rtc_buf[7]*2+1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -