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

📄 hand_902_cmbus_ok.c

📁 基于PIC18F6720MCU开发的手持式POS机的原码
💻 C
📖 第 1 页 / 共 5 页
字号:
//            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 + -