

在CT107D單片機綜合訓練平臺上,首先將J5處的跳帽接到1~2引腳,使按鍵S4~S19按鍵組成4X4的矩陣鍵盤,

需要注意的是比賽的時候用的IAP15f2k61s2單片機是沒有P36和P37的,是用P44代替P37,P42代替P36,所有寫程式的時候需要注意一下,大家應該對矩陣鍵盤的掃描原理清楚吧,這里不在對矩陣鍵盤的掃描原理做講解,主要是針對一個題目做出相應程式設計,
內容設計:
1.不同按鍵對應不同的鍵值,例如S7對應數字7,S19對應數字19,在數碼管后兩位上顯示出來;
2.數字不足兩位的數碼管應只顯示一位,另外一個關閉,

#include<stc15f2k60s2.h>
#define uchar unsigned char //定義無符號字符型別uchar
#define uint unsigned int //定義無符號整型型別uint
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//數字0~9,“-”,“關”
uchar qi,ba; //定義字符型變數qi,ba,當作數碼管顯示控制變數
uchar num=0;
void delayms(int ms); //延時函式
void allinit(); //初始化函式
void keyscan16(); //矩陣按鍵函式
void display4(uchar qi,uchar ba); //第七、八段數碼管函式
void main()//主函式
{
allinit(); //初始化函式
while(1)
{
if(num>=10){qi=num/10;ba=num%10;}//鍵值大于等于10,數碼管分兩位顯示
else {qi=11;ba=num;} //鍵值小于10,數碼管顯示一位,另外一位熄滅
keyscan16(); //矩陣按鍵函式
display4(qi,ba); //第七、八段數碼管函式
}
}
void keyscan16()//矩陣按鍵函式
{
uchar temp; //定義一個無符號變數temp
P44=0;P42=1;P3=0x7f; //讓第一列按鍵為低電平
temp=P3; //把P3的值賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
if(temp!=0x0f) //判斷第一列是否有按鍵按下
{
delayms(5); //延時5ms,用來按鍵消抖
temp=P3; //把P3的值重新賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
if(temp!=0x0f) //再次判斷第一列是否有按鍵按下
{
temp=P3; //把P3的值重新賦給temp
switch(temp)
{
case 0x7e:num=7;break; //第一列第一個按鍵按下
case 0x7d:num=6;break; //第一列第二個按鍵按下
case 0x7b:num=5;break; //第一列第三個按鍵按下
case 0x77:num=4;break; //第一列第四個按鍵按下
}
while(temp!=0x0f) //無按鍵按下則進入回圈
{
temp=P3; //把P3的值重新賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
}
}
}
P44=1;P42=0;P3=0xbf; //讓第二列按鍵為低電平
temp=P3; //把P3的值賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
if(temp!=0x0f) //判斷第一列是否有按鍵按下
{
delayms(5); //延時5ms,用來按鍵消抖
temp=P3; //把P3的值重新賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
if(temp!=0x0f) //再次判斷第一列是否有按鍵按下
{
temp=P3; //把P3的值重新賦給temp
switch(temp)
{
case 0xbe:num=11;break; //第二列第一個按鍵按下
case 0xbd:num=10;break; //第二列第二個按鍵按下
case 0xbb:num=9;break; //第二列第三個按鍵按下
case 0xb7:num=8;break; //第二列第四個按鍵按下
}
while(temp!=0x0f) //無按鍵按下則進入回圈
{
temp=P3; //把P3的值重新賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
}
}
}
P44=1;P42=1;P3=0xdf; //讓第三列按鍵為低電平
temp=P3; //把P3的值賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
if(temp!=0x0f) //判斷第一列是否有按鍵按下
{
delayms(5); //延時5ms,用來按鍵消抖
temp=P3; //把P3的值重新賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
if(temp!=0x0f) //再次判斷第一列是否有按鍵按下
{
temp=P3; //把P3的值重新賦給temp
switch(temp)
{
case 0xde:num=15;break; //第三列第一個按鍵按下
case 0xdd:num=14;break; //第三列第二個按鍵按下
case 0xdb:num=13;break; //第三列第三個按鍵按下
case 0xd7:num=12;break; //第三列第四個按鍵按下
}
while(temp!=0x0f) //無按鍵按下則進入回圈
{
temp=P3; //把P3的值重新賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
}
}
}
P44=1;P42=1;P3=0xef; //讓第四列按鍵為低電平
temp=P3; //把P3的值賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
if(temp!=0x0f) //判斷第一列是否有按鍵按下
{
delayms(5); //延時5ms,用來按鍵消抖
temp=P3; //把P3的值重新賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
if(temp!=0x0f) //再次判斷第一列是否有按鍵按下
{
temp=P3; //把P3的值重新賦給temp
switch(temp)
{
case 0xee:num=19;break; //第四列第一個按鍵按下
case 0xed:num=18;break; //第四列第二個按鍵按下
case 0xeb:num=17;break; //第四列第三個按鍵按下
case 0xe7:num=16;break; //第四列第四個按鍵按下
}
while(temp!=0x0f) //無按鍵按下則進入回圈
{
temp=P3; //把P3的值重新賦給temp
temp=temp&0x0f; //把temp的值和0x0f相與,得到的值再賦給temp,依次來判斷第一列是否有按鍵按下
}
}
}
}
void delayms(int ms)//延時函式
{
uint i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()//初始化函式
{
P2=0XA0;P0=0X00; //關閉蜂鳴器繼電器
P2=0X80;P0=0XFF; //關閉所有LED燈
P2=0XC0;P0=0XFF; //選中所有數碼管段選
P2=0XFF;P0=0XFF; //關閉所有數碼管
}
void display4(uchar qi,uchar ba)//第七、八段數碼管函式
{
P2=0XC0;P0=0X40; //選中第七個數碼管段選
P2=0XFF;P0=tab[qi]; //讓第一個數碼管顯示qi指向的值
delayms(1); //延時1ms
P2=0XC0;P0=0X80; //選中第八個數碼管段選
P2=0XFF;P0=tab[ba]; //讓第一個數碼管顯示ba指向的值
delayms(1); //延時1ms
}
![]()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278150.html
標籤:其他
上一篇:軟體工程第三章習題
下一篇:STM32下載器設定
