Bootstrap

蓝桥杯模拟题(按键计数器)

一.题目:

2.解题思路过程:

定义一个计数变量→设计一个累加程序·,当加到题目要求的100时,计时值自动回到原来的初始值

→设计一个累减程序,当减到题目要求的100时,计时值自动回到原来的初始值(计数变量使用的是char所有-1用255代替)→设计一清零和指示灯L1亮2s熄灭的程序→锁定程序(锁定程序用上位机的方式进行设计)。

二.功能代码实现部分:

1.主程序

#include <STC12C5A60S2.H>
#include "intrins.h"
#include "key.h"       //按键驱动模块
#include "smg.h"       //数码管驱动模块
#include "control.h"   //译码器驱动模块
unsigned char key_val,key_down,key_up,key_old;  //按键的一些工作方式定义
unsigned char key_sj;        
unsigned int smg_sj,count;
unsigned char smg_buf[8]={17,17,17,17,17,17,17,0};
unsigned char smg_point[8]={0,0,0,0,0,0,0,0};
unsigned  char  sg;
unsigned char num=0;
unsigned char flag=0;
//bit v;
void delay(unsigned char t)  //延时函数
{
   unsigned int i,j;
	 for(i=t;i>0;i--)
	 {
	    for(j=114;j>0;j--);
	 }
}

void Init_Timer0()   //计数器
{
   TMOD=0x01;
	 TH0=(65535-500)/256;
   TL0=(65535-500)%256;
	 ET0=1;
	 EA=1;
	TR0=1;
}


void key_fz()  
{
	if(key_sj) return;
	 key_sj=1;
   key_val=key_read();
	 key_down=key_val&(key_val^key_old);
	 key_up=~key_val&(key_val^key_old);
	 key_old=key_val;
	switch(key_down)
	{
		
		case 5:
			if(flag==0)
			{
				 num=0;
				 smg_buf[7]=num;
				smg_buf[6]=0xff;
				smg_buf[5]=0xff;
					P0=0xfe;
					 HC318(4);
	         HC318(0);
		    delay(2000);	
					P0=0xff;
				 HC318(4);
	        HC318(0);
			}
	 break;
		case 9: 
			if(flag==0)
			{
					if(--num==255) num=100;
					if(num>=0  && num<10)
					{
						smg_buf[5]=0xff;
						 smg_buf[6]=0xff;
						smg_buf[7]=num%10;
					}
					if(num>=10 && num<=99)
					{
						smg_buf[7]=num%10;
						 smg_buf[6]=num/10%10;
						smg_buf[5]=0xff;
					}
					if(num==100)
					{
						smg_buf[7]=num%10;
						 smg_buf[6]=num/10%10;
						smg_buf[5]=num/100;
					}
				}
		   break;

		case 13:
			if(flag==0)
			{
				if(++num==101) num=0;
					if(num>=0  && num<10)
					{
						smg_buf[5]=0xff;
						 smg_buf[6]=0xff;
						smg_buf[7]=num%10;
					}
					if(num>=10 && num<=99)
					{
						smg_buf[7]=num%10;
						 smg_buf[6]=num/10%10;
					}
					if(num==100)
					{
						smg_buf[7]=num%10;
						 smg_buf[6]=num/10%10;
						smg_buf[5]=num/100;
					}
				}
		   break;
			}
}

void smg_fz()
{
   if(smg_sj) return;
	 smg_sj=1;
}

void shutoff()
{
		P0=0xff;
    HC318(4);
	  HC318(0);
  P0=0x00;
	HC318(5);
	  HC318(0);
}
void serviceTimer0() interrupt 1
{
   TH0=(65535-500)/256;
   TL0=(65535-500)%256;
   if(++key_sj==2) key_sj=0;
	 if(++smg_sj==100) smg_sj=0;
	 if(++sg==8) sg=0;
	 smg_show(sg,smg_buf[sg],smg_point[sg]);
	
}
void main()
{
	Init_Timer0();
	shutoff();
   while(1)
	 {
		  
		  key_fz();
	   smg_fz();
		 if(key_down==1)
		 {
		    delay(100);
			  if(key_down==1)
				{
				    if(flag==0)
						{
						   P0=0x7f;
			       P2=(P2&0x1f)|0x80;
						P2&=0x1f; 
							flag=1;
						}
						else if(flag==1)
						{
						   P0=0xff;
			        P2=(P2&0x1f)|0x80;
						  P2&=0x1f; 
							flag=0;
						}
				}
		 }
	 }

}

2.按键驱动程序

#include "key.h"
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;
sbit C3=P3^5;
sbit C4=P3^4;

unsigned char key_read()
{
    unsigned char temp=0;
	  R1=0,R2=1,R3=1,R4=1;
	  if(C1==0) temp=1;
	  if(C2==0) temp=2;
	  if(C3==0) temp=3;
	  if(C4==0) temp=4;
    R1=1,R2=0,R3=1,R4=1;
	  if(C1==0) temp=5;
	  if(C2==0) temp=6;
	  if(C3==0) temp=7;
	  if(C4==0) temp=8;
	  R1=1,R2=1,R3=0,R4=1;
	  if(C1==0) temp=9;
	  if(C2==0) temp=10;
	  if(C3==0) temp=11;
	  if(C4==0) temp=12;
	  R1=1,R2=1,R3=1,R4=0;
	  if(C1==0) temp=13;
	  if(C2==0) temp=14;
	  if(C3==0) temp=15;
	  if(C4==0) temp=16;
		return temp;
}

3.数码管驱动程序

#include "smg.h"
#include "control.h"
unsigned char code duan[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc8,0xff};
unsigned char code wei[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void smg_show(unsigned char b,c,d)
{
    P0=0xff;
	  HC318(7);
	  HC318(0);
	  P0=wei[b];
	  HC318(6);
	   HC318(0);
	 if(d==1)
	 {
	   P0=duan[c]&0x7f;
		 HC318(7);
		 HC318(0);
		
	 }
	 else
	 {
	    P0=duan[c];
		  HC318(7);
		   HC318(0);
	 }

}

4.译码器驱动程序

#include "control.h"
void HC318(unsigned char a)
{
    switch(a)
		{
			case 4:P2=(P2&0x1f)|0x80; break;
			case 5:P2=(P2&0x1f)|0xa0; break;
			case 6:P2=(P2&0x1f)|0xc0; break;
			case 7:P2=(P2&0x1f)|0xe0; break;
			case 0:P2=(P2&0x1f)|0x00; break;
		
		}

}

三.总结

   这次设计是我对数码管,按键的应用更加灵活。

目录

一.题目:

二.功能代码实现部分:


悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;