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

📄 cai.c

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

#include "hncc.h"
#define uchar unsigned char
#define RBAK ((int *)0x10900)   /* 用于存放所显示的记录号 */
#define ID 0       /* C10 */
#define NAME 1     /* C20 */
#define PRICE 2    /* C3 */
#define TYPE 3     /* N10 */
#define NUMBER 4   /* N10 */
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;
    
    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("[3] 汤煲");
        moveto(9,1);
        putstr_h("[4] 酒水");
        moveto(11,1);
        putstr_h("[F1] 统计");
        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!=0x88&&k!=0x89); 
        /* 判断输入的键值,若输入的不是'1','2','3','4','F1','F2',则继续等待输入 */
        switch(k) {   /* 根据输入的按键调用相应的函数 */
            case '1': 
            case '2': 
            case '3': 
            case '4':
                select(k - '0');
                break;
            case 0x88:
                disp_select();
                break;
		    case 0x89: 
                finish(0); 
        }
     }while(1);
}

/* 显示菜单并点菜 */
void select(xdata int type)
{

}

/* 显示点菜结果 */
void disp_select(xdata int type)
{
}

/* 续上次抄表 */
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
             {
              moveto(11,4);

⌨️ 快捷键说明

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