📄 dayin.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 + -