///////////////////////////////////////////////////////////////////////////
实现功能:完成独立按键的测试,当key5-key20这二十个按键中,有一个按下时, 则在的第一个上会显示具体的数值,显示的数值是这样 定义的,key5按下时,显示0,key6按下时显示2,然后依次这样类推, 达到按下去相应的值显示相应数值的功能 实验板型号:BS-X-C52 实验名称:静态数码管 编写人: TabLee 编写日期: 2014-3-21 ///////////////////////////////////////////////////////////////////////////
#include<reg52.h> #include <intrins.h> #define uchar unsigned char //定义unsigned char 为 uchar #define uintunsigned int
sbit Duan=P2^6;//定义数码管的段选使能端 sbit Wei =P2^7;//定义数码管的位选使能端
#define Digital_tube_Wei_Enable Wei=1;//开启控制数码管的位选使能端 #define Digital_tube_Wei_Disable Wei=0;//关闭控制数码管的位选使能端
#define Digital_tube_Duan_Enable Duan=1;//开启控制数码管的段选使能端 #define Digital_tube_Duan_Disable Duan=0;//关闭控制数码管的段选使能端
#define Digital_tube_Duan P0//定义数码管数据端口
#define KEY_N0 #define Keyport P3
uchar code Dis_table[]=//将BCD码转换成数码管扫描码的数组 {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71}; uchar code Dis_Position[]=//定义数码管位选的数组 {0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; /////////////////////////////////////////////////////////////////////////// 函数名称:毫秒延时函数 函数功能:实现毫秒级的延时 参数介绍:Delay_MS: 定义需要延时的毫秒的数值 iNumber: 记录Delay_MS的数值,以for语句实现所要求的延时 iValue: 要延时毫秒所要进行的循环数值,本数值为实际测得 返回值:无 注意事项:本实验是在所用晶振为12M的前提下实现的毫秒延时,本函数是通过循环的形 式完成,所以如果改变了晶振的频率,请做相应的改变 /////////////////////////////////////////////////////////////////////////// void DelayMs(uint Delay_MS) { uint iNumber,iValue; for(iNumber=0;iNumber<Delay_MS;iNumber++) { iValue=107; while(iValue--); } } ///////////////////////////////////////////////////////////////////////////
函数名称:One_DigitalTube_display 函数功能:完成在实验板上数码管指定显示,即在特定的数码管上显示特定的数字,比 在第一个数码管上显示0 参数介绍:uData:要显示的数字的BCD码数组 uNumber:选择哪个数码管显示,即让某个特定数码管显示 返回值:无 注意事项:实验板上的数码管是共阴极的数码管,如果使用共阳极的数码管,请注意不 要弄反了 ///////////////////////////////////////////////////////////////////////////
void One_DigitalTube_display(uchar uData,uchar uNumber) { Digital_tube_Duan=Dis_Position[uNumber]; //点亮特定的数码管 Digital_tube_Wei_Enable;//使能数码管的位选 Digital_tube_Wei_Disable;//关闭数码管的位选 DelayMs(5);//调整时序,以实现稳定显示 Digital_tube_Duan_Enable;//使能数码管的段选 Digital_tube_Duan=Dis_table[uData];//输入所要显示的数值 Digital_tube_Duan_Disable;//关闭数码管的段选 } /////////////////////////////////////////////////////////////////////////// 函数名称:Scan_Keyboard 函数功能:这是一个矩阵扫描函数,主要是测试是否有按键按下,此函数是按一列 一列的形式扫描的,如果有按键按下,近一步判断是哪个按键按下,然后显 示在数码管上显示相应的数值 参数介绍:cTemp_Value: 记录按键端口数值的临时变量 返回值:无 注意事项:无 ///////////////////////////////////////////////////////////////////////////
void Scan_Keyboard() { uchar cTemp_Value; //扫描矩阵键盘的第一列 Keyport=0xef;//赋给键盘端口特定的值,以实现后面的检测 cTemp_Value=Keyport;//把键盘端口值赋给临时变量 if(cTemp_Value!=0xef) { DelayMs(10);//消除抖动,即消除干扰 cTemp_Value=Keyport;//重新赋值于临时值 if(cTemp_Value!=0xef) //再次检查 while((Keyport&0x0F)!=0x0F)//再次判断是否有按键按下 { switch(cTemp_Value) { case 0xee: One_DigitalTube_display(0,0);break;//第五个按键按下,显示0 case 0xed: One_DigitalTube_display(4,0);break;//第九个按键按下,显示4 case 0xeb: One_DigitalTube_display(8,0);break;//第十三个按键按下,显示8 case 0xe7: One_DigitalTube_display(12,0);break;//第十七个按键按下,显示C } } } //扫描矩阵键盘的第二列 Keyport=0xdf;//赋给键盘端口特定的值,以实现后面的检测 cTemp_Value=Keyport;//把键盘端口值赋给临时变量 if(cTemp_Value!=0xdf) { DelayMs(10);//消除抖动,即消除干扰 cTemp_Value=Keyport;//重新赋值于临时值 if(cTemp_Value!=0xdf) //再次检查 while((Keyport&0x0F)!=0x0F)//再次判断是否有按键按下 { switch(cTemp_Value) { case 0xde: One_DigitalTube_display(1,0);break;//第六个按键按下,显示1 case 0xdd: One_DigitalTube_display(5,0);break;//第十个按键按下,显示5 case 0xdb: One_DigitalTube_display(9,0);break;//第十四个按键按下,显示9 case 0xd7: One_DigitalTube_display(13,0);break;//第十八个按键按下,显示D } } } //扫描矩阵键盘的第三列 Keyport=0xbf;//赋给键盘端口特定的值,以实现后面的检测 cTemp_Value=Keyport;//把键盘端口值赋给临时变量 if(cTemp_Value!=0xbf) { DelayMs(10);//消除抖动,即消除干扰 cTemp_Value=Keyport;//重新赋值于临时值 if(cTemp_Value!=0xbf) //再次检查 while((Keyport&0x0F)!=0x0F) //再次判断是否有按键按下 { switch(cTemp_Value) { case 0xbe: One_DigitalTube_display(2,0);break;//第七个按键按下,显示2 case 0xbd: One_DigitalTube_display(6,0);break;//第十一个按键按下,显示6 case 0xbb: One_DigitalTube_display(10,0);break;//第十五个按键按下,显示A case 0xb7: One_DigitalTube_display(14,0);break;//第十九个按键按下,显示E } } } //扫描矩阵键盘的第四列 Keyport=0x7f;//赋给键盘端口特定的值,以实现后面的检测 cTemp_Value=Keyport;//把键盘端口值赋给临时变量 if(cTemp_Value!=0x7f) { DelayMs(10);//消除抖动,即消除干扰 cTemp_Value=Keyport;//重新赋值于临时值 if(cTemp_Value!=0x7f) //再次检查 while((Keyport&0x0F)!=0x0F)//再次判断是否有按键按下 { switch(cTemp_Value) { case 0x7e: One_DigitalTube_display(3,0);break;//第八个按键按下,显示3 case 0x7d: One_DigitalTube_display(7,0);break;//第十二个按键按下,显示7 case 0x7b: One_DigitalTube_display(11,0);break;//第十六个按键按下,显示B case 0x77: One_DigitalTube_display(15,0);break;//第二十个按键按下,显示F } } } } ///////////////////////////////////////////////////////////////////////////
函数名称:main 函数功能:不断地循环扫描键盘,当有按键按下时,则在数码管上显示相应的数值 参数介绍:无 返回值:无 注意事项:无 ///////////////////////////////////////////////////////////////////////////