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

📄 oldkeyprogrammetest.c

📁 在Atmega16上实现 一位的计数器 键盘输入 数码管显示
💻 C
字号:
#include<avr/io.h>
#define uchar unsigned char 
#define uint unsigned int 

uchar Cal[4]={0,0,0,0};//定义一个全局变量 用于保存进行加法运算十的按键值:A+B=C 
uchar Table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//用于保存十进制显示 
uchar p[2]={0,0};//保存要显示的两位数内容 本程序显示两位 

void delay(uint i)//延时函数
{
   uchar j;
   for(j=0;j<i;j++);
}

uchar KEYPRESSED(void)//检测是否有按键
{
  DDRA=0xFF;
  PORTA=0xF0;
  DDRA=0x00;
  if(PINA!=0xF0)
     return 1;//有按键
  else 
     return 0;//无按键
}

uchar KeyScan(void)//键盘扫描程序
{
   uchar High,Low,KeyCode;
   uchar keycode;

   PORTA=0XF0;//检测高位被按下的按键
   DDRA=0X0F;
   High=PINA&0xF0;

   PORTA=0x0F;//检测低四位 按下 并求得键值 
   DDRA=0xF0;
   Low=PINA&0X0F;

   KeyCode=High+Low;
   
    switch(KeyCode)
	{
	   case 0x7E:
	        keycode=0X77;//A
			break;
       case 0xBE:
	        keycode=0x4F;//3
			break;
       case 0xDE:
	        keycode=0x5B;//2
			break;
       case 0xEE:
	        keycode=0x06;//1
			break;
       case 0x7D:
	        keycode=0X7C;//B
			break;
       case 0xBD:
	        keycode=0X7D;//6
			break;
       case 0xDD:
	        keycode=0X6D;//5
			break;
       case 0xED:
	        keycode=0X66;//4
			break;
       case 0x7B:
	        keycode=0x39;//C
			break;
       case 0xBB:
	        keycode=0X6F;//9
			break;
       case 0xDB:
	        keycode=0X7F;//8
			break;
       case 0xEB:
	        keycode=0X07;//7  
			break;
       case 0x77:
	        keycode=0x5E;//D
			break;
       case 0xB7:
	        keycode=0x71;//#显示为F
			break;
       case 0xD7:
	        keycode=0X3F;//0
			break;
       case 0xE7:
	        keycode=0x76;//'*'显示为H
			break;
       default :
			break;
       }
	return keycode;
}

void Init(void)//初始化数码管
{
   DDRB=0xFF;
   PORTB=0x00;
   DDRC=0X03;
   PORTC=0XFF;
}

void Display(uchar p)//数码管显示
{
  PORTC =0xFE;
  PORTB=p;
  delay(10);
}


void DispValue(void)//显示和值
{
  //显示十位 即点亮 Q1
  
  PORTB=0x00;
  PORTC=0x0E;
  PORTB=Table[p[0]];
  delay(100);
  PORTC=0xFF;
  
  //显示个位 即点亮Q2
  if(p[1]>0)
  {
    PORTB=0x00;
    PORTC=0x0D;
    PORTB=Table[p[1]];
    delay(100);
  }
}

uchar get_int(uchar K)//根据键值返回整型
{
   uchar getint;
   switch(K)
   {
     case 0x3f :
	       getint=0;
		   break;
     case 0x06 :
	      getint=1;
		  break;
     case 0x5B :
	      getint=2;
          break;
     case 0x4F :
	      getint=3;
		  break;
     case 0x66  :
	      getint=4;
		  break;
     case 0x6D :
	      getint=5;
		  break;
     case 0x7D :
	      getint=6;
		  break;
     case 0x07 :
	      getint=7;
		  break;
     case 0x7f :
	      getint=8;
		  break;
     case 0x6F :
	      getint=9;
		  break;
     default:
	      getint=0;
		  break;
    }
	return getint;
}


int main()
{
   uchar key,Value,a,b;
   uchar flag;//选择的运算的标志 0--加法  1--减法  2--乘法 3--除法
   Init();//数码管初始化
   //key=0x6D;//没有按下时初始显示0
   //Display(key);//初始显示 
   while(1){
     while(!KEYPRESSED());//不断的检测是否有按键按下  
	 delay(5);
	 key=KeyScan();
	
	 if(Cal[1]==0)//也就是加.减.乘.除号还没按下的时候 保存第一个加数  但是这有一个问题 按下的是加号  则这个值存加号
	  {
	    /*if((key!=0x77)&&(key!=0x7C))//用一个switch语句来选择究竟是执行什么样的操作
		  Cal[0]=key;
        else
		  Cal[1]=1;*/
        switch(key)
		{
		 case  0x77:  //加号
		 {
			  Cal[1]=1;flag=0;
			  break;
         }
         case  0x7C:  //减号
		 {
			 Cal[1]=1;flag=1;
			 break;
         }
         case 0x39:  //乘号
	     {
			 Cal[1]=1;flag=2;
		     break;
		 }		 
         case 0x5E:  //除号
		 {
			  Cal[1]=1;flag=3;
              break;
		 }
		 default:
		     Cal[0]=key;
			 break;
       }
     }
     else 
	 {
	  if(key!=0x71)
	    Cal[2]=key;//即是加号按下了 保存第二个加数 但这里同样有个问题 即是按下等号是 就是等号的值
     // Display(key);//这步不搞这么负责 对于显示的只是进行 0-9的计算 对于其他的非法按键也没处理 
	  else
	   {
	    a=get_int(Cal[0]);
		b=get_int(Cal[2]);
       // Value=a-b;
		switch(flag)
		{
		 case 0:  Value=a+b;
		      break;
		 case 1:  Value=a-b;
		      break;
         case 2:  Value=a*b;
		      break;
         case 3:  Value=a/b;
		      break;
         default :  
		      break;
        }
		p[0]=Value%10;//个位   为什么Add_Value 总是等于a 也就是第一次按出的数
		p[1]=Value/10;//十位 
		while(1)
           DispValue();
		   //delay(200);
       }   
	 }
	Display(key); 
  }/*
 while(1){ 
  while(!KEYPRESSED());//不断的检测是否有按键按下  是否可以运行
  delay(5);
  key=KeyScan();
  //while(KEYPRESSED())
	 Display(key);
  delay(50);  //注意注意::这个延时信号必须在适当的范围 大了则可能无法检测到数值 导致无法响应键盘操作

  // key=0x6D;//没有按下时初始显示0
   //Display(key);//初始显示 
   
    
   }

 while(!KEYPRESSED());//不断的检测是否有按键按下  是否可以运行
  delay(5);
  key=KeyScan();
  //while(KEYPRESSED())
	 Display(key);
*/
 
   return 1;
} 

⌨️ 快捷键说明

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