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

📄 题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;
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=0;  
   key1=0;
  if (P37==0)
     key1_mark=1;
  if(P37==1&&key1_mark==1)
     {key_code=1;key1_mark=0;keypress=1;}
	 key1=1;
    key2=0;
    if (P37==0)
	   key2_mark=1;
     if(P37==1&&key2_mark==1)
       {key_code=2;key2_mark=0;keypress=1;}
	 key2=1;
	key3=0;
    if (P37==0)
         key3_mark=1;	   
     if(P37==1&&key3_mark==1)
	  { key_code=3;key3_mark=0;keypress=1;}
	 key3=1;

    key4=0;
     if (P37==0)
	      key4_mark=1;
    if(P37==1&&key4_mark==1)
	   {key_code=4;key4_mark=0;keypress=1;}
    key4=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) 
                 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]]);
	     P2=mask;
		 delay(22);
         mask=_crol_(mask,1);
         if(mask==0xef) mask=0xfe;
		 i++;
		 if(i==4) i=0;		  
     }		   
 }




⌨️ 快捷键说明

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