|
一个矩阵键盘的练习代码
- /*******************************************************************************
- * 实 验 名 : 动态数码管按键移动显示试验
- * 实验说明 :
- * 连接方式 : 用排线将P0口和74H573旁边的J12连接起来
- * * 将138译码器的A、B、C端分别接P2.2、P2.3、P2.4
- * * 用排线将P1口和矩阵键盘旁边的JP4连接起来
- * 注 意 :
- *******************************************************************************/
- #include<reg51.h>
- //--定义使用的IO口--//
- #define GPIO_DIG P0
- #define GPIO_KEY P1
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- //--定义全局变量--//
- unsigned char code DIG_CODE[17]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
- unsigned char KeyValue;
- //用来存放读取到的键值
- unsigned char KeyState; //记录按键的状态,0没有,1有
- unsigned char DisplayData[8];
- //用来存放要显示的8位数的值
- //--声明全局变量--//
- void Delay10ms(unsigned int c); //误差 0us
- void KeyDown(); //检测按键函数
- void DigDisplay(); //动态显示函数
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main(void)
- {
- KeyState=0;
- while(1)
- {
- KeyDown();
- if(KeyState==1)
- {
- DisplayData[7]=DisplayData[6];
- DisplayData[6]=DisplayData[5];
- DisplayData[5]=DisplayData[4];
- DisplayData[4]=DisplayData[3];
- DisplayData[3]=DisplayData[2];
- DisplayData[2]=DisplayData[1];
- DisplayData[1]=DisplayData[0];
- DisplayData[0]=DIG_CODE[KeyValue];
-
- KeyState=0;
- }
- DigDisplay();
- }
- }
- /*******************************************************************************
- * 函 数 名 : DigDisplay
- * 函数功能 : 使用数码管显示
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void DigDisplay()
- {
- unsigned char i;
- unsigned int j;
- for(i=0;i<8;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//显示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//显示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//显示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//显示第7位
- }
- GPIO_DIG=DisplayData[i];//发送段码
- j=10; //扫描间隔时间设定
- while(j--);
- GPIO_DIG=0x00;//消隐
- }
- }
- /*******************************************************************************
- * 函 数 名 : KeyDown
- * 函数功能 : 检测有按键按下并读取键值
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void KeyDown(void)
- {
- unsigned int a=0;
- GPIO_KEY=0x0f;
- if(GPIO_KEY!=0x0f)
- {
- Delay10ms(1);
- a++;
- a=0;
- if(GPIO_KEY!=0x0f)
- {
- KeyState=1;//有按键按下
- //测试列
- GPIO_KEY=0X0F;
- // Delay10ms(1);
- switch(GPIO_KEY)
- {
- case(0X07): KeyValue=0;break;
- case(0X0b): KeyValue=4;break;
- case(0X0d): KeyValue=8;break;
- case(0X0e): KeyValue=12;break;
- // default: KeyValue=17; //检测出错回复17意思是把数码管全灭掉。
- }
- //测试行
- GPIO_KEY=0XF0;
- // Delay10ms(1);
- switch(GPIO_KEY)
- {
- case(0X70): KeyValue=KeyValue+3;break;
- case(0Xb0): KeyValue=KeyValue+2;break;
- case(0Xd0): KeyValue=KeyValue+1;break;
- case(0Xe0): KeyValue=KeyValue;break;
- // default: KeyValue=17;
- }
- while((a<50)&&(GPIO_KEY!=0xf0)) //按键松手检测
- {
- Delay10ms(1);
- a++;
- }
- a=0;
- }
- }
- }
- /*******************************************************************************
- * 函 数 名 : Delay10ms
- * 函数功能 : 延时函数,延时10ms
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Delay10ms(unsigned int c) //误差 0us
- {
- unsigned char a, b;
- //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
- for (;c>0;c--)
- {
- for (b=38;b>0;b--)
- {
- for (a=130;a>0;a--);
- }
- }
- }
复制代码
|
|