📄 计价器存储.c
字号:
#include <AT89X51.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define addwr 0xa0
#define addrd 0xa1
unsigned char code duanma[]={0x3f,0x06,0x5b,0x4f, //定义段码
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x40,0x00,0xbf,0x86,
0xdb,0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef};
unsigned char weima[]={0xfe,0xfd,0xfb,0xf7, //定义扫描位码
0xef,0xdf,0xbf,0x7f};
uchar shijian[8]={0,0,16,0,0,16,0,0}; //时间存储单元
unsigned char lucheng[8]={0,0,18,0,16,0,18,0}; //路程存储单元
uchar jiage[8]={2,19,17,0,19,17,5,20} ; //价格存储单元
uchar zongjia[8]={0,18,17,17,17,0,18,0} ; //总价存储单元
uchar mima[8]={16,16,16,16,16,16,16,16} ; //输密码存储单元
uchar mima1[8]={1,2,3,4,5,6,7,8}; //原始密码存储单元
uchar lu,x,y,cuo=0,hour1,w=0,m=0,n; //定义相关变量
int i;
uchar dis;
char second;
char minite,minite2;
char hour;
uint tcnt,tcnt2,tcnt3;
uchar ms,a,c,jia;
sbit k0=P1^0;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit sda=P1^7;
sbit scl=P1^6;
sbit wp=P1^5;
sbit led=P1^4;
sbit res=P3^0;
bit k=0;
delay(int t) //延时子程序
{
int s,e;
for(s=0;s<t;s++)
for(e=0;e<100;e++);
}
void mdelay(uchar j)
{
uint i;
for(;j>0;j--)
{
for(i=0;i<125;i--)
{;}
}
}
void start(void)
{
sda=1;
scl=1;
_nop_();_nop_();_nop_();_nop_();
sda=0;
_nop_();_nop_();_nop_();_nop_();
}
void stop(void)
{
sda=0;
scl=1;
_nop_();_nop_();_nop_();_nop_();
sda=1;
_nop_();_nop_();_nop_();_nop_();
}
void ack(void)
{
sda=0;
_nop_();_nop_();_nop_();_nop_();
scl=1;
_nop_();_nop_();_nop_();_nop_();
scl=0;
}
void noack(void)
{
sda=1;
_nop_();_nop_();_nop_();_nop_();
scl=1;
_nop_();_nop_();_nop_();_nop_();
scl=0;
}
void send(uchar Data)
{
uchar bitcounter=8;
uchar temp;
do
{
temp=Data;
scl=0;
_nop_();_nop_();_nop_();_nop_();
if((temp&0x80)==0x80)
sda=1;
else
sda=0;
scl=1;
temp=Data<<1;
Data=temp;
bitcounter--;
}while(bitcounter);
scl=0;
}
uchar read(void)
{
uchar temp=0;
uchar temp1=0;
uchar bitcounter=8;
sda=1;
do
{
scl=0;
_nop_();_nop_();_nop_();_nop_();
scl=1;
_nop_();_nop_();_nop_();_nop_();
if(sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(bitcounter-1)
{
temp1=temp<<1;
temp=temp1;
}
bitcounter--;
}while(bitcounter);
return(temp);
}
void wrtorom(uchar Data[],uchar address,uchar num)
{
uchar i;
uchar *pData;
pData=Data;
for(i=0;i<num;i++)
{
start();
send(0xa0);
ack();
send(address+i);
ack();
send(*(pData+i));
ack();
stop();
mdelay(20);
}
}
void rdfromrom(uchar Data[],uchar address,uchar num)
{
uchar i;
uchar *pData;
pData=Data;
for(i=0;i<num;i++)
{
start();
send(0xa0);
ack();
send(address+i);
ack();
start();
send(0xa1);
ack();
*(pData+i)=read();
scl=0;
noack();
stop();
}
}
yijian() //一键是否按下子程序
{
char q=0;
if(k0==0)
{
delay(2);
if(k0==0)
{
q=1;
while(1) if(k0==1) break;
}
}
return q;
}
erjian() //二键是否按下子程序
{
char q=0;
if(k1==0)
{
delay(2);
if(k1==0)
{
q=1;
while(1) if(k1==1) break;
}
}
return q;
}
shangjian() //三键是否按下子程序
{
char q=0;
if(k2==0)
{
delay(2);
if(k2==0)
{
q=1;
while(1) if(k2==1) break;
}
}
return q;
}
kaiguan() //白天晚上转换开关
{
char q=0;
if(k3==0)
{
delay(2);
if(k3==0)
{
q=1;
}
}
return q;
}
mi() //输入密码子程序
{
char h; //定义局部变量
if(w==1) //检测是否已经输错三次
{goto loop;} //错三次跳到程序最后
a=5; //显示模块开关
for(i=7;i>=0;i--) //循环八次
{
while(1)
{
if(shangjian()==1) //三键按下,数据减1
{
mima[i]--;
if(mima[i]<0|mima[i]>9) mima[i]=9;
}
if(erjian()==1) //二键按下,数据加1
{
mima[i]++;
if(mima[i]>9) mima[i]=0;
}
if(yijian()==1) //一键按下,移到下一位
break;
}
}
for(i=0;i<=7;i++) //循环核对密码
if(mima[i]!=mima1[i]) break;
if(i<=7) //检查是否对8次
{
cuo++; //错误次数加1
if(cuo>=3) //错误次数到3清0并不允许再输入
{
cuo=0;
w=1;
}
h=0;
}
else h=1;
for(i=7;i>=0;i--) //输完后数据清除
{
mima[i]=16;
}
loop:if(w==1) return 0; //错三次,返回0
return h;
}
gaimi() //改密码子程序
{
if(w==1) //判断是否已错三次
{goto loop;}
if(mi()==1) //进入输密码子程序
{
a=6; //改密码显示开关
for(i=7;i>=0;i--) //循环8次改变密码数据
{
while(1)
{
if(shangjian()==1) //三键按下,数据减1
{
mima1[i]--;
if(mima1[i]<0|mima1[i]>9) mima1[i]=9;
}
if(erjian()==1)
{
mima1[i]++;
if(mima1[i]>9) mima1[i]=0;
}
if(yijian()==1)
break;
}
}
}
loop:if(w==1) return 0; //错三次,返回0
}
tiaoshi() //调时间子程序
{
if(w==1)
goto loop;
k=1; //停止计时
for(i=7;i>0;i=i-3) //对时、分、秒进行循环
{
while(1)
{
if(erjian()==1) //二键按下,加1
{
if(i==7) //调整时间部分
{
hour++; //小时加1
if(hour==24)
hour=0;
}
if(i==4) //调整分钟部分
{
minite++; //分钟加1
if(minite==60)
minite=0;
}
if(i==1) //调整秒钟部分
{
second++; //秒加1
if(second==60)
second=0;
}
}
if(shangjian()==1) //三键按下,减1
{
if(i==7)
{
hour--;
if(hour<0)
hour=23;
}
if(i==4)
{
minite--;
if(minite<0)
minite=59;
}
if(i==1)
{
second--;
if(second<0)
second=59;
}
}
if(yijian()==1) break; //一键按下,移到下一位
}
if(yijian()==1) break; //跳出循环,显示时间
}
k=0; //开始计时
loop:;
}
jijia()
{
EX1=1; //开计数器1
a=1; //计价单元显示
while(1)
{
if(yijian()==1) //按下一键,每过10秒循环显示路程和总价
{
a=3;
}
if(erjian()==1) //按下二键,暂停/开始
{
EX1=~EX1;
}
if(shangjian()==1) //按下三键,停止
{
k=~k;
if(k==1) //第一次按下,停止计价
{
EX1=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -