模拟售货系统

基于STC89C52芯片控制。

功能图

在这里插入图片描述

1. 数码管显示

【程序功能】: 三种工作模式
			 一、01-商品编号(XX)-商品价格(XX)
			 二、02-商品编号(XX)-商品数量(XX)
			 三、03--商品价格(XXX.X)
			 使用四个独立按键实现商品编号、商品数
			 量、工作模式的变化
下面展示部分代码片
*****************************************************/
#include<reg52.h>
#include<intrins.h>

typedef unsigned int uint;
typedef unsigned char uchar;
#define At24c02ADDR 0xA0 	   //器件地址(EEPROM)
#define I2cWrite 0 	  //方向位  写
#define I2cRead 1 	  //方向位	 读

bit ACKFlag; 	//应答标志位
bit flag=0;		//返回标志
bit flash=0;	//闪烁标志
bit beep=0;     //蜂鸣器标志
uint time=0;	//计时单位
uint choose=1;	//选择阶段
uint num=1;		//商品编号
uint number=1;	//商品数量
uint sum;   	//商品总价

sbit SDA=P2^0;  //数据接口
sbit SCL=P2^1;	//时钟接口
sbit buzzer=P2^3; //蜂鸣器
sbit du=P2^6;	  //段选
sbit we=P2^7;	  //位选
sbit key_s2=P3^0; //s2按键
sbit key_s3=P3^1; //s3按键
sbit key_s4=P3^2; //s4按键
sbit key_s5=P3^3; //s5按键

uchar price[]={0,33,5,75,99,62,86,10,49,   //商品价格  省略小数点
				  50,40,84,8,15,19,66,90};//如价格:9.0 
uchar code SMGdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
				  0x7d,0x07,0x7f,0x6f,0x40};  	//段选(0-9、-)
uchar code SMGwe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};	  //位选8位	SMGwe[1]--SMGwe[8]
int main()
{
	num=At24c02Read(10);	//读取内存的位置10的数据赋给num
	Time0Init();		//定时器0初始化
	while(1)
	{
		display();		//数码管显示
		switch(choose)	//不同模式按键判断
		{
			case 1:if(key_s2==0)
				   {
				   		delay(5);	
				   		if(key_s2==0)
						{
							num++;	 //商品编号+1
						}
				   }while(!key_s2);
				   if(key_s3==0)
				   {
				   		delay(5);	
				   		if(key_s3==0)
						{
							num--;	 //商品编号-1
						}
				   }while(!key_s3);
				   if(key_s4==0)
				   {
				   		delay(5);	
				   		if(key_s4==0)
						{
							num=1;	 //商品编号置1
						}
				   }while(!key_s4);
				   if(key_s5==0)
				   {
				   		delay(5);	
				   		if(key_s5==0)
						{
							choose=2;	 //进入第二种工作模式
						}
				   }while(!key_s5);break;
			case 2:if(key_s2==0)
				   {
				   		delay(5);	
				   		if(key_s2==0)
						{
							number++;	 //商品数量+1
						}
				   }while(!key_s2);
				   if(key_s3==0)
				   {
				   		delay(5);	
				   		if(key_s3==0)
						{
							number--;	 //商品数量-1
						}
				   }while(!key_s3);
				   if(key_s4==0)
				   {
				   		delay(5);	
				   		if(key_s4==0)
						{
							choose=1;	 //回到第一种工作模式
						}
				   }while(!key_s4);
				   if(key_s5==0)
				   {
				   		delay(5);	
				   		if(key_s5==0)
						{
							choose=3;	 //进入第三种工作模式
						}
				   }while(!key_s5);break;
			case 3:if(key_s4==0)
				   {
				   		delay(5);	
				   		if(key_s4==0)
						{
							sum=0;		//总价清理
							flag=1;	    //返回标志
						}
				   }while(!key_s4);
				   if(key_s5==0)
				   {
				   		delay(5);	
				   		if(key_s5==0)
						{
							time=0;		//时间清零
							flash=1;	//闪烁标志
						}
				   }while(!key_s5);break;
		}
		At24c02Write(10,num); //将num数值存入内存中的位置3
	}
}

2.LCD1602显示

【程序功能】: 三种工作模式
			 一、01-商品编号(XX)-商品价格(X.X)
			 二、02-商品编号(XX)-商品数量(XX)
			 三、03--商品价格(XXX.X)
			 使用四个独立按键实现商品编号、商品数
			 量、工作模式的变化
下面展示部分代码片
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

#define At24c02ADDR 0xA0 	   //器件地址(EEPROM)
#define I2cWrite 0 	  //方向位  写
#define I2cRead 1 	  //方向位	读

bit ACKFlag; 	//应答标志位
bit flag=0;		//返回标志
bit flash=0;	//闪烁标志
bit beep=0;     //蜂鸣器标志
uint time1=0;	//计时单位
uint choose=1;	//选择阶段
uint num=1;		//商品编号
uint number=1;	//商品数量
uint sum;   	//商品总价

sbit TSCLK=P1^0; //时钟端
sbit TIO=P1^1;	 //数据端
sbit TRST=P1^2;	 //使能端
sbit SDA=P2^0;  //数据接口
sbit SCL=P2^1;	//时钟接口
sbit buzzer=P2^3; //蜂鸣器 	
sbit key_s2=P3^0; //s2按键
sbit key_s3=P3^1; //s3按键
sbit key_s4=P3^2; //s4按键
sbit key_s5=P3^3; //s5按键
sbit RS=P3^5;	 //数据/命令选择端
sbit RW=P3^6;	 //读/写选择端
sbit EN=P3^4;	 //使能信号
uchar price[]={0,33,5,75,99,62,86,10,49,   //商品价格  省略小数点
				  50,40,84,8,15,19,66,90};//如价格:9.0 
uchar time[5]={20,8,15,13,30};//设置初始时间  年、月、日、时、分
void main()
{
	DS1302Init();	  //DS1302初始化配置
	Time0Init();		//定时器0初始化
//----------------------------------------------------------
	num=At24c02Read(6);	//读取内存位置6的数据赋给num
//----------------------------------------------------------	
	Write_order(0x38);//设置16*2显示
	Write_order(0x0c);//开显示 显示光标 光标闪烁
	Write_order(0x01);//清屏
	Write_order(0x06);//地址指针移位命令
	while(1)
	{
		time[0]=At24c02Read(2); //读取内存位置1的数据赋给time[0]

		Timer();	//时间读取
		delay(10);
		Write_Dat(0,0,time[0]);	//年
		Write_Str(2,0,'-');
		Write_Dat(3,0,time[1]);	//月
		Write_Str(5,0,'-');
		Write_Dat(6,0,time[2]);	//日
//----------------------------------------------------------
		Write_Dat(9,0,time[3]);	//时
		Write_Str(11,0,':');
		Write_Dat(12,0,time[4]);//分
//----------------------------------------------------------			
		Write_String(0,1,"Mode:");
		switch(choose)	  //三种状态显示
		{
			case 1:	Write_Dat(6,1,choose);
					Write_Str(8,1,'-');
					Write_Dat(9,1,num);
					Write_Str(11,1,'-');
					Write_Dat1(12,1,price[num]/10);
					Write_Str(13,1,'.');
					Write_Dat1(14,1,price[num]%10);break;
			case 2:	Write_Dat(6,1,choose);
					Write_Str(8,1,'-');
					Write_Dat(9,1,num);
					Write_Str(11,1,'-');
					Write_Dat(12,1,number);
					Write_Str(14,1,' ');
					break;
			case 3:	Write_Dat(6,1,choose);
					Write_Str(8,1,'-');
					Write_Str(9,1,'-');
					if(time1<=20)	   //显示总价
					{
						Write_Dat(10,1,sum/100);
						Write_Dat1(12,1,sum%100/10);
						Write_Str(13,1,'.');
						Write_Dat1(14,1,sum%10);
					}
					else
					{				   //不显示总价
						Write_Str(10,1,' ');
						Write_Str(11,1,' ');
						Write_Str(12,1,' ');
						Write_Str(13,1,' ');
						Write_Str(14,1,' ');
					}break;
		}
		switch(choose)	//不同模式按键判断
		{
			case 1:if(key_s2==0)
				   {
				   		delay(5);	
				   		if(key_s2==0)
						{
							num++;	 //商品编号+1
						}
				   }while(!key_s2);
				   if(key_s3==0)
				   {
				   		delay(5);	
				   		if(key_s3==0)
						{
							num--;	 //商品编号-1
						}
				   }while(!key_s3);
				   if(key_s4==0)
				   {
				   		delay(5);	
				   		if(key_s4==0)
						{
							num=1;	 //商品编号置1
						}
				   }while(!key_s4);
				   if(key_s5==0)
				   {
				   		delay(5);	
				   		if(key_s5==0)
						{
							choose=2;	 //进入第二种工作模式
						}
				   }while(!key_s5);break;
			case 2:if(key_s2==0)
				   {
				   		delay(5);	
				   		if(key_s2==0)
						{
							number++;	 //商品数量+1
						}
				   }while(!key_s2);
				   if(key_s3==0)
				   {
				   		delay(5);	
				   		if(key_s3==0)
						{
							number--;	 //商品数量-1
						}
				   }while(!key_s3);
				   if(key_s4==0)
				   {
				   		delay(5);	
				   		if(key_s4==0)
						{
							choose=1;	 //回到第一种工作模式
						}
				   }while(!key_s4);
				   if(key_s5==0)
				   {
				   		delay(5);	
				   		if(key_s5==0)
						{
							choose=3;	 //进入第三种工作模式
						}
				   }while(!key_s5);break;
			case 3:if(key_s4==0)
				   {
				   		delay(5);	
				   		if(key_s4==0)
						{
							flag=1;	    //返回标志
						}
				   }while(!key_s4);
				   if(key_s5==0)
				   {
				   		delay(5);	
				   		if(key_s5==0)
						{
							time1=0;		//时间清零
							flash=~flash;	//闪烁标志
						}
				   }while(!key_s5);break;
		}
		if(flag)
			sum=0;
		else
			sum=price[num]*number;
		At24c02Write(6,num); 	 //将num数值存入内存中的位置6
	}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月牙 ,呐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值