基于51单片机的银行排队叫号机设计

我自己做的是用stm32做的,这个是帮同学用51做的。设计要求见我的另一篇博客。
是基于普中科技的开发板做的。
工程文件可以到我的主页下载资源里找,我也上传上去了
这是实验结果
一点补充说明:
1.程序是在普中科技51开发板例程程序基础上改的。
2.关于LCD的使用可以到哔哩哔哩上找普中科技的51开发板视频,有详细的讲解。
3.由于在给LCD写数据的过程中按下按键程序不会理会,所以按的时间会略长一点,我写的程序是直接重写第二行,所以时间会长一点,当然可以在此基础上改进,比如只改写数字所对应的位,应该反应会快一些。
4.由于是在stm32程序的基础上改的(参见我的另一篇博客),所以没有写注释,有注释也是stm32程序的注释,有的和实际功能不符,在此说明一下,大家不要为此感到疑惑。
欢迎大家对代码进行改进和指正。
还有问题的话可以在下面留言或者找我(qq:2254786469)。

下面给出主函数代码:

/**************************************************************************************
*		              LCD1602液晶显示实验												  *
实现现象:下载程序后插上LCD1602液晶在开发板上,即可显示
注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。																				  
***************************************************************************************/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"



 

#define KEY0_PRES 	1	//KEY0按下
#define KEY1_PRES	2	//KEY1按下
#define KEY2_PRES	3	//KEY2按下
#define WKUP_PRES   4	//KEY_UP按下(即WK_UP/KEY_UP)
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
sbit KEY0=P3^1;//读取按键0
sbit KEY1=P3^0;//读取按键1
sbit KEY2=P3^2;//读取按键2 
sbit WK_UP=P3^3;//读取按键3(WK_UP) 
sbit A=P2^0;
sbit B2=P2^1;
sbit C=P2^2;
u8 Disp[]="  A    B   C        ";
u8 Data[]=" 00   00   00        ";
u8 a1,a2,b1,b2,c1,c2,t;	
void delay(u16 i)
{
	while(i--);	
}
 
 void write(){
	 u8 i;
 LcdWriteCom(0x80+0x40) ;
	 Data[1]=a2;
	 Data[2]=a1;
	 Data[6]=b2;
	 Data[7]=b1;
	 Data[11]=c2;
	 Data[12]=c1;
	for(i=0;i<16;i++)
	{
			LcdWriteData(Data[i]);	
	}}
 
u8 KEY_Scan()
{	 
	  
	if(KEY0==0||KEY1==0||KEY2==0)
	{
		delay(500);//去抖动 
		
		if(KEY0==0)return KEY0_PRES;
		else if(KEY1==0)return KEY1_PRES;
		else if(KEY2==0)return KEY2_PRES;
		
	} 	    
 	return 0;// 无按键按下
}





void addition_A(){
if (a1<'9') a1++;
else {
	if (a2<'9'){
	a2++;
	a1='0';    }
	else {
		a1='0';
		a2='0';}	
}
//write();
}
                 
void addition_B(){
if (b1<'9') b1++;
else {
	if (a2<'9'){
	b2++;
	b1='0';    }
	else {
		b1='0';
		b2='0';
	     }
	
}
//write();
}

void addition_C(){
if (c1<'9') c1++;
else {
	if (c2<'9'){
	c2++;
	c1='0';    }
	else {
		c1='0';
		c2='0';
	     }
	
}
//write();
}

void subtract_A(){
if (a1<'1'&& a2<'1') a1=='0';//个位十位都等于0
else {
	if (a2>'0'&& a1<'1'){//个位等于0,十位大于零
	a2--;
	a1='9';    }
	else {//都大于0或十位等于0,个位大于0
		a1--;
	     }	
      } 
//write();
			}
                 
void subtract_B(){
if (b1<'1'&& b2<'1') b1=='0';//个位十位都等于0
else {
	if (b2>'0'&& b1<'1'){//个位等于0,十位大于零
	b2--;
	b1='9';    }
	else {//都大于0或十位等于0,个位大于0
		b1--;
	     }	
      }  
//write();
			}

void subtract_C(){
if (c1<'1'&& c2<'1') c1=='0';//个位十位都等于0
else {
	if (c2>'0'&& c1<'1'){//个位等于0,十位大于零
	c2--;
	c1='9';    }
	else {//都大于0或十位等于0,个位大于0
		c1--;
	     }	
      }  
//write();
			}

void key_press(u8 a){
	if (a==0) ;
	else{
	 if (a==1){
	  if(t==0) addition_A();
		else if(t==1) addition_B();
		else addition_C();
		  
	         }
	 else if(a==2){
	  if(t==0) subtract_A();
		else if(t==1) subtract_B();
		else subtract_C();
		  }
	 else{//按下KEY3
	
		if(t==2) t=0;
		else t++;	
	 	 } 
	}}
void indicator(){//指示当前操作的业务,在上面画条线
 if(t==0) {
 A=0;
	 B2=1;
	 C=1;
 }
 else if(t==1) {
 A=1;
	 B2=0;
	 C=1;}
 else{
 A=1;
	 B2=1;
	 C=0;}
}
/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main(void)
{
	u8 i;
	LcdInit();
	P3=0xff;
	t=0;
  a1='0';
  a2='0';
	b1='0';
  b2='0';
	c1='0';
  c2='0';
	//LcdWriteCom(0x80+0x40) ;
	for(i=0;i<16;i++)
	{
	
		LcdWriteData(Disp[i]);	
	}
	LcdWriteCom(0x80+0x40) ;
	for(i=0;i<16;i++)
	{
			LcdWriteData(Data[i]);	
	}
	while(1){
	  key_press(KEY_Scan());
		indicator();
		write();
		};				
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值