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

📄 题2.c

📁 单片机C语言15个实验附有原理图和程序 是我的课程作业 以经过实践验证
💻 C
字号:
//程序5     键功能_1
//key_164_led_2
#include <stdio.h>
#include <reg51.h>
#include <intrins.h>
#define  uchar unsigned char
#define  hi  0x3c                                             //50ms定时
#define  lo  0xb0   
#define  hi1 0xF0                                                                                        
#define  lo1 0x00   
uchar    key=10,ledk[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x73};
uchar    displed[4]={11,10,10,10};                              //显示数寄存器,初始显示值为P
uchar    mask=0xfe;
sbit     P37=P3^7;    sbit clk=P0^7;  sbit sda=P0^6;            //74LS164
sbit     key1=P2^4;   sbit key2=P2^5;
sbit     key3=P2^6;   sbit key4=P2^7;  
sbit     P30=P3^0;                            
uchar    key1_mark,key2_mark;                                   //四个按键标志
uchar    key3_mark,key4_mark;
uchar    keypress=0;                                            //有按键按下标志
uchar    mark15s=0;                                             //十五秒定时标志
uchar    time15s=15;                                            //十五秒定时变量
uchar    count=0;
uchar    bell=0;
uchar    keymark=0xe0;
uchar    key_count,i=0,key_flag=0;
void delay(unsigned int n)                                       //延时函数
 {unsigned int i,j; 
  for(i=0;i<n;i++)
     for(j=0;j<n;j++) ;
 }
void shift(unsigned char dx)                                     //数据输出函数
{static unsigned char d;
   unsigned char j=0;
    d=dx;
   	while(j<8)
	{if((d&0x80)!=0) sda=1;
       else  sda=0;
	   clk=0;clk=1;
	   d<<=1;j++;
	  }  
}


unsigned char get_char(void)
 {unsigned char	key_code;
  static unsigned char column=1;
 
  if(P37==1 && key_flag==1){key_code=column;key_flag=0;key_count=0;keypress=1;}
      else key_code=0xff;
   P2=keymark|(mask&0x0f);
   if(key_flag==0 && P37==0)
       key_flag=1; 
   keymark=_crol_(keymark,1);
   if(keymark==0x0e) keymark=0xe0;
   column++; 
   if(column>4)  column=1; 
   return(key_code);

 }

void key_func(key)
 {switch (key)
   {
    case 1:  displed[3]=1;break;
    case 2:  displed[3]=2;break;
    case 3:  displed[3]=3;break;
    case 4:  displed[3]=4;break;
    default: break;}
  }
void t0(void) interrupt 1
{  TH0=hi;TL0=lo;
   count++;
   
   if(count==20)
     { count=0;
       time15s--;
	   displed[0]=time15s%10;
       displed[1]=time15s/10;
       if(time15s==0)  
	   { TR0=0;                             //关闭定时
	     mark15s=0;time15s=15;
		 displed[0]=11;
		 displed[1]=10;
		 displed[2]=10;
		 displed[3]=10;
	   }              
       if(time15s<3) TR1=1;
       
     }
   
}

void t1(void) interrupt 3
{  TH1=hi1; TL1=lo1;
   P30=!P30;
   bell++;
   if(bell==100)
    { TR1=0; bell=0;}
}

void main(void)
{ uchar i=0;
  EA=1;ET0=1;ET1=1;TMOD=0X11;
  TH0=hi; TL0=lo;
  TH1=hi1; TL1=lo1;
while(1)
     {  
	    if(mark15s==0&&keypress==0) 
                 key=get_char( );                  
         if(P37==1&&keypress==1)
	     {  key_func(key); 
            TR0=1; TR1=1;
			P30=1;
            displed[0]=time15s%10;                  //赋15秒的定时
            displed[1]=time15s/10;
            mark15s=1;
			keypress=0;
         }
		 shift(ledk[displed[i]]);
		 delay(22);
         mask=_crol_(mask,1);
         if(mask==0xef) mask=0xfe;
		 if(mark15s==0) P2=keymark|(mask&0x0f);
           else P2=mask;
		 i++;
		 if(i==4) i=0;
  
     }		   
 }




⌨️ 快捷键说明

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