矩阵式按键._c

来自「ICC mega8例子」· _C 代码 · 共 147 行

_C
147
字号
//ICC-AVR application builder : 2009-3-12 17:58:29
// Target : M8
// Crystal: 8.0000Mhz

#include <iom8v.h>
#include <macros.h>

void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

/************************************
用    途:微秒级延时程序
Taget   :mega8
crystal :8M
介    绍:在8M的晶振上进行us级的延时
入口参数:
*************************************/
void delay_us(int time)
{
    do
    {
        time--;
    } 
    while (time > 1);
}


/************************************
用    途:两位数码管显示一个数
Taget   :mega8
crystal :8M
介    绍:共阳数码管
	  	 1-PC1(片选)
		 2-PC0
		 -----
		 a-PB0(数据)
		 b-PB1
		 ...
		 h-PB6
		 DP-PB7
入口参数:要显示的数,十进制表示
*************************************/
const unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
	   			0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void show_2_digit(unsigned char digi)
{
 unsigned char i;
 DDRC=0xff;
 DDRB=0xff;
 PORTC=0;//关片选
 PORTB=~num[(unsigned char )(digi/10)];//显示十位
 PORTC=(0x1<<1);//开十位的显示
 delay_us(200);
 PORTC=0;//关显示
 PORTB=~num[(unsigned char )(digi%10)];//显示个位
 PORTC=(0x1<<0);//开个位的显示
 delay_us(200);
 PORTC=0x0;//关显示
}

/************************************
用    途:矩阵键盘扫描子程序
Taget   :mega8
crystal :8M
介    绍:用的是D口
入口参数:
出口参数:没有是-1不然是0-15
*************************************/
char key_vetrix()
{
 char k=-1;
 unsigned char key0;
 DDRD=0xf0;
 PORTD=0x0f;//扫描低位
 delay_us(1);
 key0=PIND;
 key0=~(key0^0xf0);
 if (key0==0) return -1;
 //----------------------扫行
 delay_us(500);//延时消抖
 key0=PIND;
 if (key0==0) return -1;
 switch ((key0))
 {
  case (0x01):k=0;break;
  case (0x02):k=4;break;
  case (0x04):k=8;break;
  case (0x08):k=12;break;
 }
 //---------------------扫列
 DDRD=0x0f;
 PORTD=0xf0;
 delay_us(1);
 key0=PIND;
 key0=~(key0^0x0f);
 if (0==key0) return -1;
 switch ((key0>>4))
 {
  case 1:k+=0;break;
  case 2:k+=1;break;
  case 4:k+=2;break;
  case 8:k+=3;break;
 }
 /*while(0!=key0)//等待按起
 {
  key0=pinKEY;
  key0=~(key0^0x0f);
 }*/
 return k;
}
//********************************

void main()
{
 char i,j=0;
 port_init();
 init_devices();
 
 while(1)
 {
 
  if((i=key_vetrix())!=-1)
   j=i;
  show_2_digit(j);
 }
}

⌨️ 快捷键说明

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