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

📄 key2.c

📁 82C55控制按键时
💻 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 + -