📄 最终程序.c
字号:
#include<reg52.h>
#include<absacc.h>
#include<stdio.h>
//以下是端口分配
//ad 控制线
sbit ad_SCLK=P2^1; //MAX187时钟
sbit ad_DOUT=P2^2; //MAX187数据输出
sbit ad_CS=P2^3; //MAX187片选
sbit baoj=P1^6; // 报警端口
sbit lcxz=P1^7; //量程选择控制端:低电平是大量程,高电平是小量程。
//lcd 控制线
sbit lcd_di=P1^0; //数据、指令选择端(高电平收数据,低电平接收指令)
sbit lcd_rw=P1^1; //读写控制端(高电平读,低电平写)
sbit lcd_e=P1^2; //片选信号端,使能端(高电平有效)
//7289 控制线
sbit cs7289=P1^3; //7289 片选线
sbit clk7289=P1^4; //7289 时钟信号
sbit dio7289=P1^5; //7289 的输入端
sbit key7289=P3^2; //7289 中断方式
//以下是被调用函数声明
//7289 子程序
void ini_7289(void); //7289初始化子程序
void send7289(short); //向7289发送数据子程序
short receive(void); //从7289接收按键值子程序
void keyin(void); //7289键值判断子程序
//lcd 子程序
void ini_lcd(void); //lcd初始化子程序
void lcdd_send(short);//lcd数据输出子程序
void lcdi_send(short); // lcd命令输出子程序
void chk_busy(void); // 检测BF端子程序
//ad 子程序
unsigned long int ad_max187(void);//接收ad_max187数据子程序
void ad_delay(void);//延时
void baojing(void);// 报警子程序
void d_change(long);//重量数据转换为字符串子程序
void d_change1(long) ;//金额单价总额等数据转换为字符串子程序
unsigned long zhenshizhi(unsigned long celiang) ;//根据测量值自动选择量程,并得到真实值
// 初始化,编号,日期
char xdata shuju[7]=""; //所测数据转换成字符串后存放的地方
void ini();//页面初始化子程序
void nop1()//空操作
{}
void change(char s[16]) //字符串整合子程序
{
char danwei[3];
danwei[0]=s[6];
danwei[1]=s[7];
danwei[2]= '\0';
s[6]=shuju[0];
s[7]=shuju[1];
s[8]=shuju[2];
s[9]=shuju[3];
s[10]=shuju[4];
s[11]=shuju[5];
s[12]=shuju[6];
s[13]=danwei[0];
s[14]=danwei[1];
s[15]=danwei[2];
}
//以下是全局变量声明
char Key;//键值
int delay; // 全局变量
short sh=0; // 商品号
short dot=0; // 小数点标志
bit list=0; //标志是否显示清单
short qb=0; // 记录商品数目
char xdata s1[16]="单价:元";
char xdata s2[16]="重量:Kg";
char xdata s3[16]="金额:元";
char xdata s4[16]="累计:元";
char code message0[16]="——欢迎使用——";
char code message1[16]="输入收银员代号:";
char code message2[16]=" 输入日期:";
char code message3[16]="华北科技学院";
char code message4[16]="华信公司欢迎您!";
char xdata bianhao[16]="收银员:";
char xdata riqi[16]=" - - ";
long int xdata zongjia=0,jine=0,jine1=0;
unsigned long int xdata shizhong=0,pizhong=0,zhongliang=0,pizhong1=0,zhongliang1=0;
long int xdata qingdan[20][4];
char code shangpin[11][4]={{"单价"},{"苹果"},{"梨"},{"花生"},{"大米"}, {"桃子"},{"塑料"},{"瓜子"},{"桔子"},{"香蕉"},{"玉米"}};
long int xdata danjia[11]=
{1000,2000,3635,5502,6660,3320,5502,660,3210,6600,5600}; //价格是原始价格的1000倍,后面回除以1000
char xdata jiage[6]={ 0x0,0x0,0x0,'.',0x0,0x0}; // 0.00
short xdata xiuzheng[]={0,2,5,6,7,8,9,12,13}; //可作为修正值使用
//****************************************************
//主函数
main()
{
short i,j;
long int x;
int y;
int xdata duilie[3]={0};
lcxz=0; //初始设定电子秤工作在大量程状态
P1=0xff;
ini_lcd(); // 初始化 LCD
lcdi_send(0x8a);
while(message0[i])
lcdd_send(message0[i++]);
ini_7289(); // 初始化 7289
pizhong1 = ad_max187();
pizhong = zhenshizhi(pizhong1);
lcdi_send(0x1); //清 屏
ini(); // 初始页面 , 收银员编号,日期
lcdi_send(0x1); //清 屏
EA=1;EX0=1; // 开中断
EX1=1;
ad_CS=1;
while(1)
{
if(list)
{
lcdi_send(0x80); // 显示设计者所在单位名称
for(i=0;i<16;i++)
lcdd_send(message3[i]);
x=qingdan[0][0]; // 商品名 单价
for(i=0;i<4;i++)
s1[i]=shangpin[x][i];
x=qingdan[0][1];
d_change1(x);
change(s1);
lcdi_send(0x90);
for(i=0;i<16;i++)
lcdd_send(s1[i]);
x=qingdan[0][2]; // 显示重量
d_change(x);
change(s2);
if(s2[8]==32)
s2[8]=0x30; //如果个位为空格,转为0
lcdi_send(0x88);
for(i=0;i<16;i++)
lcdd_send(s2[i]);
x=qingdan[0][3];//显示金额
d_change1(x);
change(s3);
lcdi_send(0x98);
for(i=0;i<16;i++)
lcdd_send(s3[i]);
// 以上为第一页
EA=0;EX0=0; // 关键盘中断
for(j=1;j<qb;)
{
while(key7289); //等待键盘输入
if(Key==0x1f) //向下翻页
j++;
else if(Key==0x1e) //向上翻页
j--;
if(j==0) //若已经翻到第一页,不可再向上翻页
j=1;
x=qingdan[j][2];
d_change(x); // 显示重量数据
change(s2);
if(s2[8]==32)
s2[8]=0x30;
lcdi_send(0x90);
for(i=0;i<16;i++)
lcdd_send(s2[i]);
x=qingdan[j][1];
d_change1(x);
change(s1);
x=qingdan[j][0];
for(i=0;i<4;i++)
s1[i]=shangpin[x][i];
lcdi_send(0x80);
for(i=0;i<16;i++)
lcdd_send(s1[i]);
x=qingdan[j][3];
d_change(x);
change(s3);
lcdi_send(0x88);
for(i=0;i<16;i++)
lcdd_send(s3[i]);
lcdi_send(0x98);
for(i=0;i<16;i++)
lcdd_send(0x20);
lcdi_send(0x98);
while(key7289==0);
}
while(key7289);
d_change1(zongjia);
change(s4);
lcdi_send(0x80);
for(i=0;i<16;i++)
lcdd_send(s4[i]);
lcdi_send(0x90);
for(i=0;i<16;i++)
lcdd_send(bianhao[i]);
lcdi_send(0x88);
for(i=0;i<16;i++)
lcdd_send(message4[i]);
lcdi_send(0x98);
for(i=0;i<16;i++)
lcdd_send(riqi[i]);
list=0;
while(key7289==0);
while(key7289==1);
while(key7289==0);
EA=1;
EX0=1;
}
else
{
y=0;
duilie[2]=duilie[1]; // 数字滤波
duilie[1]=duilie[0];
y=ad_max187();
duilie[0]=y>>1;
x=duilie[0];
x=x<<1;
x=x+duilie[1]+duilie[2];
zhongliang1=ad_max187();
zhongliang = zhenshizhi(zhongliang1);
shizhong=zhongliang-pizhong; // 数据转换
x=danjia[sh];
jine1=shizhong*x;
jine=jine1/1000; //省去0.01元以后的值
d_change(shizhong); // 显示数据
change(s2);
if(s2[8]==32)
s2[8]=0x30;
lcdi_send(0x90);
for(i=0;i<16;i++)
lcdd_send(s2[i]);
d_change1(danjia[sh]);
change(s1);
for(i=0;i<4;i++)
s1[i]=shangpin[sh][i];
lcdi_send(0x80);
for(i=0;i<16;i++)
lcdd_send(s1[i]);
d_change1(jine);
change(s3);
lcdi_send(0x88);
for(i=0;i<16;i++)
lcdd_send(s3[i]);
d_change1(zongjia);
change(s4);
lcdi_send(0x98);
for(i=0;i<16;i++)
lcdd_send(s4[i]);
lcdi_send(0x98);
while(1); //等待中断
}
}
}
//LCD相关子程序
void ini_lcd() //LCD 初始化子程序
{
lcdi_send(0x30);//功能设定指令
lcdi_send(0x1); // 总清
lcdi_send(0xc);//显示状态
lcdi_send(0x2); // 光标右移, AC+1
}
void lcdd_send(short X) //LCD 发送数据子程序
{
chk_busy(); //检测BF是否满
nop1();
lcd_di=1; //端口初始化
lcd_rw=0;
lcd_e=1;
P0=X; //发送
for(delay=0;delay<5;delay++);// 延时等待输出完毕
lcd_e=0; //关闭
X=X;
P0=0xff; //使P0口处于可直接输入状态
}
void lcdi_send(short X) //LCD 发送指令子程序
{
chk_busy(); //检测BF是否满
nop1();
lcd_di=0; //端口初始化
lcd_rw=0;
lcd_e=1;
P0=X; //发送
for(delay=0;delay<5;delay++);//延时等待输出完毕
lcd_e=0;
X=X; //关闭
P0=0xff; //使P0口处于可直接输入状态
}
void chk_busy()
{
short i=0xff; //定义一个检测变量
while(i&0x80)
{
lcd_di=0; //端口初始化
lcd_rw=1;
lcd_e=1;
i=P0; //读值
lcd_e=0; //关闭
}
}
//7289子相关程序
void ini_7289() //7289 初始化子程序
{
short i;
cs7289=1;
key7289=1;
dio7289=1;
for(i=0;i<50;i++)
for(delay=0;delay<150;delay++); // 延时 25ms
send7289(0xa4); //复位 指令
cs7289=1;
}
void send7289(short X) //向7289发送数据子程序
{
short i,j,k;
cs7289=0;
for(delay=0;delay<25;delay++); // 延时 50us
for(i=7;i>=0;i--)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -