蓝桥杯单片机初赛代码基础框架
前言
蓝桥杯单片机的初赛给我的感觉就是在熟悉基础模块的基础上,把基础模块进行组合,同时运用中断和定时器辅助,就能完成大部分功能。所以基础模块比如:按键,数码管,上电初始化等是非常重要的,是决定能进一步完成题目的关键。在一些竞争相对较弱的省份,甚至把基础模块全都写上,再实现题目里面的一个小功能,就能拿省三!!!那接下来直接上代码!!!!一、代码基础框架是什么?
是一套实现基础模块的代码,这套代码是一定一定一定一定会用得上的!!!甚至可以在开考前先默写上去!
二、具体代码
代码如下(示例):
#include<STC15F2K60S2.H>
#define uint unsigned int
#define uchar unsigned char
uint ms;
uchar num_key;
uchar temp;//存键值
uchar yi,er,san,si,wu,liu,qi,ba;
uchar code com[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位选
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};//数码管0——9的段选码,最后是全灭
void delay(uint ms);//延迟函数,大约是1ms延迟
void allinit();//上电初始化
void smg_display(uchar yi,uchar er,uchar san,uchar si,uchar wu,uchar liu,uchar qi,uchar ba);
uchar boredscan();
void keyscan()
void main()
{
allinit();
while(1)
{
yi = 1,er = 2,san = 3,si = 4,wu = 5,liu = 6,qi = 7,ba = 8;//主要用来验证数码管是否正常
smg_display(yi,er,san,si, wu,liu, qi, ba);
}
}
void allinit()
{
P2 = 0XA0;
P0 = 0X00;//关闭继电器,蜂鸣器
P2 = 0X80;
P0 = 0XFF;//关闭led
P2 = 0XC0;
P0 = 0XFF;//选择所有数码管
P2 = 0XFF;
P0 = 0XFF;//关闭所有数码管
}
void delay(uint ms)
{
uint a;
int b;
for(a = ms; a >0; a--)
for(b = 845; b> 0;b--);
}
void smg_display(uchar yi,uchar er,uchar san,uchar si,uchar wu,uchar liu,uchar qi,uchar ba)
{
uchar i;
for(i = 0; i<8; i++)
{
P2 = 0xc0;
P0 = com[i];
P2 = 0xff;
switch(i)
{
case 0:P0 = tab[yi];break;
case 1:P0 = tab[er];break;
case 2:P0 = tab[san];break;
case 3:P0 = tab[si];break;
case 4:P0 = tab[wu];break;
case 5:P0 = tab[liu];break;
case 6:P0 = tab[qi];break;
case 7:P0 = tab[ba];break;
}
delay(1);
}
if(i == 8)
i = 0;
}
//uchar boredscan()
//{
// P3=0X7F;
// P4=0XEF;
// temp = P3;
// temp = temp&0x0f;
// if(temp != 0x0f)
// {
// delay(5);
// temp = P3;
// temp = temp&0x0f;
// if(temp != 0x0f)
// {
// temp = P3;
// switch(temp)
// {
// case 0x7e: num_key = 0; break;
// case 0x7d: num_key = 1; break;
// case 0x7b: num_key = 2; break;
// case 0x77: num_key = 3; break;
// }
// while(temp!=0x0f)
// {
// temp=P3;
// temp=temp&0x0f;
// }
// }
// }
//
// P3 = 0XbF;
// P4=0XFB;
// temp = P3;
// temp = temp&0x0f;
// if(temp != 0x0f)
// {
// delay(5);
// temp = P3;
// temp = temp&0x0f;
// if(temp != 0x0f)
// {
// temp = P3;
// switch(temp)
// {
// case 0xbe: num_key = 4; break;
// case 0xbd: num_key = 5; break;
// case 0xbb: num_key = 6; break;
// case 0xb7: num_key = 7; break;
// }
// while(temp!=0x0f)
// {
// temp=P3;
// temp=temp&0x0f;
// }
// }
// }
//
// P4=0XFF;
// P3 = 0XdF;
// temp = P3;
// temp = temp&0x0f;
// if(temp != 0x0f)
// {
// delay(5);
// temp = P3;
// temp = temp&0x0f;
// if(temp != 0x0f)
// {
// temp = P3;
// switch(temp)
// {
// case 0xde: num_key = 8; break;
// case 0xdd: num_key = 9; break;
// case 0xdb: num_key = 10; break;
// case 0xd7: num_key = 11; break;
// }
// while(temp!=0x0f)
// {
// temp=P3;
// temp=temp&0x0f;
// }
// }
// }
// P3 = 0Xef;
// temp = P3;
// temp = temp&0x0f;
// if(temp != 0x0f)
// {
// delay(5);
// temp = P3;
// temp = temp&0x0f;
// if(temp != 0x0f)
// {
// temp = P3;
// switch(temp)
// {
// case 0xee: num_key = 12; break;
// case 0xed: num_key = 13; break;
// case 0xeb: num_key = 14; break;
// case 0xe7: num_key = 15; break;
// }
// while(temp!= 0x0f)
// {
// temp=P3;
// temp=temp&0x0f;
// }
// }
// }
// return num_key;
//}
void keyscan()
{
if(P30 == 0)
{
delay(5);
if(P30 == 0)
{
a = a - 1; 1111 1110
P0 = a;
}
while(!P30); //松手检测
}
else if(P31 == 0)
{
delay(5);
if(P31 == 0)
{
P0 = 0XFD;
}
while(!P31);
}
}
代码是两年前编写的,如有为题欢迎批评指正!!
三、代码说明
1、使用矩阵键盘还是独立按键,根据试题具体要求进行选择,这两部分代码虽然多,但是思路都是重复的,只需要改一些细节。
2、为了基础学习,代码中使用的是软件延迟来实现数码管动态扫描,如果试题功能较复杂,建议使用定时器来替代软件延迟。
3、**一定一定一定要在独立熟练实现所有外设功能后,再记忆此代码。**否则不利于初学者学习。