📄 key2.c
字号:
/*============================================================
File Name :KEY2.c
说明 :
1. 按键时,7-segment-1,7-segment-2分别显示相对应的数字
=============================================================*/
#include <avr/io.h>
#define PPI_1_PA (unsigned char*)0x6000 // 7-Segment-2的外部存储器地址
#define PPI_1_PC (unsigned char*)0x6002 // 82C55的控制端外部存储器地址
#define PPI_1_CT (unsigned char*)0x6003 // 开关的外部存储器地址
unsigned char fnd[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,
0xa7,0xb3,0x9d,0x87,0xff}; /*0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f*/
unsigned char *ppi_ctrl,*key,*seg,bin=0;
void out_put(unsigned char in);
unsigned char key_scan(void);
void delay(int d1,int d2);
void initialize_ppi(void);
int main(void)
{
unsigned char in;
MCUCR|=(1<<SRE);
initialize_ppi();
DDRD=0xf0; // 端口 D输入输出的设定
PORTD=0x00; // 7-Segment-1显示"0"
*seg=fnd[bin]; // 7-Segment-2显示"0"
do{
delay(50,50);
in=key_scan();
if(in) // 判断开关是否有输入
out_put(in);
}while(1);
return 0;
}
void out_put(unsigned char in)
{
unsigned char a=0;
switch(in){
case 0x11:a=0x01; // 0001 0001
break;
case 0x21:a=0x02; // 0010 0001
break;
case 0x41:a=0x03; // 0100 0001
break;
case 0x81:a=0x0a; // 1000 0001
break;
case 0x12:a=0x04; // 0001 0010
break;
case 0x22:a=0x05; // 0010 0010
break;
case 0x42:a=0x06; // 0100 0010
break;
case 0x82:a=0x0b; // 1000 0010
break;
case 0x14:a=0x07; // 0001 0100
break;
case 0x24:a=0x08; // 0010 0100
break;
case 0x44:a=0x09; // 0100 0100
break;
case 0x84:a=0x0c; // 1000 0100
break;
case 0x18:a=0x0d; // 0001 1000
break;
case 0x28:a=0x00; // 0010 1000
break;
case 0x48:a=0x0e; // 0100 1000
break;
case 0x88:a=0x0f; // 1000 1000
break;
default:
break;
}
bin=a;
PORTD=(a<<4); // 输出开关的值
*seg=fnd[bin]; // 输出开关的值
}
unsigned char key_scan(void)
{
unsigned char save_low,save_high;
*ppi_ctrl=0x81; // 开关的高4位为输出, 低4位为输入
*seg=fnd[bin]; // 输出开关的值
*key=0xf0;
delay(10,10);
save_low=*key&0x0f; // 保存开关纵向坐标值
*ppi_ctrl=0x80; // 输出 开关的8位
*seg=fnd[bin];
*key=0x00;
if(save_low){ // Switch on
*ppi_ctrl=0x88; // 开关高4位为输入,低4位为输出
*seg=fnd[bin];
*key=0x0f;
delay(10,10);
save_high=*key&0xf0; // 保存开关横向坐标值
*ppi_ctrl=0x80; // 输出开关8位
*seg=fnd[bin];
*key=0x00;
if(!save_high) // Switch off
return 0;
save_high|=save_low;
return save_high;
}
return 0;
}
void delay(int d1,int d2)
{
int i,j;
for(i=0;i<d1;i++){
for(j=0;j<d2;j++);
}
}
void initialize_ppi(void)
{
ppi_ctrl=PPI_1_CT;
seg=PPI_1_PA;
key=PPI_1_PC;
*ppi_ctrl=0x80; // 7-Segment-2 输出, Switch 8位输出
*key=0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -