蓝桥杯历届所有考过的模块(IIC,DS1302,DS18B20,NE555,串口模块)汇总(一)

        本人大二进实验室,大二觉得自己不行,就没参加蓝桥杯,现大三参加第九届蓝桥杯也就准备了一个月,获得省赛一等奖,现后天决赛比赛,突发想法想发第一个帖子。希望大家支持,我也会更加努力。

下面贴代码。(只是数码管)

    base.c该文件用来写底层驱动文件。

代码:

#include "base.h"//用来写底层驱动文件
//所有IO口操作没有用”与或“运算,些许地方会有影响。理应用的,这里偷懒


uchar tab[] = {0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位选码
uchar tab1[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};//段选码0xbf为“-”,0xc6为“C”


uchar ds[] = {50,57,23,23,5,3,18};//初始时间 :50秒 57分 23时 23日 5月 星期三 2018年(严格按照顺序)
uchar time[7];//实时时钟


void allinit()//初始化
{
P2 = 0XFF;
P0 = 0XFF;//关闭数码管段选

P2 = 0XA0;
P0 = 0X00;//关闭蜂鸣器、继电器

P2 = 0X80;
P0 = 0XFF;//关闭LED;
}


void delayms(uint ms)//11.0592mhz 延时 1ms
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}


void display(uchar m,uchar n)//数码管显示,m为位选,n为段选。
{
P2 = 0XFF;
P0 = 0XFF;//关闭段选码,消隐

P2 = 0XC0;
P0 = tab[m];//位选

P2 = 0XFF;
P0 = tab1[n];//片选

delayms(1);
P0 = 0XFF;//延时1ms,关闭段选,可解决数码管最后一位亮度较其他数码管亮的小bug。
}


uchar keyscan()//独立按键
{
uchar key;
if(P30 == 0)
{
delayms(5);//防抖
if(P30 == 0)
{
key = 7;
while(!P30);//松手检测
}
}
if(P31 == 0)
{
delayms(5);//防抖
if(P31 == 0)
{
key = 6;
while(!P31);//松手检测
}
}
if(P32 == 0)
{
delayms(5);//防抖
if(P32 == 0)
{
key = 5;
while(!P32);//松手检测
}
}
if(P33 == 0)
{
delayms(5);//防抖
if(P33 == 0)
{
key = 4;
while(!P33);//松手检测
}
}
return key;
}


uchar keyscan16()//矩阵按键
{
uchar key;
h1 = 0;
h2 = h3 = h4 = 1;
s1 = s2 = s3 =s4 = 1;

if(s1 == 0)
{
delayms(5);//防抖
if(s1 == 0)
{
key = 0;
while(!s1);//松手检测
}
}
if(s2 == 0)
{
delayms(5);//防抖
if(s2 == 0)
{
key = 1;
while(!s2);//松手检测
}
}
if(s3 == 0)
{
delayms(5);//防抖
if(s3 == 0)
{
key = 2;
while(!s3);//松手检测
}
}
if(s4 == 0)
{
delayms(5);//防抖
if(s4 == 0)
{
key = 3;
while(!s4);//松手检测
}
}

h2 = 0;
h1 = h3 = h4 = 1;
s1 = s2 = s3 =s4 = 1;

if(s1 == 0)
{
delayms(5);//防抖
if(s1 == 0)
{
key = 4;
while(!s1);//松手检测
}
}
if(s2 == 0)
{
delayms(5);//防抖
if(s2 == 0)
{
key = 5;
while(!s2);//松手检测
}
}
if(s3 == 0)
{
delayms(5);//防抖
if(s3 == 0)
{
key = 6;
while(!s3);//松手检测
}
}
if(s4 == 0)
{
delayms(5);//防抖
if(s4 == 0)
{
key = 7;
while(!s4);//松手检测
}
}

h3 = 0;
h2 = h1 = h4 = 1;
s1 = s2 = s3 =s4 = 1;

if(s1 == 0)
{
delayms(5);//防抖
if(s1 == 0)
{
key = 8;
while(!s1);//松手检测
}
}
if(s2 == 0)
{
delayms(5);//防抖
if(s2 == 0)
{
key = 9;
while(!s2);//松手检测
}
}
if(s3 == 0)
{
delayms(5);//防抖
if(s3 == 0)
{
key = 10;
while(!s3);//松手检测
}
}
if(s4 == 0)
{
delayms(5);//防抖
if(s4 == 0)
{
key = 11;
while(!s4);//松手检测
}
}

h4 = 0;
h2 = h3 = h1 = 1;
s1 = s2 = s3 =s4 = 1;

if(s1 == 0)
{
delayms(5);//防抖
if(s1 == 0)
{
key = 12;
while(!s1);//松手检测
}
}
if(s2 == 0)
{
delayms(5);//防抖
if(s2 == 0)
{
key = 13;
while(!s2);//松手检测
}
}
if(s3 == 0)
{
delayms(5);//防抖
if(s3 == 0)
{
key = 14;
while(!s3);//松手检测
}
}
if(s4 == 0)
{
delayms(5);//防抖
if(s4 == 0)
{
key = 15;
while(!s4);//松手检测
}
}

return key;
}



///////*******我有个大大的梦想就是把它们分开********/////////

base.h//base头文件

代码:

#ifndef _BASE_H
#define _BASE_H


#include "stc15f2k60s2.h"
#include "intrins.h"


#define uchar unsigned char
#define uint unsigned int

void allinit();
void delayms(uint ms);           //11.0592mhz 延时 1ms
void display(uchar m,uchar n);   //数码管显示,m为位选,n为段选。
uchar keyscan();                 //独立按键
uchar keyscan16();               //矩阵按键


#endif








你可能感兴趣的:(大学比赛)