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

📄 hand_913_rs232_ok_bak.c

📁 基于PIC18F6720MCU开发的手持式POS机的原码
💻 C
📖 第 1 页 / 共 5 页
字号:
/******************************************************************************************************************
                                               C-M-BUS手抄器程序
CPU: PIC18F6720   
作者:roger
创建日期:2004。6.25
更新日期:1.04.07.30   文件名:hand_730.c
          2.04.08.05   文件名:hand_805.c    
          3.04.08.15   文件名:hand_815.c   
          4.04.08.16   文件名:hand_816.c  
          5.04.08.20   文件名: hand_820.c   
          6.04.08.24   文件名: hand_825…ok.c     
		  7.04.08.24   文件名: hand_826_ok.c         
          8.04.08.24   文件名: hand_902_ok.c  
                               分解出: a.直接式抄表 hand_902…cmbus…ok。c
                                       b.间接式抄表 hand…902…re232…ok。c
                                         04.09.13   hand…902…re232…ok。c
                                       //-------------------------------
                                       
*************************************************************************************************************/ 

#define		uchar	unsigned	char 
#define		uint	unsigned	int
#define		ulong	unsigned	long
//================================================================================
//                                      常量定义区
//================================================================================
static uchar rom  LCD[]={0xed,0x60,0xa7,0xe3,0x6a,0xcb,0xcf,0xe0,0xef,0xeb};			//数字译码0-9,
						//0,  1,  2,   3,   4    5,   6,   7  ,   8  ,9  	
static uchar rom  SPACE[]={0};
static uchar rom  KEYCODE[21]={0,19,9,6,3,18,8,5,2,10,7,4,1,17,14,12,13,0,16,11,15};
static superpassword[6]={9,9,9,9,9,9};
/*------------------------------------------------------------------------------
;  源文件 / 文字 : E:\Zimo3Pro\图例\hand.bmp
;  宽×高(像素): 24×16
;  字模格式/大小 : 单色点阵液晶字模,横向取模,字节正序/48字节
;  数据转换日期  : 2004-7-6 18:47:57
------------------------------------------------------------------------------*/
static uchar rom hand[]=
{
0x00,0x1E,0x00,0x02,0x62,0x00,0x05,0x84,0x00,0x0E,0x1F,0xFE,0x38,0x00,0x01,0x60,
0x00,0x01,0xE0,0x03,0xFE,0xE0,0x00,0x20,0xE0,0x00,0x20,0xE0,0x03,0x80,0xE0,0x00,
0x40,0x60,0x00,0x40,0x3C,0x07,0x00,0x03,0x00,0x80,0x00,0xC0,0x80,0x00,0x3F,0x00
};
//------------------------------------------键盘按键功能预定义。
#define     up      11
#define		down    12
#define		right   13
#define		light   14
#define		esc     15
#define     lamp    16
#define  	set     17
#define     dot     18
#define		enter   19
#define     BAND_ADDRESS  0xa1
#define     SHUTDOWN_ADDRESS 0xa0
#define     MTYPE   0x10                   //表类型
#define	    NOP	Nop()
#define	    DOG	ClrWdt()
//-----------------------------------------------------------------------------------------
//                                      头文件                                  
//-----------------------------------------------------------------------------------------	
#include		"p18f6720.h"
#include		"cpupin.h"																	//管脚定义文件
#include		"eep.h"	 																	//地址定义文件
#include		"keydef.h"																	//关键字定义文件
#include		"hz.h"																		//汉字点阵文件
//================================================================================
//                                       变量定义区
//================================================================================
#pragma udata myNewData0
uchar		intdog;																	//中断监视计数
uint		secdog;																	//秒中断监视计数
uchar		mindog;																	//分中断监视计数
uchar		elnum;									    							//关液晶背光计数
uchar		handmark;														        //按键处理延时
#pragma udata myNewData1
uchar       buffersend[255];                                                //通讯发送缓存。
#pragma udata myNewData2
uchar		bufferreve[255];                                                //通讯接收缓存。
//--------------------------------------------------------------------------------------------------
#pragma 	udata myNewData3
union                                                      			        //数据缓冲区
{
	char		ichar[248];
	uchar		iuchar[248];	
}buffer;
#pragma 	udata myNewData4												//需量缓存
union   	                                                        		//显示数据缓冲区
{
	char		ichar[248];
	uchar		iuchar[248];
	uint		iuint[124];
}buffer1;
#pragma 	udata myNewData5												//需量缓存
union   	                                                       			//显示数据缓冲区
{	char		ichar[248];
	uchar		iuchar[248];	
	uint		iuint[124];
}buffer2;
//----------------------------------------------------------------------------
#pragma 	udata myNewData6					//需量缓存
uchar rtc_buf[14];							    //时钟缓存
struct
	{
		uchar second;
		uchar minute;
		uchar hour;
		uchar day;
		uchar week;
		uchar month;
		uchar year;
	}time;
//------------------------------------------------------
union               								//整型数裂解字符型数
{
	uint   	iuint;
	uchar   iuchar[2];
}digitchange;
//--------------------------------------------------------------
// step_count0:操作步长=0:登陆,=10:管理员级登陆成功。=20:普通操作员登陆成功。
// step_count1:=00:表示在主菜单页面下。
// deep_count:为人机数据交换是横向的相对输入位置。
uchar   step_count0,step_count1,step_count2,deep_count;  
uchar	keyposition,key;  
//-----------------------------------------------------------密码寄存器    
uchar   password [6]={0,0,0,0,0,0};                 //user input
uchar   password0[6]={0,0,0,0,0,0};                 //用户0密码
uchar   password1[6]={0,0,0,0,0,0};                 //普通1~9用户密码
uchar   password2[6]={0,0,0,0,0,0};                 //
//----------------------------------------------------------------------------------------------
uint    systermruntime;                             //为系统无操作运行时间:runtime*9ms.  
uint    elontime;                                   //为液晶背光有效时间。
uint    displaytime;                                //刷屏时间设置
uint    batdet_time;                                //电池电压检测时间
uchar   displaynextpage;                             //用于表示有新页面显示。
uchar   usernumber;                                  //当前登陆的用户号
uchar   yjelflag;
uchar   setbandreg;                                  //波特率设置寄存器,00:1200;01:2400;02:4800;03:9600。
uchar   setshutdownreg;								 //自动关机时间设置,00:1m,01:2m,02:3m,
//---------------------------------------------------
uchar   con_word,ser,id0,id1,dataarea_lenght;
uchar   comm_wrong_flag;
uchar   start_re_send_flag;
uchar   meter_type;
uchar   biaohao[7]; 
uchar   biaodata[48]; 
//---------------------------------------------------------
#pragma 	udata myNewData7	            //
char 		line1buffer[30];						//第1行幕缓存	
#pragma 	udata myNewData8				//
char 		line2buffer[30];				    	//第2行幕缓存
#pragma 	udata myNewData9				//
char 		line3buffer[30];						//第3行屏幕缓存
#pragma 	udata myNewData10				//
char 		line4buffer[30];						//第4行屏幕缓存
#pragma 	udata myNewData11				//
char 		line5buffer[30];						//第5行屏幕缓存
#pragma 	udata myNewData12		        //
char 		line6buffer[30];				    	//第6行幕缓存
#pragma 	udata myNewData13				//
char 		line7buffer[30];						//第7行屏幕缓存
#pragma 	udata myNewData14				//
char 		line8buffer[30];						//第8行屏幕缓存
//---------------------------------------------------------
#pragma 	udata myNewData15                
uint        current_repeater_addr; 							//当前有效的中继器地址。
uchar   	current_count;                                  //当前接收或发送的数据包数。
uint    	current_recordid;                               //抄表记录ID号码。1~500。
uint        record_total;                                   //当前记录总算。
uint        current_fault_meter;                            //当前中继器下的故障表具数。
uint        record_start_address;                           //为当前有效中继器地址下对应的第一个表在eeprom中的存储地址。
uchar       repeater_total;                                 //手抄器中中继器的总数。
uchar       meter_buffer[112];                              //用于存储从EEPROM中读出的表信息11=11×10=110+2=112。包含:数据包序号2+表类型1+表地址7+校验和1
//--------------------------------------------------------------
#pragma 	udata myNewData16
uchar       water_buffer[202];                             //用于存放超取的表信息20=20×10=200+2=202,包含:数据包序号2+当前读数5+结算日读数5+前2月读数5+ST1+抄表结果1+校验和1
#pragma 	udata myNewData17
uchar       repeater_buffer[256];                          //用于存放从EEPROM中度读取的中继器2=4*63+4=252。
#pragma 	udata myNewData18	  
//================================================================================
//                                       函数定义区
//================================================================================
void		init(void);															//初始化函数
void        speaker(void);                                                       //声音控制函数
void		delayms(uint n);														//n ms延时
void        readpassword(void);
uchar		batdet(void);														//电池电压检测
//================================================================================
//                                	      液晶操作
//==============================================================================
void		yjbg(uchar n);													//液晶背光控制
void		displaylcd(void);													//启动液晶
void        lcdinit(void);
uchar       lcdreadbf(void);                                                 //检查液晶是否忙。
void		lcdwritecom(uchar CD);
void		lcdwritedata(uchar data);									       
uchar		lcdreadldata(void);                                               //读参数或数据
void		clearlcd(void);												      //清除屏幕
void        waitenter(void);
void        printhand(uchar line);
void        certifylogincode(void);
void 		setscraddress(uchar line,uchar clum);
void  		clearhand(uchar line);
void		printscr(uchar,uchar,char,static rom char *,uchar *);				//屏幕打印函数
//================================================================================
//                                	       外部EEPRAM操作
//================================================================================
void		IIC_Start(void);													//I2C起始位
void		IIC_Stop(void);														//I2C停止位
uchar		IIC_Transmit(uchar);												//I2C发送1字节
uchar		read_word1(uint);													//读出EEPROM中指定地址的内容。
void		read_dword(uint,uchar);												//读出EEPROM中n个指定地址的内容给buffer
void		write_word1(uint, uchar);											//写单个字节
void		write_dword(uint, uchar);											//将buffer中n个数据按写入EEPROM
void	    write_n_word(uint address, uchar n);
void   	    readrepeaterlist(void);                                             //从外部eeprom中读出需要抄表的中继器列表。
void		bcdshow(uchar *p1,uchar *p2,uchar len);								//压缩bcd传显示
void		showbcd(uchar *p1,uchar *p2,uchar len);								//显示传压缩bcd                                            

//================================================================================
//                                内部EEPRAM操作
//================================================================================
uchar		read_wordin(uint addr);											//读EEPRAM
uchar		write_wordin(uint addr,uchar sdata);
void		read_dwordin(uint addr,uchar len);								//读EEPRAM多个
void		write_dwordin(uint addr,uchar len);                   			 //buffer内容连续写EEPRAM
//================================================================================
//                               C-M-BUS总线操作
//接口为串行口2。
//================================================================================
void		sendbus(uchar len);											    //单表cmbus模式,向总线发送缓存内数据,长度为n
uchar		receivebus(void);												//单表cmbus模式接收总线数据
void        sendbusfromrs232(uchar len);                                    //总线RS232模式,用于集抄
uchar       receivebusfromrs232(void);                                      //
void		senttime(void);													//向总线广播系统时间
//--------------------------------------------------
void        readmeterdata(void);
void        readrepeaterdata(void);
//
void        savemeterdata(void);                                             //保存接收的表具数据,如地址等
void        saverepeaterdata(void);                                          //保存接收的中继器数据,如中继器地址和下属的表数。
//
uchar       read_meter(uchar c_mode,uchar temp_id0,uchar temp_id1);         //根据数据标示读取表具中的有关数据
uchar       write_meter(uchar temp_id0,uchar temp_id1);                     //根据数据标示改写表具中的有关数据
//
uchar       testparity(uchar reve_data); 
uchar       getparity(uchar send_data);
//-------------------------------中继器相关操作----------------------------------
uchar       dealcmbusrevedata(void);
uchar 		dealcmbussenddata(void);                                            //发送数据前预处理
//
uchar       controlrepeater(uint re_address,uchar temp_id0,uchar temp_id1,uchar temp_ser); //对中继器相关操作,如:打开、关闭、锁定、解锁。                             
uchar       writerepeater(uint Old_re_address,uint new_re_address);             //更改中继器地址
uint        readrepeater(void);                                                 //读取中继器地址和状态                                            
//==================================================================================
//                               rs232总线操作
//接口为串行口1。
//==================================================================================
void		rs232send(uchar len);											//向rs232总线发送缓存内数据,长度为n
uchar		rs232receive(void);												//接收rs232总线数据
uchar 		dealrs232senddata(uchar return_type,uchar re_addr,uchar re_count);
uchar 		dealrs232revedata(void);
//================================================================================
//                               按键处理
//================================================================================

//--------------------------------------------------------------------------------
uchar		functionhandle,functionhandle0,functionhandle1,functionhandle2,functionhandle3,funtiondisplayselect;//功能柄	
void		Function(void);												//按键功能函数
void        wait_quit(void);

//================================================================================
//                              RTC操作
//================================================================================
void 		R8025_Start(void);										//启动R8025通信
void 		R8025_Stop(void);										//终止R8025通信
uchar 		R8025_Transmit(uchar);									//R8025通信数据发送
uchar 		R8025_Read_Word(uchar);							 	    //读R8025一个字节数据
void 		R8025_write_word(uchar,uchar);							//写R8025一个字节数据
#define		Us_Delay()	NOP;NOP;NOP;NOP;NOP;NOP;NOP;		//7微秒延时
void		readtime(void);						                    //读出时间
void		displaylcdtime(void);			   					    //显示时间	
//*************************************************************************************
//                			     中断函数
//************************************************************************************
void		interrupth(void);						
#pragma		code Vector=0x08
void    	vector(void)
  {
			_asm GOTO interrupth _endasm
  }
#pragma		interrupt interrupth save=PROD,PRODL,PRODH,TBLPTRL,TBLPTRH
//********************************************************************
void		interruptl(void);													
#pragma		code atlowVector=0x18
void 		atlowVector(void)
  {

⌨️ 快捷键说明

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