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

📄 dayin.c

📁 单片机应用系统(光盘内容)
💻 C
字号:
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define COM XBYTE [0x7fff]       //8279命令状态地址
#define DAT XBYTE [0x77fF]       //8279数据地址
uchar code table[]={
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,	//0,1,2,3,4,5,6,7
    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71		//8,9,A,B,C,D,E,F
};                              //共阳极数码管显示段码
uchar code tab_head[]={
    0xb1,0xe0,0xba,0xc5,0x20,0x20,0x20,0x20,	//编号+2空格
    0xb5,0xa5,0xbc,0xdb,0x20,0x20,0x20,0x20,	//单价+2空格
    0xca,0xfd,0xc1,0xbf,0x20,0x20,0x20,0x20,	//数量+2空格
    0xd7,0xdc,0xbc,0xc6,0x0a					//总计+换行
};	                             //表头代码
uchar code ASC[]={
    0x30,0x00,0x31,0x00,0x32,0x00,0x33,0x00,	//0~3
    0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,	//4~7
    0x38,0x00,0x39,0x00							//8~9
};	                             //0~9 ASCII码
uchar idata diss[8];            //显示用数据暂存器  8位数据
uchar idata price[10]={			//10种商品的价格表 可以修改
    19,28,37,26,35,44,33,32,21,10
};
uchar idata tab[29]={
    0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,	//编号+2空格
    0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,	//单价+2空格
    0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,	//数量+2空格
    0x20,0x20,0x20,0x20,0x0a					//总计+换行
};
uchar num,quant;				//num为商品号,quant为数量
uint amount;					//商品总价格
uchar step=0;					//处理环节标志位
sbit clflag=ACC^7;              //记录状态字 最高位
sbit led=P1^0;       			//状态指示灯
sbit BUSY=P1^1;					//打印机工作标志位
/*********************函数声明*******************/
void init_T1(void);				//定时器T1初始化程序
uchar keyin(void);				//8279读键号子程序
uchar deky(void);				//8279监测有无按键按下子程序
void disp(uchar idata *d);		//8279显示子程序
void sprint(uchar dat);			//串口向打印机送数据子程序
void ad_tab(void);				//16位数据转换为ASCII码程序
void print(void);				//打印输出程序
void key_num(void);				//商品编号输入环节程序
void key_quant(void);			//商品数量输入环节程序
void key_account(void);			//商品总价计算环节程序
void key_print(void);			//打印环节处理程序

/**********************主函数********************/
main()                          //主函数
{
    uchar i;
    init_T1();					//初始化T1
    COM=0xd1;                   //11010001  总清除命令
    do{ACC=COM;}                //读状态字 直到清除完成
    while (clflag==1);          //读状态字 最高位
    COM=0x00;                   //键盘/显示器工作方式 左端送入8×8显示双键锁定编码扫描
    COM=0x34;                   //时钟分频  20分频
    led=0;            			//默认可以输入商品号
    for (i=0;i<6;i++)
        diss[i]=0;				//在无输入时默认显示0
    disp(diss);                 //送显示
    while (1)
    {
        key_num();				//商品编号输入环节程序
        key_quant();			//商品数量输入环节程序
		key_account();			//商品总价计算环节程序
		key_print();			//打印环节处理程序
    }
}

/******************串口初始化函数****************/
void init_T1(void)
{
    TL1=0xF4; 
	TH1=0xF4;					//波特率为:9600 
    TMOD=0x20;					//串口设置,定时器1,方式2
    SCON=0xd0;					//串口发送方式3
	ET1=0;             			//T1用作波特率发生器,禁止T1中断 
	TR1=1;             			//启动定时器T1
}

/******************串口发送子函数****************/
void sprint(uchar dat)
{
	ACC=dat;
	TB8=P;						//计算奇偶校验位
	while(BUSY);				//查询打印工作状态,如果忙,等待
    SBUF=dat;					//将发送输入送入SBUF
    while(!TI);					//等待发送结束
    TI=0;
}

/******************监测按键子函数****************/
uchar deky(void)				//监测有无按键按下 
{
	uchar k;
	k=COM;						//读状态
	return(k&0x03);				//只监测2行按键 有键返回1 无键返回0
}

/*******************读键号子函数*****************/
uchar keyin(void)				//读键号
{
	uchar j;
	while(deky()==0);			//监测有键按下吗 无键时等待
	COM=0x40;					//读FIFO/传感器RAM  不自动加1  地址为0
	j=DAT;						//读数据
	j=j&0x3f;					//读低6位  D5D4D3为键盘所在列号 D2D1D0为键盘所在行号	
	return(j);					//返回键号
}

/*********************显示子程序******************/
void disp(uchar idata *d)       //显示子程序             
{ 
	uchar j;
	COM=0x90;                   //写显示RAM 自动加1
	for(j=0;j<6;j++)            //
	{
		COM=j+0x80;             //写显示RAM 从0~6地址 此命令可省略 能自动加1
		DAT=table[*d];          //调要显示的数据
		d++;                    //指针加1
	}
}
/****************打印输出字符转换函数**************/
void ad_tab(void)
{
	tab[1]=ASC[2*num];
	tab[2]=ASC[2*num+1];		//将商品编号转换为ASCII码	
	tab[8]=ASC[2*(price[num]/10)];
	tab[9]=ASC[2*(price[num]/10)+1];	
	tab[10]=ASC[2*(price[num]%10)];
	tab[11]=ASC[2*(price[num]%10)+1];//将商品价格转换为ASCII码
	tab[17]=ASC[2*quant];
	tab[18]=ASC[2*quant+1];		//将商品数量转换为ASCII码
	if(diss[3]!=0)
	{
		tab[22]=ASC[2*diss[3]];
		tab[23]=ASC[2*diss[3]+1];
	}
	if(diss[4]!=0)
	{
		tab[24]=ASC[2*diss[4]];
		tab[25]=ASC[2*diss[4]+1];
	}
	if(diss[5]!=0)
	{
		tab[26]=ASC[diss[5]];
		tab[27]=ASC[diss[5]+1];		
	}							//将商品总价格转换为ASCII码
}

/*******************打印程序函数*****************/
void print(void)
{
	uchar j;
	sprint(0x1b);
	sprint(0x38);
	sprint(0x00); 				//调用汉字指令
	for(j=0;j<29;j++)
		sprint(tab_head[j]);	//打印表头
	for(j=0;j<28;j++)
		tab[j]=0x20;
	ad_tab();
	for(j=0;j<29;j++)
		sprint(tab[j]);			//打印清单列表
} 

/*****************商品编号输入函数***************/
void key_num(void)
{
    uchar key;					//i循环变量 key键号暂存器
    while (step==0)
    {
		do{key=keyin();}
        while((key!=0x0b));		//等待商品输入键按下
		do{key=keyin();}
        while((key>=0x0a)&(key!=0x0d));	//若不是取消键或数字键按下,则继续等待
		if (key==0x0d);			//取消键按下时,退出商品输入状态
		else
		{
			diss[0]=key;
			disp(diss);         //将输入商品号送显示
			do{key=keyin();}
			while((key!=0x0c)&(key!=0x0d));	//若不是取消键或确认键按下,则继续等待
			if (key==0x0d)		//取消键按下时,退出商品输入状态
			{
				diss[0]=0;
				disp(diss);    	//数码管恢复为显示0
			}
			else                //确认键按下时
			{
				num=diss[0];            //商品号存于num暂存器中
				diss[0]=price[num]/10;	//商品单价十位送显示缓冲单元
				diss[1]=price[num]%10;	//商品单价个位送显示缓冲单元
				disp(diss); 			//将显示缓冲单元送出显示
				step=1;			//将处理环节标志位设为1
				led=1;			//指示灯亮
			}
        }
    }
}

/*****************商品数量输入函数***************/
void key_quant(void)
{
    uchar i,key;				//i循环变量 key键号暂存器
    while (step==1)				//当处理环节标志位为1时,进入商品数量输入处理
    {
        do{key=keyin();}
        while((key!=0x0d)&(key!=0x0a));	//若不是取消键或商品输入键按下,则继续等待
        if(key==0x0d)			//若按下取消键时返回商品编号输入环节
        {
            step=0;				//将处理环节标志位置为0
			led=0;				//指示灯灭
            for(i=0;i<6;i++)
				diss[i]=0;		//默认显示0
            disp(diss);			//送显示
        }
        else					//是数量设定键
        {
            do{key=keyin();} 
			while((key!=0x0d)&(key>=0x0a));//若不是数字键或取消键则继续等待 
			if (key==0x0d)		//是取消键
			{
				step=0;			//将处理环节标志位置为0
				led=0;			//指示灯灭
				for (i=0;i<6;i++)
					diss[i]=0;	//默认显示0
				disp(diss);		//送显示
			}
			else
			{
				diss[2]=key;
				disp(diss);		//商品数量送出显示
				do{key=keyin();} 
				while((key!=0x0d)&(key!=0x0c));//若不是取消键或确认键按下则继续等待
				if(key==0x0d)	//取消输入的商品数量
				{
					diss[2]=0;    
					disp(diss);  
				}
				else			//是确认键按下
				{   
					quant=diss[2];//将商品数量送出显示
					step=2;		//环节标志位置为2
				}
			}
		}			
	}	
}

/*****************商品总价计算环节程序***************/
void key_account(void)
{
	uchar key;					//key键号暂存器
	while(step==2)
	{
		do{key=keyin();}
        while((key!=0x0d)&(key!=0x0e));	//若不是取消键或总价键按下,则继续等待
		if(key==0x0d)			//取消键按下
		{
			step=1;				//退回到商品数量输入环节
			diss[2]=0;			//将商品数量显示为置0
			quant=diss[2];		//将商品数量存储单元置0
			disp(diss);			//送显示
		}
		else					//总价键按下
		{
			amount=quant*price[num];//计算总价格
			diss[3]=amount/100;		//总价格百位
			diss[4]=amount%100/10;	//总价格十位
			diss[5]=amount%10;	//总价格个位
			disp(diss);         //送显示
			step=3;				//环节标志位置为3
		}
	}
}

/*******************商品打印函数*****************/
void key_print(void)
{
	uchar i,key;				//i循环变量 key键号暂存器
	while(step==3)
	{
		do{key=keyin();}
        while((key!=0x0d)&(key!=0x0f));//若不是取消键或打印键按下,则继续等待
		if(key==0x0d)			//取消键按下
		{
			step=2;				//退回到商品数量输入环节
			diss[3]=0;			//总价格百位清0			
			diss[4]=0;			//总价格十位清0
			diss[5]=0;			//总价格个位清0			
			amount=0;			//总价格存储单元清0
			disp(diss);			//送显示
		}
		else print();			//完成打印
		do{key=keyin();}
		while(key!=0x0d);		//若不是取消键按下,则继续等待
		for(i=0;i<6;i++)
			diss[i]=0;			//在无输入时默认显示0
		disp(diss); 
		step=0;					//处理环节标志位置为0
		led=0;					//状态位设为0  取消输入
	}
}

⌨️ 快捷键说明

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