📄 hand_902_ok.c
字号:
/******************************************************************************************************************
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
*************************************************************************************************************/
#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 0x11 //表类型
#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); //向总线发送缓存内数据,长度为n
uchar receivebus(void); //接收总线数据
void senttime(void); //向总线广播系统时间
//--------------------------------------------------
void readmeterdata(void);
void readrepeaterdata(void);
//
void savemeterdata(void); //保存接收的表具数据,如地址等
void saverepeaterdata(void); //保存接收的中继器数据,如中继器地址和下属的表数。
//
uchar read_meter(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)
{
_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完成液晶显示控制。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -