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

📄 lesson5.c

📁 用单片机对键盘按键进行扫描检测。可以扫描出具体按下的哪个键子
💻 C
字号:
#include <iom16v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint  unsigned int
#pragma data:code 
const  table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
		           0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};
void delay(uint ms)
{
        uint i,j;
	for(i=0;i<ms;i++)
	   {
	   for(j=0;j<1141;j++);
       }
}
void show(uchar j,uchar k)
{//第4集第4-5分钟就讲这个过程
        PORTA|=BIT(3);//导通U6这个573 段选
	PORTB=table[j];//选中段选,即是选中显示哪个数据。
	PORTA&=~BIT(3);//锁存
	
	PORTB=0XFF;//设初值。其实写成PORTB=0xFE也行,但是由于这个是根据别的程序改的,故加了这句话。
	PORTB&=~BIT(k);//把第一个数码管变成低电平,低电平表示接通的意思。每次只选中第一个数码管。
	PORTA|=BIT(4);//打开U7这个573
	PORTA&=~BIT(4);//关闭U7这个573
	delay(1);
}

uchar key_press()
{
    uchar j;
    DDRD|=0X0F;//00001111 右边为低4位,左边为高4位即把RXD TXD INT0 INT1变为输出
	PORTD|=0X0F;
	
	DDRD&=0XF0;//谁与0都是0谁与1都不变,谁或0都不变,谁或1都变1. 把RXD TXD INTO INT1 变为输入
	
	j=PIND;
	j=j&0X0F;//00001111 我们不看高4位是什么我们给他屏弊了,我们只看低4位。
	if(j==0X0F)//就是判断一下低是4位是否有为0的.若有为0的,证明有键按下了。
	{
	  return 0;
	}
	else
	{
	 return 1;
	}
	
}

uchar key_scan()
{
    uchar key;
    delay(10);//消抖
	if(key_press())//再确认一下是否按下
	{
	key=PIND;
	key&=0X0F;//让高4位变成0
	switch(key)
	{
	   case 0X0E: 
	       key=1;
		   break;
	   case 0X0D:
	       key=2;
		   break;
	   	 case 0X0B: 
	       key=3;
		   break;
	   case 0X07:
	       key=4;
		   break; 
	   default:	
	       key=16;     	   
	}
	  while(key_press());//松手检测
	}
	else
	{
	  key=16;
	}
	return key;
}
void main()
{
    uchar i,l;
    DDRA|=0X18;//0001 1000 不改变其它口的输出,只改变p3、p4口~~考虑若是00100010 |00011000 的情况是不是只改变了P3P4其它没有改//变
	DDRB=0XFF;//让发光二极管全部灭掉。
	while(1)
	{
	  i=key_press();
	  if(i)
	  {
	     l=key_scan();
		 show(l,0);
	  }
	}
}//键盘扫描程序:首先先将DDRD的低4位置为输出高电平即RXD TXD INT0 INT1 置为高电平,然后再将这4个IO变为输入,若S1-S4其中一个被//按下时,那么将导通,那么PD0-PD4中将有被变为低电平,我们程序就检测哪个被变为低电平,哪个被变为低电平,哪个就被按下了

⌨️ 快捷键说明

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