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

📄 计价器存储.c

📁 刚学时编的小程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -