⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 自己学习PIC单片机时做的矩阵键盘仿真程序
💻 C
字号:
#include<pic.h>
#define BIT(x) (1<<(x))
#define uint unsigned int
#define uchar unsigned char
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
		           0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管译码表
__CONFIG(0x3B31);
void delay(uint ms)        //毫秒延时程序
{
        uint i,j;
	for(i=0;i<ms;i++)
	   {
	   for(j=0;j<88;j++);
       }
}

void show(uchar j,uchar k)//数码管动态位显示,j为显示的数值,k为显示的位
{
	PORTD=table[j];     //PD口做数据口段选
	PORTA=~(1<<(k));    //PA口低位做位选
	delay(1);
	PORTA=0XFF;
}

void init()
{
 TRISA=0;//输出
 PORTA=0XFF;
 TRISD=0;//输出
 PORTD=0;
 TRISB=0X0F;//低四位输入
 PORTB=0;
 TRISE0=0;
 RE0=0;
}
 
void bell(uchar num)//蜂鸣器响
{
 uchar dnum;
 for(dnum=num;dnum>0;dnum--)
 {
  RE0=1;
  delay(50);
  RE0=0;
  delay(20);
 }
}

void dig_tube(uchar num0,uchar num1,uchar num2,uchar num3,uchar num4,uchar num5)
{
 show(num0,0);
 show(num1,1);
 show(num2,2);
 show(num3,3);
 show(num4,4);
 show(num5,5);	
}


uchar martric_key_scan()//4X4矩阵键盘扫描函数
{
 uchar code_h;//行扫描值
 uchar code_l;//列扫描值
 uchar key_result;//键值
 PORTB=0X0F;  //PORTB4~7发全0,准备读列状态
 if((PORTB&0X0F)!=0X0F)//如果PORTB0~3不全为1,可能有键按下
 {
  delay(10);       //延时10ms去抖
  if((PORTB&0X0F)!=0X0F)//重读低四位,若还是不全为1,定有键按下
  {
  code_h=0xEF;       //PORTB4置0,开始扫描
   while((code_h&0xff)!=0xff)//判断是否为最后一行,如不是,继续扫描
     {
         PORTB=code_h;           //PORTB口输出行扫描值
	    if((PORTB&0X0F)!=0X0F)//如果PORTB0~3不全为1,该行有键按下
	    {
	     code_l=(PORTB&0X0F|0XF0);//保留PORTB口低四位,高四位变为1,该行有键按下
	     key_result=(~code_h)+(~code_l);//键编码=行扫描值+列扫描值
	     switch(key_result)//译码
	      {
		case 0x11:key_result=0;break;
		case 0x12:key_result=1;break;
		case 0x14:key_result=2;break;
		case 0x18:key_result=3;break;
		case 0x21:key_result=4;break;
		case 0x22:key_result=5;break;
		case 0x24:key_result=6;break;
		case 0x28:key_result=7;break;
		case 0x41:key_result=8;break;
		case 0x42:key_result=9;break;
		case 0x44:key_result=10;break;
		case 0x48:key_result=11;break;
		case 0x81:key_result=12;break;
		case 0x82:key_result=13;break;
		case 0x84:key_result=14;break;
		case 0x88:key_result=15;
		}
	     return(key_result);//键编码=行扫描值+列扫描值,返回主程序
	    }
    		else
    		code_h=(code_h<<1)|0x01;
	}
  }
 }
 return(0);	
}


void main()
{uchar key_num;
 init();
 while(1)
 {
  key_num = martric_key_scan();
 
 dig_tube(key_num,1,2,3,5,8);
 } 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -