蓝桥杯之临时抱佛脚(1)

参加省赛的一天没有准备,只是在比赛的时候写了会程序,不知为啥进了国赛。

今天特意写一篇抱佛脚的文章,所有的驱动机会没有改变,只是增加了一部分。

矩阵键盘、数码管必考不用想必须记住。下面是必须得记住的程序

系统配置

/*system.h相关代码*/
#ifndef __SYSTEM_H
#define __SYSTEM_H

#include<stc15.h>
#include<intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

void allinit();
void delay(u16 i);

#endif

/*system.c相关代码。。。进行初始化*/
#include"system.h"
void allinit()
{
	P2=(P2&0x1f)|0x80;
	P0=0xff;//led的初始化
	P2=(P2&0x1f)|0xe0;
	P0=0xff;//初始化关闭数码管
	P2=(P2&0x1f)|0xa0;
	P0=0x00;初始化蜂鸣器
	P2&=0x1f;
}
void delay(u16 i)
{
	while(i--);
}

矩阵键盘

/*arr_key.h相关程序*/
#ifndef __ARR_KEY_H
#define __ARR_KEY_H

#include "system.h"
sbit key_out_1=P3^0;
sbit key_out_2=P3^1;
sbit key_out_3=P3^2;
sbit key_out_4=P3^3;
sbit key_in_4=P3^4;
sbit key_in_3=P3^5;
sbit key_in_2=P4^2;
sbit key_in_1=P4^4;

void keydriver();
void keyscan();
void keyaction(u8 keycode);


#endif
/*arr_key.c的主程序*/
#include "arr_key.h"

extern bit set = 1;//应用在mian.c中的标志位,在mian.c中再定义一次

u8 keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
u8 keycodemap[4][4]=
{
	{0,1,2,15},
	{3,4,5,14},
	{6,7,8,13},
	{9,10,11,12}
};


void keydriver()
{
	u8 i,j;
	static backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			if(keysta[i][j]!=backup[i][j])
			{
				if(backup[i][j]!=0)
				{
					keyaction(keycodemap[i][j]);
				}
				backup[i][j]=keysta[i][j];
			}
		}
	}
}
void keyscan()
{
	u8 i;
	static u8 keybuff[4][4]={{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}};
	static u8 keyout=0;
	switch(keyout)
	{
		case 0:key_out_1=0;key_out_4=1;break;
		case 1:key_out_2=0;key_out_1=1;break;
		case 2:key_out_3=0;key_out_2=1;break;
		case 3:key_out_4=0;key_out_3=1;break;
		default:break;
	}
	keybuff[keyout][0]=(keybuff[keyout][0]<<1)|key_in_1;
	keybuff[keyout][1]=(keybuff[keyout][1]<<1)|key_in_2;
	keybuff[keyout][2]=(keybuff[keyout][2]<<1)|key_in_3;
	keybuff[keyout][3]=(keybuff[keyout][3]<<1)|key_in_4;
	for(i=0;i<4;i++)
	{
		if(((keybuff[keyout][i])&0x0f)==0x0f)
		{
			keysta[keyout][i]=1;
		}
		else if(((keybuff[keyout][i])&0x0f)==0x00)
		{
			keysta[keyout][i]=0;
		}
		else
		{}
	}
	keyout++;
	keyout&=0x03;
}
void keyaction(u8 keycode)//执行相应的操作
{
	if(keycode==0)
	{
		set = 1;
	}
	else if(keycode==1)
	{
		set = 0;
	}
	else if(keycode==2)
	{
		set = 1;
	}
	else if(keycode==3)
	{
		set = 0;
	}
	else if(keycode==4)
	{
		set = 1;
	}
	else set = 0;
}

数码管扫描

/*led.h的相关函数*/
#ifndef __LED_H
#define __LED_H
#include "system.h"

void ledscan();
void shownumber(u32 dat);
void ledshow();

#endif


/*led.c的相关函数*/
#include "led.h"

u8 ledchar[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
u8 ledbuff[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

extern u8 yi,er,san,si,wu,liu,qi,ba;

void ledscan()
{
	static u8 index=0;
	P2=(P2&0x1f)|0xe0;
	P0=0xff;
	
	P2=(P2&0x1f)|0xc0;
	P0=0x80>>index;
	
	P2=(P2&0x1f)|0xe0;
	P0=ledbuff[index];
	P2&=0x1f;
	index++;
	index&=0x07;
}
void shownumber(u32 dat)//显示多位数据
{
	char i;
	u8 buf[8];
	
	for(i=0; i<8; i++)
	{
		buf[i] = dat % 10;
		dat /= 10;
	}
	for(i=7; i>0; i--)
	{
		if(buf[i] == 0)
			ledbuff[i] = 0xFF;
		else
			break;
	}
	for( ; i>=0; i--)
	{
		ledbuff[i] = ledchar[buf[i]];
	}
}

void ledshow()//每位显示
{
	ledbuff[0]=ledchar[1];ledbuff[1]=ledchar[2];
	ledbuff[2]=ledchar[3];ledbuff[3]=ledchar[4];
	ledbuff[4]=ledchar[5];ledbuff[5]=ledchar[6];
	ledbuff[6]=ledchar[7];ledbuff[7]=ledchar[8];
}

以上的scan程序都需要放到定时器0的2ms定时中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值