? ? ?在寫大模板之前,先講一個函System_Init(),用于系統初始化關閉所有LED與外設,關閉所有LED就是傳入0xff數據打開鎖存器,關閉外設就是傳入0x00打開鎖存器。
? ? 現在所有底層已經提供給大家了,先提供最簡單版本的大模板,考前大家一定要把這個代碼記熟。書寫.h文件后代碼可直接運行!
? ? 好了,藍橋杯更新到這里就告一段落了,接下來是省賽題的代碼,不會每一個都講,只會講一些可能存在的難點。
1、Key底層
#include <STC15F2K60S2.H>unsigned char Key_Read(void)
{unsigned char Key_Num = 0; //一定記得賦初始值0// AUXR &= ~0x10; //關閉定時器二(有串口時加上)//掃描第一列P44 = 0;P42 = 1;P35 = 1;//P34 = 1; //有頻率采樣時必須注釋if(P33 == 0) Key_Num = 4;if(P32 == 0) Key_Num = 5;if(P31 == 0) Key_Num = 6;if(P30 == 0) Key_Num = 7;//掃描第二列P44 = 1;P42 = 0;P35 = 1;//P34 = 1;if(P33 == 0) Key_Num = 8;if(P32 == 0) Key_Num = 9;if(P31 == 0) Key_Num = 10;if(P30 == 0) Key_Num = 11;//掃描第三列P44 = 1;P42 = 1;P35 = 0;//P34 = 1;if(P33 == 0) Key_Num = 12;if(P32 == 0) Key_Num = 13;if(P31 == 0) Key_Num = 14;if(P30 == 0) Key_Num = 15;// P44 = 1;
// P42 = 1;
// P35 = 1;
// P34 = 0;
//
// if(P33 == 0) Key_Num = 16;
// if(P32 == 0) Key_Num = 17;
// if(P31 == 0) Key_Num = 18;
// if(P30 == 0) Key_Num = 19;// AUXR |= 0x10; //打開定時器二(有串口時加上)P3 = 0xff;return Key_Num;
}
2、Seg底層
#include <STC15F2K60S2.H>idata unsigned char duanselect[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};void Seg_Disp(unsigned char wei,duan,point)
{unsigned char temp;//段選消影P0 = 0xff;temp = P2 & 0x1f;temp = temp | 0xe0;P2 = temp;temp = P2 & 0x1f;P2 = temp;//先位選P0 = 0x01<<wei;temp = P2 & 0x1f;temp = temp | 0xc0;P2 = temp;temp = P2 & 0x1f;P2 = temp;//再段選P0 = duanselect[duan];if(point) //判斷小數點P0 = P0 & 0x7f;temp = P2 & 0x1f;temp = temp | 0xe0;P2 = temp;temp = P2 & 0x1f;P2 = temp;}
3、LED底層
#include <STC15F2K60S2.H>idata unsigned char temp_1 = 0x00;
idata unsigned char temp_old_1 = 0xff;
void LED_Disp(unsigned char *LED_Buf)
{unsigned char temp;temp_1 = 0x00;temp_1 = (LED_Buf[0]<<0) | (LED_Buf[1]<<1) |(LED_Buf[2]<<2) |(LED_Buf[3]<<3) |(LED_Buf[4]<<4) |(LED_Buf[5]<<5) |(LED_Buf[6]<<6) |(LED_Buf[7]<<7);if(temp_1 != temp_old_1){P0 = ~temp_1; //一定記得取反temp = P2 & 0x1f;temp = temp | 0x80;P2 = temp;temp = P2 & 0x1f;P2 = temp;temp_old_1 = temp_1;}
}
4、.h文件書寫格式
/*
#ifndef __LED_H__
#define __LED_H__void LED_Disp(unsigned char *LED_Buf);
#endif
*//*
#ifndef __KEY_H__
#define __KEY_H__unsigned char Key_Read(void);
#endif
*//*
#ifndef __SEG_H__
#define __SEG_H__void Seg_Disp(unsigned char wei,duan,point);
#endif
*/
5、main函數
#include <STC15F2K60S2.H>
#include "Seg.h"
#include "LED.h"
#include "Key.h"idata unsigned char Seg_Slow_Down; //數碼管延時變量
idata unsigned char Key_Slow_Down; //按鍵延時變量
idata unsigned char Seg_Buf[8]={10,10,10,10,10,10,10,10}; //數碼管顯示內容
idata unsigned char Seg_Scan; //數碼管掃描
idata unsigned char LED_Buf[8]={0,0,0,0,0,0,0,0}; //LED亮滅數據
idata unsigned char Key_Val,Key_Down,Key_Up,Key_Old; //按鍵參數void System_Init() //系統初始化
{unsigned char temp;//關閉所有LEDP0 = 0xff;temp = P2 & 0x1f;temp = temp | 0x80;P2 = temp;temp = P2 & 0x1f;P2 = temp;//關閉外設P0 = 0x00;temp = P2 & 0x1f;temp = temp | 0xa0;P2 = temp;temp = P2 & 0x1f;P2 = temp;}//定時器一初始化,自己加上EA = 1;ET1 = 1;
void Timer1_Init(void) //1毫秒@12.000MHz
{AUXR &= 0xBF; //定時器時鐘12T模式TMOD &= 0x0F; //設置定時器模式TL1 = 0x18; //設置定時初始值TH1 = 0xFC; //設置定時初始值TF1 = 0; //清除TF1標志TR1 = 1; //定時器1開始計時EA = 1; //打開總中斷ET1 = 1; //打開定時器一中斷允許位
}void Key_Proc() //按鍵處理函數
{if(Key_Slow_Down <20) return; //按鍵減速Key_Slow_Down = 0;Key_Val = Key_Read(); //讀取鍵碼值Key_Down = Key_Val & (Key_Old ^ Key_Val); //判斷按下Key_Up = ~Key_Val & (Key_Old ^ Key_Val); //判斷松開Key_Old = Key_Val; //判斷長按switch(Key_Down){}
}void Seg_Proc() //數碼管處理函數
{if(Seg_Slow_Down <100) return; //減速Seg_Slow_Down = 0;}void LED_Proc() //LED處理函數
{}void main()
{System_Init();Timer1_Init();while(1){Key_Proc();Seg_Proc();LED_Proc();}}//定時器一中斷打開---中斷標志位3
void Timer1_Routine() interrupt 3
{Seg_Slow_Down++;Key_Slow_Down++;if(++Seg_Scan == 8) Seg_Scan = 0;if(Seg_Buf[Seg_Scan] > 20) //判斷帶小數點的數據Seg_Disp(Seg_Scan,Seg_Buf[Seg_Scan]-',',1);elseSeg_Disp(Seg_Scan,Seg_Buf[Seg_Scan],0);LED_Disp(LED_Buf); //LED掃描
}
?
結語:少年不懼歲月長,彼方尚有榮光在!保持謙卑的態度學習!
?
?