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

📄 cai1.c

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

#include "hncc.h"
#define uchar unsigned char
#define RBAK ((int *)0x10900)   /* 用于存放所显示的记录号 */
#define TYPE   0  /* N1 */
#define ID     1  /* C3 */
#define NAME   2  /* C8 */
#define PRICE  3  /* N3 */
#define NUMBER 4  /* N2 */

#define TYPE_LEN    1
#define ID_LEN      3
#define NAME_LEN    8
#define PRICE_LEN   3
#define NUMBER_LEN  2

#define F1		0x88
#define F2		0x89
#define ENTER	0x8D
#define UP		0x8E
#define DOWN	0x8F

#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 select(xdata uchar type);

void disp_select();
int select_cai(xdata int record);
void writetocard();
void finish();
void change();

void dateup(xdata uchar *d);
uchar ksh(xdata uchar *cdata,xdata uchar n1,xdata uchar n2,xdata uchar reg);


xdata int total;      /* 全局变量,用于存放总记录数 */
xdata int first[4], last[4];
no_init int xhao;

void main(void)
{
    xdata uchar k,s[9],s1[11], type[TYPE_LEN], id[ID_LEN + 1];
    xdata int i, j;

    screen(1);        /* 设定为汉字显示状态 */
    libopen(0);       /* 打开第一数据库 */
    total=libsumr();   /* 计算第一数据库的总记录数 */
    if(RBAK[0]>total||RBAK[0]<0)     
    /* 对刚下装的数据库,RBAK中的值(记录号)可能会超出其范围,若超出,置其为0(即第一记录) */
    RBAK[0]=0;
    for(i = 0; i < 4; i++) {
        first[i] = -1;
        last[i] = -1;
    }

    for(i = 0; i < total; i++) {
        libset(i, TYPE);
        libread(type);
        j = type[0] - '1';
        if (first[j] == -1)
        {
            first[j] = i;
        }
        last[j] = i;
    }
    
    do {
        cls();          /* 清一屏 */
        moveto(15,14);  /* 屏幕定位 */
        putstr("   ");  /* 覆盖屏幕右下角的"123" */
        moveto(1,3);
        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!=F1&&k!=F2); 
        /* 判断输入的键值,若输入的不是'1','2','3','4','F1','F2',则继续等待输入 */
        switch(k) {   /* 根据输入的按键调用相应的函数 */
            case '1': 
            case '2': 
            case '3': 
            case '4':
                select(k);
                break;
            case F1:
                disp_select();
                break;
		    case F2: 
                finish(); 
        }
     }while(1);
}

/* 显示菜单并点菜 */
void select(xdata uchar select_type)
{
	xdata int start, end, i, j, x, y, curr_record;
	xdata uchar type[TYPE_LEN+1], id[ID_LEN+1], name[NAME_LEN+1], price[PRICE_LEN+1];
    xdata uchar f, cdata[7];

    start = first[select_type - '1'];
    end = last[select_type - '1'];
    i = start;
    
    if (start == -1)
    {
        cls();
        clsn(15,2);
        moveto(3, 3);
        putstr_h("没有该类菜!");
        moveto(7, 3);
        putstr_h("任意键返回...");
        key(0);
        return; 
    }

	do {
sel_1:	cls();
        moveto(15,14);  /* 屏幕定位 */
        putstr("   ");  /* 覆盖屏幕右下角的"123" */
        curr_record = i;
		for (x = 1; x <= 7; x++ ) {
			while(curr_record <= end) {
                libset(curr_record, TYPE);
			    libread(type);
			    if (type[0] == select_type)
                    break;
                curr_record++;
            }
            if (curr_record > end)
                break;
            moveto(x*2-1, 1);
			libset(curr_record, ID);
            libread(id);
            putstr_h(id);
			putstr_h(" ");
			libset(curr_record, NAME);
			libread(name);
			putstr_h(name);
            moveto(x*2-1, 13);
            putstr_h(" ");
			libset(curr_record, PRICE);
			libread(price);
			sprintf(name, "%3s", price);
            putstr_h(name);
            curr_record++;				
		}
        
        do {
sel_2:
            clsn(15,2);
            moveto(15,1);
		    putstr("请选择: ");
			moveto(15,9);
			putstr_h("  ");
			moveto(15,9);
			f=ksh(cdata,0,3,0); /* 等待输入一串字符,只允许是数字,最多2位 */
			if(f==0) {      /* 输入不是数字加确认键 */
				if (cdata[1] == 0) /* 若输入是数值加其它功能键 */
				{
                    bell(5);
					continue;
				} else { /* 否则所按第一个键即为功能键 */
				    if (cdata[1] == F1)
				    {
                        disp_select();
                        return;
				    }
                    if (cdata[1] == F2)
				    {
                        return;    /* 退回上层菜单 */
				    }
                    if (cdata[1] == UP ) {
						i -= 7;
						if (i < start){
							i = start;
                            bell(5);
                            continue;
						}
                        goto sel_1;
					}
					if (cdata[1] == DOWN ) {
						if (curr_record > end){
                            bell(5);
                            continue;
						}
						i += 7;
						if (i > end){
							i = curr_record;
                            bell(5);
                            continue;
						}
					    goto sel_1;
                    }
                    moveto(15,1);
                    putstr_h("输入错误!");
                    bell(5);
                    clsn(15,2);
				}
			}    
        } while(!f);
        
        for (j = start; j <= end; j++)
        {
			libset(j, ID);
			libread(id);
            if (!strncmp(cdata, id, 3)) 
            {
                break;
            }
        }
        if (j > end)
        {
            moveto(15,1);
            putstr_h("未找到该菜!");
            bell(5);
            goto sel_2;
        }
        select_cai(j);
    } while(1);
    return;
}

/* 点菜 */

int select_cai(xdata int record)
{
	xdata uchar id[ID_LEN+1], name[NAME_LEN+1], price[PRICE_LEN+1];
    xdata uchar number[NUMBER_LEN+1], f, cdata[7];
    xdata int num;

    clsn(1,16);
    moveto(15,14);  /* 屏幕定位 */
    putstr("   ");  /* 覆盖屏幕右下角的"123" */
    moveto(1,1);
    putstr("编号: ");
    libset(record, ID);
    libread(id);
    putstr_h(id);
    moveto(3,1);
    putstr("菜名: ");
    libset(record, NAME);
    libread(name);
    putstr_h(name);
    moveto(5,1);
    putstr("单价: ");
    libset(record, PRICE);
    libread(price);
    putstr_h(price);
    libset(record, NUMBER);
    libread(number);
    if (strlen(number) == 0)
    {
        num = 0;
    }
    else
        num = stoi(strlen(number), number);
    if (num != 0)
    {
        moveto(9,1);
        putstr_h("你已经点了");
        putstr_h(number);
        putstr_h("份该菜,要修改吗?\n");
        putstr_h("F1修改,ENTER退出");
        do
        {
            f=key(0);
        }
        while (f != F1 && f != ENTER);
        if (f == ENTER)
        {
            return;
        }
    }
    clsn(7,10);
    do {
        moveto(7,1);
        putstr("请输入数量: ");
		moveto(7,13);
		putstr_h("  ");
		moveto(7,13);
		f=ksh(cdata,0,2,0); /* 等待输入一串字符,只允许是数字,最多2位 */
		if(f==0) {      /* 输入不是数字加确认键 */
			if (cdata[1] == 0) /* 若输入是数值加其它功能键 */
			{
                bell(5);
                continue;
			} else { /* 否则所按第一个键即为功能键 */
				if (cdata[1] == F1 ) {
					
				}
				if (cdata[1] == F2 ) {
					return 1;	                                   
                }
                moveto(15,1);
                putstr_h("输入错误!");
                bell(5);
                clsn(15,2);
			}
		}    
    } while(!f);
    if(cdata[0] == '0') {
        cdata[0] = cdata[1];
        cdata[1] = '\0';
    }
    clsn(9,2);
    moveto(9,1);
    putstr("数量: ");
    putstr_h(cdata);
    libset(record, NUMBER);
    libwrite(cdata);
    moveto(11,1);
    putstr("金额: ");
    strmul(price, cdata, 6);
    putstr_h(cdata);
    moveto(15,1);
    putstr("按任意键继续...");
    key(0);
    return(0);
}

/* 显示点菜结果 */
void disp_select()
{
    xdata uchar type[TYPE+1], id[ID_LEN+1], name[NAME_LEN+1], number[NUMBER_LEN+1], price[PRICE+1];
    xdata uchar cdata[9], money[9], f;
    xdata int num, total_num[4];
    xdata int total_select, end_flag;
    xdata int i, j, curr_record, len;

sel_1:
    end_flag = 0;
    money[0] = '\0';
    total_select = 0;
    for (i=0; i<4; i++) {
        total_num[i] = 0;
    }

    cls();
    moveto(1,4);
    putstr_h("点菜统计");

    for(i = 0; i < total; i++) {
        libset(i, NUMBER);
        libread(number);
        if (strlen(number) == 0)
        {
            num = 0;
        }
        else
            num = stoi(strlen(number), number);
        if (num != 0)
        {
            libset(i, TYPE);

⌨️ 快捷键说明

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