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

📄 keyboard.c

📁 用C语言实现键盘的功能
💻 C
字号:
/***********************键盘显示程序********************/
//project:扫描判断键盘并通过数码管进行动态显示
//Chip type:           ATmega16L 
//Clock frequency:     8.000000 MHz
//Date:                2006-20-6 
//Author:             ChuYing OF WMFTYS    
//Comments:键盘为2行8列,PC0和PC1作为键盘的行线,PA0~PA7作为键盘的列线。
//         显示部分用4个7段LED数码管,PB口和PD口通过4个74LS47对数码管进行控制。
//*********************************************************************
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
//**********************************************
#define pc0_high()  asm("sbi 0x15,0")
#define pc0_low()   asm("cbi 0x15,0")
#define pc1_high()  asm("sbi 0x15,1")
#define pc1_low()   asm("cbi 0x15,1")
unsigned char i;
unsigned char temp2=0x00;
unsigned char temp=0x00;
unsigned char key=0x00;
unsigned char led0=0x00;
unsigned char led2=0x00;
unsigned char ledbuff[]={0x0f,0x0f,0x0f,0x0f}; //显示缓冲区
//端口初始化********************************************
void port_init(void)
{
DDRA=0B00000000;
PORTA=0B11111111;
DDRC=0B00000011;
PORTC=0B11111111;
DDRB=0B11111111;
PORTB=0B11111111;
DDRD=0B11111111;
PORTD=0B11111111;
//PA口为输入口,内部上拉电阻无效,PB口和PD口均作为输出口,并输出高电平,
//PC0和PC1为输出口,PC口的其它为输入口并且上拉有效。
}
//动态显示***************************************
void display(unsigned char key1)
{
/*unsigned char i;
for(i=0;i<3;i++)
ledbuff[i+1]=ledbuff[i];
ledbuff[0]=key1;
led0=4<<ledbuff[0];
led2=4<<ledbuff[2];
PORTB=led0|ledbuff[1];
PORTD=led2|ledbuff[3];
*/
ledbuff[0]=key1;
PORTB=ledbuff[0];
PORTD=temp2;
}
//系统初始化***************************************
void init_devices(void)
{
CLI();  //关中断
port_init();
}
//主函数********************************************
void main(void)
{
init_devices();
while(1)
{
for(i=0;i<2;i++)
{
unsigned char temp1;
PORTC=~(1<<i);                       //PORTC的i位为零,使行线为低电平
delay_nms(1);                      
temp=PINA;                           //读PINA的值                    
if(temp!=0xff)                       //有键按下吗
{
delay_nms(20);                       //延时,去抖
temp1=PINA;                          //再次读PINA的值
if(temp==temp1)                      //有键按下吗
{
switch(temp)                      //  计算键值
{
	 case 0x7f:temp=i*8;break;     
	 case 0xbf:temp=i*8+1;break;   
	 case 0xdf:temp=i*8+2;break;   
	 case 0xef:temp=i*8+3;break;   
	 case 0xf7:temp=i*8+4;break;
	 case 0xfb:temp=i*8+5;break;
	 case 0xfd:temp=i*8+6;break;
	 case 0xfe:temp=i*8+7;break;   
	 default:temp=0xff;
}
key=temp;
temp2=0x01;
}
else temp2=0x02;
}
else temp2=0x02;
}
display(key);
}
}













⌨️ 快捷键说明

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