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

📄 hand_1010_rs232_ok.c

📁 基于PIC18F6720MCU开发的手持式POS机的原码
💻 C
📖 第 1 页 / 共 5 页
字号:
			_asm GOTO interruptl _endasm
  }	
#pragma 	code
#pragma		interruptlow interruptl save=PROD,PRODL,PRODH,TBLPTRL,TBLPTRH
//==============================================================================================
//                                     主程序
//硬件主要接口说明:
//            A.串行口1用于连接USB接口模块或者RS232接口电路,根据程序选则实现接口选择。
//            B.串行口2用于连接C-M-BUS总线,实现与总线式表头的硬件连接。 
//            C.RD、RB口、RF3完成液晶显示控制。
//            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();                                //确认密码输入界面,同时确认用户登记。   
    //----------------------------------------------------
	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>20000)|SDYSWIT_IN)															
			{
			systermruntime=0;
			SYZT1_DDR=output;				       //关闭电源												
			SYZT1_OUT=0;
			speaker();	
            delayms(1000);	
 			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);  
    	password1[temp_count]=read_word1(temp_count+16);  
       }
  }   
/*****************************************************************************************
函数: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   j;
  uchar  i; 
  //----------------------------------------------------------
  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;
  j=0;                                  
  do
    { 
     j=repeater_buffer[i*5];
     j=j*256+repeater_buffer[i*5+1];
     if((repeater_buffer[i*5]==0xee)|(j>500)|(j==0)) 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,2,'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)
功能:初始化
参数:无
返回值:无
----------------------------------------------------------------------------------
更新日期: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总线电压
	BUS_TR_DDR=output;				//发送控制
	BUS_TR_OUT=1;	                //置接收
	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;
    deep_count=0;
    deep_count1=0;
	key=0;
	setbandreg=51;                                  
	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;
	PIE1bits.TMR1IE=1;									//允许定时器TMR1产生中断	
	//--------------------------------------------------
	return;
}
/*========================================================================================*
函数:void  rx8025init(void)
创建日期:2004.9.18                                
作者:rojam
功能:时钟芯片初试化程序
参数:
返回值:无
*========================================================================================*/
void  rx8025init(void)
 {
   uchar i;
   i=R8025_Read_Word(0x0e); 
   if(i!=0x20) R8025_write_word(0x0e,0x20);
 }
/*========================================================================================*
函数: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];

⌨️ 快捷键说明

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