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

📄 dian.c

📁 嵌入式点菜系嵌入式点菜系统源码供参考c51c51统源码供参考嵌入式点菜系统源码供参考c51c51c51c51
💻 C
📖 第 1 页 / 共 3 页
字号:
/* 注意:在此样板程序之后有一些函数功能模块, */
/* 大家可以直接调用或作少许修改后调用.   */
#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 + -