系列文章目录
蓝桥杯温度记录器(示例)
蓝桥杯单片机模板1
蓝桥杯单片机模板2
蓝桥杯单片机各功能模块的使用
前言
本篇文章主要是提供一个框架,便捷使用各功能模块,读者只需要思考核心实现代码即可。
提示:以下是本篇文章正文内容,下面案例可供参考
一、主程序
main.c(定时器扫描数码管)
/*
*/
#include "STC15.h"
#define uint unsigned int
#define uchar unsigned char
uchar code smg_du[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};
uchar code smg_wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar Table[8];
/*全局初始化*/
void AllInit(void)
{
P2 = (P2 & 0x1f) | 0x80;//LED初始化
P0 = 0xff;
P2 = (P2 & 0x1f) | 0xc0;//数码管初始化
P0 = 0x00;
P2 = (P2 & 0x1f) | 0xa0;//蜂鸣器初始化
P0 = 0x00;
P2 = P2 & 0x1f;
}
/*定时器1初始化*/
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xCD; //设置定时初值
TH1 = 0xD4; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
}
/*主函数*/
void main(void)
{
AllInit();
Timer1Init();
while(1){
//此处写核心实现代码,样例见顶部温度记录器示例文章。
}
}
/*定时器1*/
void Time1(void) interrupt 3
{
static int smg_count=0,i=0;
TL1 = 0xCD;
TH1 = 0xD4;
smg_count++;
if(smg_count>=1)//扫描数码管
{
smg_count=0;
P2=0xe0;P0=~smg_du[Table[i]];P2=0x00;
P2=0xc0;P0=smg_wei[i];P2=0x00;
i++;
if(i>=8) i=0;
}
}
二、其他功能模块
键盘
独立按键
key.c
#include <STC15.H>
#include "key.h"
#define key_input P3
#define key_state_0 0 //判断按键是否按下
#define key_state_1 1 //判断按键是否是抖动
#define key_state_2 2 //判断按键是否弹起
#define key_mask 0x0f //屏蔽不需要的IO
char read_key(void)
{
static char key_state=0;
char key_press,key_return=0;
key_press=key_input&key_mask;
switch(key_state)
{
case key_state_0: if(key_press!=key_mask) key_state=key_state_1;break;
case key_state_1:
if(key_press==(key_input&key_mask))
{
if(key_press==0x0e) key_return=7;
if(key_press==0x0d) key_return=6;
if(key_press==0x0b) key_return=5;
if(key_press==0x07) key_return=4;
key_state=key_state_2;
}
else key_state=key_state_0;break;
case key_state_2: if(key_press==0x0f) key_state=key_state_0;break;
}
return key_return;
}
key.h
#ifndef __key_H
#define __key_H
char read_key(void);
#endif
矩阵键盘
key.c
#include <STC15.H>
#include "key.h"
#define KEY P3
#define NO_KEY 0xff
#define KEY_STATE0 0
#define KEY_STATE1 1
#define KEY_STATE2 2
#define uchar unsigned char
char read_key(void) {
static unsigned char key_state=KEY_STATE0;
uchar key_value=0,key_temp;
uchar key1,key2;
P30=0;
P31=0;
P32=0;
P33=0;
P34=1;
P35=1;
P42=1;
P44=1;
if(P44==0) key1=0x70;
if(P42==0) key1=0xb0;
if(P35==0) key1=0xd0;
if(P34==0) key1=0xe0;
if((P34==1)&&(P35==1)&&(P42==1)&&(P44==1)) key1=0xf0;
P30=1;
P31=1;
P32=1;
P33=1;
P34=0;
P35=0;
P42=0;
P44=0;
if(P30==0) key2=0x0e;
if(P31==0) key2=0x0d;
if(P32==0) key2=0x0b;
if(P33==0) key2=0x07;
if((P30==1)&&(P31==1)&&(P32==1)&&(P33==1)) key2=0x0f;
key_temp=key1|key2;
switch(key_state) {
case KEY_STATE0:
if(key_temp!=NO_KEY) {
key_state=KEY_STATE1;
}
break;
case KEY_STATE1:
if(key_temp==NO_KEY) {
key_state=KEY_STATE0;
} else {
switch(key_temp) {
case 0x77:
key_value=4;
break;
case 0x7b:
key_value=5;
break;
case 0x7d:
key_value=6;
break;
case 0x7e:
key_value=7;
break;
case 0xb7:
key_value=8;
break;
case 0xbb:
key_value=9;
break;
case 0xbd:
key_value=10;
break;
case 0xbe:
key_value=11;
break;
case 0xd7:
key_value=12;
break;
case 0xdb:
key_value=13;
break;
case 0xdd:
key_value=14;
break;
case 0xde:
key_value=15;
break;
case 0xe7:
key_value=16;
break;
case 0xeb:
key_value=17;
break;
case 0xed:
key_value=18;
break;
case 0xee:
key_value=19;
break;
}
key_state=KEY_STATE2;
}
break;
case KEY_STATE2:
if(key_temp==NO_KEY) {
key_state=KEY_STATE0;
}
break;
}
return key_value;
}
key.h
#ifndef __key_H
#define __key_H
char read_key(void);
#endif
总结
本文主要是一个大体的框架,包含了扫描数码管(定时器扫描数码管方式)还有键盘的使用。(记得点个赞哟)