📄 最终程序.c
字号:
j=1;
j=j<<i; //由高到低位传输数据
k=X&j;
if(k==0) //如果相应位是0则置零,反之亦然
dio7289=0;
else
dio7289=1;
clk7289=1; //以下产生时钟信号
for(delay=0;delay<5;delay++) ; // 延时 10us
clk7289=0;
for(delay=0;delay<5;delay++) ; // 延时 10us
}
dio7289=0;
}
short receive() //从7289接收按键值子程序
{
short i,X=0;
dio7289=1; //使端口处于可接收数据状态
for(delay=0;delay<25;delay++); // 延时 50us
for(i=0;i<=7;i++)
{
clk7289=1;
for(delay=0;delay<4;delay++); // 延时 10us
X=X<<1;
if(dio7289)
X++;
clk7289=0;
for(delay=0;delay<4;delay++); // 延时 10us
}
dio7289=0;
return(X);
}
void keyin(void) interrupt 0 using 0 // 中断 0 服务程序
{
char i;
long int y;
send7289(0x15); // 接收数据
Key=receive();
cs7289=1;
Key=Key&0x1f;
switch(Key)
{
case 0xf : {
zongjia=zongjia+jine;
qingdan[qb][0]=sh;
qingdan[qb][1]=danjia[sh];
qingdan[qb][2]=shizhong;
qingdan[qb][3]=jine;
qb++;
sh=0;
dot=0;
danjia[0]=0;
for(i=0;i<6;i++)
jiage[i]=0;
} break; // 累加键
case 0xe : pizhong=zhongliang; break; // 去当前皮重键
case 0xd : {danjia[sh]=0;dot=0;} break; // 重写键
case 0xc : {
zongjia=0;
jine=0;
dot=0;
list=0;
qb=0;
pizhong=0;
if(sh==0)
danjia[sh]=0;} break; // 总清键
case 0xa : dot=1;break; // 小数点键
case 0xb : list=1;break; // 清单显示键
case 0x19 : sh=10;break; //以下是商品键
case 0x18 : sh=9;break;
case 0x17 : sh=8;break;
case 0x16 : sh=7;break;
case 0x15 : sh=6;break;
case 0x14 : sh=5;break;
case 0x13 : sh=4;break;
case 0x12 : sh=3;break;
case 0x11 : sh=2;break;
case 0x10 : sh=1;break;
case 0x1f : Key=0x1f;break;//向下翻页
case 0x1e : Key=0x1e;break;//向上翻页
case 0x1d : Key=0x1d;break;//显示清单时按此键显示总额等
case 0x1c :
case 0x1a : break; //确定键
default : {
if(dot==0)
{
jiage[0]=jiage[1];
jiage[1]=jiage[2];
jiage[2]=Key;
}
if(dot==1)
{
jiage[4]=Key;
dot++;
}
else if(dot==2)
{
jiage[5]=Key;
dot++;
}
else if(dot>2) break;
lcdi_send(0x84);// 显示程序
for(i=0;i<6;i++)
lcdd_send(jiage[i]);
y=jiage[0];
y=y*10+jiage[1];
y=y*10+jiage[2];
y=y*10+jiage[4];
danjia[sh]=y*10+jiage[5];
}
}
while(key7289==0); // 等待键盘松开
}
//AD 相关子程序
unsigned long int ad_max187(void) //MAX187 12位AD操作程序
{
unsigned int result;
unsigned char hbyte,lbyte, i;//hbyte存放高字节,lbyte存放低字节
ad_delay(); //上电延时等待进入工作状态
ad_CS = 0; //低电平有效,开始转换
while(ad_DOUT==0); //等待转换完成,因为DOUT会以一个高电平来标志转换完成
hbyte=0; //清空高字节
ad_SCLK = 1; //产生时钟下降沿
ad_SCLK = 0;
//开始读数据
for(i=0;i<=4;i++) //将转换后的数据高4位存入hbyte
{
ad_SCLK = 1; //SCLK置为高电平,可读取DOUT
if(ad_DOUT==1)//若DOUT为1
hbyte|=(1<<(3-i)); //将hbyte中的相应位置1
ad_SCLK = 0;//产生下降沿,更新DOUT上的数据
ad_SCLK = 0;
}
lbyte = 0;// 清空低字节
for(i=0;i<=7;i++) //将转换后的数据高4位存入hbyte
{
ad_SCLK = 1; // SCLK置为高电平,可读取DOUT
if(ad_DOUT==1) // 若DOUT为1
lbyte|=(1<<(7-i)); //将lbyte中的相应位置1
ad_SCLK = 0; // 产生下降沿,更新DOUT上的数据
ad_SCLK = 0;
}
ad_CS = 1;//结束AD转换
result=(unsigned int)(hbyte<<8)|lbyte;//合并
return(result);//返回12为AD值
}
void ad_delay(void) //延时,20ms@12MHz
{
unsigned char i,j;
for(i=1;i<=100;i++)
for(j=1;j<=50;j++)
{}
}
void d_change(long X) //将数据转换成字符串
{
char bai,shi,ge,shifen,baifen,qianfen;
long int yu;
if(X>160000)
baojing();
bai =X/100000;
yu=X%100000;
shi=yu/10000;
yu=yu%10000;
ge=yu/1000;
yu=yu%1000;
shifen=yu/100;
yu=yu%100;
baifen=yu/10;
qianfen=yu%10;
bai+=0x30; //将数字转换成相应的ASCII 码值
shi+=0x30;
ge+=0x30;
shifen+= 0x30;
baifen+=0x30;
qianfen+=0x30;
if(bai==0x30) //如果数字的高位上为0,则应转换成空格,但个位是0不可省
{
bai=0x20;
if(shi==0x30)
shi=0x20;
}
shuju[0]=bai; //转换以后存入字符串里
shuju[1]=shi;
shuju[2]=ge;
shuju[3]= '.';
shuju[4]=shifen;
shuju[5]=baifen;
shuju[6]=qianfen;
}
void d_change1(long X)
{
char qian,bai,shi,ge,shifen,baifen;
long int yu;
qian=X/100000;
yu=X%100000;
bai=yu/10000;
yu=yu%10000;
shi=yu/1000;
yu=yu%1000;
ge=yu/100;
yu=yu%100;
shifen=yu/10;
baifen=yu%10;
qian=qian+0x30;
bai=bai+0x30;
shi=shi+0x30;
ge=ge+0x30;
shifen=shifen+0x30;
baifen=baifen+0x30;
if(qian==0x30)
{
qian=0x20;
if(bai==0x30)
{
bai=0x20;
if(shi==0x30)
shi=0x20;
}
}
shuju[0]=qian;
shuju[1]=bai;
shuju[2]=shi;
shuju[3]=ge;
shuju[4]='.';
shuju[5]=shifen;
shuju[6]=baifen;
}
void baojing() //超重后报警
{
short i;
for(i=0;i<50;i++)
{
baoj=0;
for(delay=0;delay<10;delay++);
baoj=1;
for(delay=0;delay<10;delay++);
}
}
unsigned long zhenshizhi(unsigned long celiang) //根据测量值自动选择量程,并得到真实值子程序
{
unsigned long int real;
int aa=lcxz;
switch(aa)
{case 1:
{
if(celiang>=4000)
{
lcxz=0;
ad_delay();
celiang=ad_max187();
real=celiang*40;
}
else
{
real=celiang;
}
}break;
case 0:
{
if(celiang<=100)
{
lcxz=1;
ad_delay();
celiang=ad_max187();
real=celiang;
}
else if(celiang>=4000)
{
baijing();
}
else
{
real=celiang*40;
}
}break;
}
return(real);
}
// 初始页面
void ini() // 输入收银员编号 , 日期
{
short i=0,j;
char X;
lcdi_send(0x80); // 提示输入收银员编号
while(message1[i])
lcdd_send(message1[i++]);
for(i=8;i<12;i++)
{
while(key7289); //等候按键输入
send7289(0x15); // 接收数据
X=receive(); //将键值存放到X中
cs7289=1;
bianhao[i]=X+0x30; //转换为ASCII码
lcdi_send(0x93);
for(j=8;j<16;j++)
lcdd_send(bianhao[j]);
while(key7289==0); //等待,直到释放按键
}
lcdi_send(0x88); // 提示输入日期
i=0;
while(message2[i])
lcdd_send(message2[i++]);
for(i=0;i<10;i++) // 输入日期
{
if(i==4||i==7) i++;
while(key7289==1); //等候按键输入
send7289(0x15); // 接收数据
X=receive();
cs7289=1;
riqi[i]=X+0x30;
j=0;
lcdi_send(0x9a);
for(j=0;j<10;j++)
lcdd_send(riqi[j]);
while(key7289==0); //等待,直到释放按键
}
while(key7289);
nop1();
while(key7289==0);
nop1();
lcdi_send(0x1);// 初始化第一页显示完毕后
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -