📄 dian.c
字号:
/* 注意:在此样板程序之后有一些函数功能模块, */
/* 大家可以直接调用或作少许修改后调用. */
#include "hncc.h"
#define uchar unsigned char
#define RBAK ((int *)0x10900) /* 用于存放所显示的记录号 */
#define DBH 0 /* 电表号 C10 */
#define HM 1 /* 户名 C20 */
#define DJH 2 /* 电价号 C3 */
#define SYXD 3 /* 上月底度 N10 */
#define BYXD 4 /* 本月底度 N10 */
#define CBBZ 5 /* 抄表标志 N2 */
#define RQ 6 /* 抄表日期 D8 */
#define YDDZ 7 /* 用电地址 C30 */
#define BL 8 /* 倍率 N3 */
#define CBH 9 /* 抄表号 N4 */
#define SYDL 10 /* 上月电量 N10 */
#define BYDL 11 /* 本月电量 N10 */
#define XCBH 12 /* 新抄表号N4 */
void xsccb(void);
void lc(void);
int cxcb(void);
void tj(void);
uchar wcpd(xdata int r);
void fycb(xdata int r);
uchar cb(xdata int r);
void cscal(xdata uchar *by,xdata uchar *sy,xdata uchar l);
void clslib(xdata int r);
void disp1(xdata int r);
void th(xdata uchar n);
void disp2(xdata uchar *s,xdata int r);
uchar ksh(xdata uchar *cdata,xdata uchar n1,xdata uchar n2,xdata uchar reg);
uchar pd(xdata uchar *s1,xdata uchar *s2);
void dateup(xdata uchar *d);
int fy(xdata char k,xdata int r);
int lcfy(xdata uchar k,xdata int r);
int ss(xdata uchar *s,xdata uchar l);
void help(void);
void hlp1(void);
void hlp2(void);
void hlp3(void);
void hlp4(void);
xdata int total; /* 全局变量,用于存放总记录数 */
no_init int xhao;
void main(void)
{
xdata uchar xh[5],bb[11],k,s[9],s1[11];
screen(1); /* 设定为汉字显示状态 */
libopen(0); /* 打开第一数据库 */
total=libsumr()-1; /* 计算第一数据库的总记录数 */
if(RBAK[0]>total||RBAK[0]<0) /* 对刚下装的数据库,RBAK中的值(记录号)可能会超出其范围,若超出,置其为0(即第一记录) */
RBAK[0]=0;
libset(total,DBH);
libread(bb);
if(bb[0]=='0')
{
xhao=1;
bb[0]='1';
libset(total,DBH);
libwrite(bb);
}
do
{
cls(); /* 清一屏 */
moveto(15,14); /* 屏幕定位 */
putstr(" "); /* 覆盖屏幕右下角的"123" */
moveto(1,4);
putstr("某某供电局");
moveto(3,1);
putstr_h("[1] 续上次抄表");
moveto(5,1);
putstr_h("[2] 抄未抄户");
moveto(7,1);
putstr_h("[F1]查询抄表");
moveto(9,1);
putstr_h("[3] 统计");
moveto(11,1);
putstr_h("[4] 帮助");
moveto(13,1);
putstr_h("[F2]退出");
dateup(s); /*设定日期格式*/
s1[0]=s[0];
s1[1]=s[1];
s1[2]=s[2];
s1[3]=s[3];
s1[4]='.';
s1[5]=s[4];
s1[6]=s[5];
s1[7]='.';
s1[8]=s[6];
s1[9]=s[7];
s1[10]=0;
moveto(15,1);
putstr("日期: ");
putstr_h(s1);
do
{
k=key(0); /* 等待输入一个字符,不回显 */
}while(k!=0x31&&k!=0x32&&k!=0x33&&k!=0x34&&k!=0x89&&k!=0x88); /* 判断输入的键值,若输入的不是'1','2','3','4'或'F2'则继续等待输入 */
switch(k) /* 根据输入的按键调用相应的函数 */
{
case '1': xsccb();break;
case '2': lc();break;
case '3': tj();break;
case '4':help();break;
case 0x88: fycb(cxcb());break;
case 0x89: exit(0);
}
}while(1);
}
/* 续上次抄表 */
void xsccb(void)
{
xdata int r;
int i;
r=RBAK[0]; /* 将记录号设置为最后一次退出前所显示的那条记录 */
do /*查找上一次抄表最近一条未抄记录*/
{
if(r>=total)
{
cls();
moveto(7,1);
putstr_h("已到最后一条记录");
bell(8);
moveto(15,1);
putstr("按任意一键继续...");
key(0);
break;
}
i=wcpd(r);
if(i==1)
r++;
else break;
}
while(1);
fycb(r);
}
/* 漏抄 */
void lc(void)
{
xdata int r;
xdata uchar bz,k;
for(r=0;r<total;r++) /* 从第一条记录(记录号为0)开始,找到第一条标志为未抄的记录就退出循环 */
{
bz=wcpd(r);
if(bz==0)
break;
}
if(r==total) /* 若退出循环时r已超出记录范围,说明未找到未抄记录,返回 */
{
cls();
moveto(7,5);
putstr("全部抄完");
delay(256);
delay(256);
delay(256);
return;
}
do /* 否则进入抄表状态 */
{
k=cb(r);
if(k==0x89) /* 抄完一个用户后,判断按键为'F2',返回菜单 */
break;
if(k==0x88)
r=cxcb();
r=lcfy(k,r); /* 否则根据按健(如上,下箭头)确定下一屏要显示的记录号 */
}while(1);
}
/* 按电表号或抄表号抄表 */
int cxcb(void)
{
xdata uchar kdata[12],s[12],l;
xdata int r,r1;
sc_0: cls();
moveto(15,14);
putstr(" ");
moveto(3,1);
putstr("输入电表或抄表号");
moveto(9,4);
putstr("─────");
moveto(7,4);
l=ksh(s,0,10,1); /* 等待输入电表号,放在s,最长为10个字符,允许输入数字,字母,运算符 */
if(s[1]==0x89) /*F2按下结束查询*/
goto en;
if(s[1]==0x88) /*F1被按下则重输*/
goto sc_0;
r=ss(s,l); /* 搜索电表号 */
if(r!=0xffff)
return(r); /*返回查询的记录号*/
sc_1: if(r==0xffff) /* 若搜索结果为0xffff,说明库中没有电表号与之相符的记录,返回菜单 */
{
cls();
moveto(15,14);
putstr(" ");
moveto(4,1);
putstr_h("无此电表或抄表号");
delay(256);
delay(256);
bell(8);
moveto(15,1);
putstr("按任意键继续...");
key(0);
}
en: return(RBAK[0]); /*未收索到则返回当前的记录号*/
}
/* 统计 */
void tj(void)
{
xdata int i,sum1=0,sum2=0,sum3=0,sum4=0,sum5=0;
xdata uchar l,bzs[3],sum[6];
cls();
moveto(15,14);
putstr(" ");
moveto(3,5);
putstr("正在统计");
moveto(6,5);
putstr("请稍等...");
for(i=0;i<total;i++) /* 累计未抄及正常记录 */
{
libset(i,CBBZ); /* 设置记录 */
libread(bzs); /* 读取所指定记录指定字段的内容 */
if(bzs[0]=='1'&&bzs[1]==0) /* 标志为未抄时,累加sum1 */
sum1+=1;
if(bzs[0]=='7'&&bzs[1]==0) /* 标志为正常时,累加sum3 */
sum3+=1;
}
sum2=total-sum1; /* 记录总数-未抄数=已抄数,存放于sum2 */
sum4=sum2-sum3; /* 已抄数-正常数=异常数,存放于sum4 */
cls();
moveto(15,14);
putstr(" ");
moveto(1,1);
putstr("总数: ");
l=itos(total,sum); /* 将整型数转换为字符串,存放于字符数组sum中,用于显示 */
sum[l]=0;
putstr_h(sum);
moveto(3,1);
putstr("未抄: ");
l=itos(sum1,sum);
sum[l]=0;
putstr_h(sum);
moveto(5,1);
putstr("已抄: ");
l=itos(sum2,sum);
sum[l]=0;
putstr_h(sum);
moveto(7,1);
putstr("正常: ");
l=itos(sum3,sum);
sum[l]=0;
putstr_h(sum);
moveto(9,1);
putstr("异常: ");
l=itos(sum4,sum);
sum[l]=0;
putstr_h(sum);
moveto(13,2);
putstr("───────");
moveto(15,1);
putstr_h("按任意键返回...");
key(0);
}
/* 未抄判断,读取指定记录的抄表标志,若为未抄返回0,否则返回1 */
uchar wcpd(xdata int r)
{
xdata uchar bzs[3];
libset(r,CBBZ);
libread(bzs);
if(bzs[0]=='1'&&bzs[1]==0)
return(0);
else
return(1);
}
/* 翻页抄表,r为最先显示的记录号 */
void fycb(xdata int r)
{
xdata uchar k;
do
{
k=cb(r); /* 抄表 */
if(k==0x89) /* 判断抄完一户表后返回的键值,为'F2'退出 */
break;
if(k==0x88)
r=cxcb();
r=fy(k,r); /* 否则根据k值返回上(或下)一条记录号 */
}while(1);
}
/* 抄表 */
uchar cb(xdata int r)
{
xdata uchar f,cdata[15],kdata[15],s[15],bz,l,bzs[3],k,bls[5],xh1[5];
xhao++;
cb_0: RBAK[0]=r; /* 保存当前显示的记录号 */
cb_2: disp1(r); /* 显示该记录信息 */
libset(r,CBBZ);
l=libread(cdata);
bz=stoi(l,cdata);
if(bz==1)
{ /* 若抄表标志为未抄 */
cb_1: moveto(13,11);
putstr_h(" "); /* 清除所显示的本月底度 */
moveto(13,11);
f=ksh(cdata,0,6,0); /* 等待输入本月底度 */
if(f==0)
{ /* 若输入不是数值加确认键 */
if(cdata[1]==0) /* 若输入是数值加其它功能键 */
goto cb_1;
else
{
/* 若标志为'1',则所按第一个键即为功能键,判断若是'↑','↓','F1','F2','确认'就返回 */
if(cdata[1]!=0x8e&&cdata[1]!=0x8f&&cdata[1]!=0x89&&cdata[1]!=0x8d&&cdata[1]!=0x88)
goto cb_1;
if(cdata[1]==0x8d) /* 若按下[确认]键,也把它当作向下箭头键来使用 */
cdata[1]=0x8f;
return(cdata[1]);
}
}
libset(r,BYXD);
libwrite(cdata); /* 将本月底度写入库中 */
libset(r,SYXD);
l=libread(kdata); /* 读上月底度 */
cscal(cdata,kdata,l); /* 计算:差数=本月底度-上月底度,存放在kdata中 */
libset(r,BL);
libread(bls); /* 读倍率 */
strmul(bls,kdata,14); /* 计算:本月电量=差数*倍率,存放在kdata中 */
moveto(15,7);
putn_h(10,kdata); /* 显示本月电量值 */
libset(r,BYDL);
libwrite(kdata); /* 将本月电量写入数据库中 */
dateup(cdata); /* 将当天日期转换为数据库中日期型字段的格式 */
libset(r,RQ);
libwrite(cdata); /* 将当天日期写入库*/
libset(r,XCBH);
xh1[0]= xh1[1]=xh1[2]=xh1[3]=xh1[4]=0;
itos(xhao,xh1);
libwrite(xh1); /* 将新抄表序号写入库中*/
libset(r,SYDL);
libread(s); /* 读上月电量 */
f=pd(s,kdata); /* 判断本月电量是否在上月电量波动范围内,f=1是f=0非 */
if(f==1)
{
bzs[0]='7'; /* 置标志为正常 */
bzs[1]=0;
libset(r,CBBZ);
libwrite(bzs); /* 将抄表标志写入库中 */
moveto(11,4);
th(7); /* 把标志7代表的抄表状态显示出来 */
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -