蓝桥杯备赛

虚短 理解成短路,两输入端视为等电位,正负输入端电压相等。电压相等。虚断 理解成短路,两输入端视为开路,流入正负输入端电流为0,电流为0

20lg放大倍数=电压增益

双向口,推挽输出,高阻输入,开漏输出   存储器容量:数据线位数×2的地址线次方

只有超声波是 12T   时钟过去的 = 现在的;现在的 = 采集到的;

超声波(0,0)、NE555(2,1;1,5)、数码管(2,1)

串口(1,波)、NE555(2,1;0,5)、数码管(2,1)

串口在NE555:在串口发送完数据之后,再加一句“t_flag=1;”

串口(1,波)、超声波(0,0)、数码管(2,1)

EEPROM_write(ADD,wendu); Delayms(2); ADD++; if(ADD==n) ADD=0X00;

n:数据总个数+1(组)再转换为16进制(1组数据里面有1个就+1,有6个就+6)

遇到多数据存储 读出来数据不对的,可以把读存储的程序放在while循环内

双击原理:在原来长按短按的基础上修改。增加一个总计时标志位和记录按下次数的变量。
按键一按下,总计时标志位置1,总计时开始计时,直到1100毫秒结束,
并将总计时标志位置2。判断时满足两个条件:总计时标志位置2和按键松开。
然后对记录按下次数 分为 1次和2次进行判断,一次的再判断长按还是短按。

/*****************************NE555*****************************/
uchar	t_flag=0;
uint	zheng,fan,zheng_now,fan_now,intr, time_zheng,time_fan;//正反周期
void timer0() interrupt 1//  5微秒,关掉TR0/1
{    if(P34==0) {fan++; if(t_flag==0) {t_flag=1;zheng_now=zheng;zheng=0;} }
	else if(P34==1) {zheng++; if(t_flag==1) {t_flag=0;fan_now=fan;fan=0;} }  }
void timer1() interrupt 3//  1毫秒
{   intr++; if(intr==969)  {TR0=1;ET0=1;}
	else if(intr==999)  {intr=0;TR0=0;ET0=0;T=(fan_now+zheng_now)*5;frep=1000000/T;} }

/***************************串口************************/
#include    sbit TX = P1^0; sbit RX = P1^1; bit receive_over=0;
unsigned char TX_chuankou[] = "A\r\n";//发送一组数据
unsigned char RX_chuankou[4],receive_num=0,chuanshu_shuju=0;uchar receive_tt=0; 
void UART1() interrupt 4   //串口1中断
{    if(RI)//RI 不为0
	{   RX_chuankou[receive_num] = SBUF; receive_num++;
receive_tt=1;//每接收到一次数据,就让接收计时变量置1. RI=0;  }
	if(receive_over==1)//数据接收完成之后 进行判断
	{	if((RX_chuankou[0]=='S')&(RX_chuankou[1]=='T')) {chuanshu_shuju=1;}
	    else if((RX_chuankou[0]=='A')&(RX_chuankou[1]=='A')) {chuanshu_shuju=2;}  }
}
void UART_TX(unsigned char *p)//发送数据函数,发送数组的话,这里就要定义一个指针 
{    unsigned char index=0;    //应用于:单片机向电脑发送数据 
do { SBUF=p[index++];while(TI == 0);TI = 0;//发送完,置0 }  while(p[index]!=0); }
中断2中添加:if(receive_tt>=1) 
{  receive_tt++;  if(receive_tt>=30) {receive_tt=0;receive_over=1;//接收数据完毕}  }
while循环中添加:if(chuanshu_shuju==1) 
{   sprintf((char*)TX_chuankou,"ONE\r\n");  UART_TX(TX_chuankou);
	chuanshu_shuju=0;receive_over=0;receive_num=0;  }
else if(chuanshu_shuju==2)//查询参数指令
{   sprintf((char*)TX_chuankou,"TWO\r\n"); UART_TX(TX_chuankou); 
	chuanshu_shuju=0;receive_over=0;receive_num=0;  }
while循环前添加:UartInit();ES=1;EA=1;
波特率生成器生成

/******超声波*****16微秒延时;0微秒定时器 注释TR0/1*******/
#include   sbit TX = P1^0; sbit RX = P1^1; 
unsigned int LCM_tt=0,LCM = 0,LCM_Time=0;//间隔多长时间进行一次超声波测量
bit LCM_Ref = 0 ;//超声波开始测量的标志位
中断2里面添加:if(++LCM_tt==300)  {LCM_tt=0;LCM_Ref=1;}
void Send_wave()  //发送超声波信号 
{ uchar i=8; do{TX=1;Delay16us(); TX=0;Delay16us();} while(i--); }
void Csb_work()//这个放在 while 循环里面
{   if(LCM_Ref==1)
	{   LCM_Ref=0; Send_wave(); TR1=1;  while((RX==1)&&(TF1==0));  
TR1=0;  if(TF1==1) {TF1=0; LCM=9999;}
		else
		{// 定时器计数一次需要 1/1000000秒(1/12000000/12)(12M晶振),
			LCM_Time = TH1;LCM_Time <<= 8;LCM_Time |= TL1;
			LCM=(uint)(LCM_Time*17/1000);
// 总共计数了 LCM_Time次。LCM_Time * 1/1000000 * 17000(34000/2) 厘米
		}   TL1=0X00;TH1=0X00;  //清零方便下次计数	
	} 
}

iic c h

/*	#   I2C浠g爜鐗囨璇存槑
	1. 	鏈枃浠跺す涓彁渚涚殑椹卞姩浠g爜渚涘弬璧涢€夋墜瀹屾垚绋嬪簭璁捐鍙傝€冦€?
	2. 	鍙傝禌閫夋墜鍙互鑷缂栧啓鐩稿叧浠g爜鎴栦互璇ヤ唬鐮佷负鍩虹锛屾牴鎹墍閫夊崟鐗囨満绫诲瀷銆佽繍琛岄€熷害鍜岃瘯棰?
		涓鍗曠墖鏈烘椂閽熼鐜囩殑瑕佹眰锛岃繘琛屼唬鐮佽皟璇曞拰淇敼銆?
*/
#include "iic.h"

#define DELAY_TIME	40

//
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
//void I2CSendAck(unsigned char ackbit)
//{
//    scl = 0;
//    sda = ackbit; 
//	I2C_Delay(DELAY_TIME);
//    scl = 1;
//	I2C_Delay(DELAY_TIME);
//    scl = 0; 
//	sda = 1;
//	I2C_Delay(DELAY_TIME);
//}

uchar AD_read(uchar add)
{
	uchar temp;
	
	I2CStart();
	I2CSendByte(0X90);
	I2CWaitAck();
	I2CSendByte(add);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0X91);
	I2CWaitAck();	
	temp=I2CReceiveByte();
	I2CStop();
	
	return temp;
}

uchar EEPROM_read(uchar add)
{
	uchar temp;
	
	I2CStart();
	I2CSendByte(0XA0);
	I2CWaitAck();
	I2CSendByte(add);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0XA1);
	I2CWaitAck();	
	temp=I2CReceiveByte();
	I2CStop();
	
	return temp;
}

void EEPROM_write(uchar add,uchar dat)// EEEPROM 瀛樺偍
{
	I2CStart();
	I2CSendByte(0XA0);
	I2CWaitAck();
	I2CSendByte(add);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}

//void DA_write(uchar dat)// EEEPROM 瀛樺偍
//{
//	I2CStart();
//	I2CSendByte(0X90);
//	I2CWaitAck();
//	I2CSendByte(0X40);
//	I2CWaitAck();
//	I2CSendByte(dat);
//	I2CWaitAck();
//	I2CStop();
//}


/********************************************************************/
#ifndef _IIC_H
#define _IIC_H

#include 
#include "intrins.h"

#define uchar unsigned char
#define uint unsigned int

sbit sda = P2^1;
sbit scl = P2^0;

void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); 
uchar AD_read(uchar add);
uchar EEPROM_read(uchar add);
void EEPROM_write(uchar add,uchar dat);// EEEPROM 瀛樺偍
void DA_write(uchar dat);// EEEPROM 瀛樺偍
	
#endif

ds1302 c h

/*	# 	DS1302浠g爜鐗囨璇存槑
	1. 	鏈枃浠跺す涓彁渚涚殑椹卞姩浠g爜渚涘弬璧涢€夋墜瀹屾垚绋嬪簭璁捐鍙傝€冦€?
	2. 	鍙傝禌閫夋墜鍙互鑷缂栧啓鐩稿叧浠g爜鎴栦互璇ヤ唬鐮佷负鍩虹锛屾牴鎹墍閫夊崟鐗囨満绫诲瀷銆佽繍琛岄€熷害鍜岃瘯棰?
		涓鍗曠墖鏈烘椂閽熼鐜囩殑瑕佹眰锛岃繘琛屼唬鐮佽皟璇曞拰淇敼銆?
*/		
// 7-13 琛?鑷繁鍐?
#include "ds1302.h"

sbit SCK = P1^7;		
sbit SDA = P2^3;		
sbit RST = P1^3; 

unsigned char shijian[]={50,59,23,0,0,0,0};

//
void Write_Ds1302(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK = 0;
		SDA = temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

//
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
 	RST=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	SCK=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	RST=1; 	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();  
 	Write_Ds1302(address);	
 	Write_Ds1302(((dat/10)<<4)|(dat%10));		
 	RST=0; 
}

//
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
 	unsigned char i,temp=0x00,dat1,dat2;
 	RST=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	SCK=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	RST=1;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	Write_Ds1302(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
 	RST=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 	SCK=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	SCK=1;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	SDA=0;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	SDA=1;	_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	
	dat1=temp/16;//杩欎笁琛岀▼搴忎篃鏄?鍥哄畾 60S 涓轰竴鍛ㄦ湡
	dat2=temp%16;
  temp=dat1*10+dat2;
	
	return (temp);			
}

void DS_init()//鍒濆鍖栫▼搴?
{
	unsigned char i,add;
	
	add=0X80;//鍐?
	Write_Ds1302_Byte(0X8E,0X00);//鎵撳紑寰€閲岄潰 鍐?鏁版嵁鐨勬搷鎺?
	for(i=0;i<7;i++)
	{
		Write_Ds1302_Byte(add,shijian[i]);
		add=add+2;
	}
	Write_Ds1302_Byte(0X8E,0X80);//鍏抽棴寰€閲岄潰 鍐?鏁版嵁鐨勬搷鎺?
}

void DS_get()//璇诲彇鏃堕棿绋嬪簭
{
	unsigned char  i,add;
	
	add=0X81;//璇?
	Write_Ds1302_Byte(0X8E,0X00);//鎵撳紑寰€閲岄潰 鍐?鏁版嵁鐨勬搷鎺?
	for(i=0;i<7;i++)
	{
		shijian[i]=Read_Ds1302_Byte(add);
		add=add+2;
	}
	Write_Ds1302_Byte(0X8E,0X80);//鍏抽棴寰€閲岄潰 鍐?鏁版嵁鐨勬搷鎺?
}

/***************************************************************/
#ifndef __DS1302_H
#define __DS1302_H

#include 
#include 

void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
void DS_init();//初始化程序
void DS_get();

#endif

ds18b20  c h

/*	# 	鍗曟€荤嚎浠g爜鐗囨璇存槑
	1. 	鏈枃浠跺す涓彁渚涚殑椹卞姩浠g爜渚涘弬璧涢€夋墜瀹屾垚绋嬪簭璁捐鍙傝€冦€?
	2. 	鍙傝禌閫夋墜鍙互鑷缂栧啓鐩稿叧浠g爜鎴栦互璇ヤ唬鐮佷负鍩虹锛屾牴鎹墍閫夊崟鐗囨満绫诲瀷銆佽繍琛岄€熷害鍜岃瘯棰?
		涓鍗曠墖鏈烘椂閽熼鐜囩殑瑕佹眰锛岃繘琛屼唬鐮佽皟璇曞拰淇敼銆?
*/

#include "onewire.h"

#define uchar unsigned char
#define uint unsigned int

//
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

//
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

uchar Tempget()//璇诲嚱鏁皀  鑷繁鍐?
{
	unsigned char low,high;//璇诲彇娓╁害鐨?浣庝綅 鍜?楂樹綅
	//unsigned long temp;
	unsigned char temp;
	
	init_ds18b20();//鍒濆鍖?ds18b20
	Write_DS18B20(0XCC);//蹇界暐 ROM 鎸囦护
	Write_DS18B20(0X44);//寮€濮嬭繘琛屾俯搴﹁浆鎹㈢殑鍔熻兘鎸囦护
	Delay_OneWire(200);//杩涜寤惰繜
	
	//涓婇潰鎿嶄綔瀹屾垚鍚庯紝DS18B20浼氬娓╁害杩涜璇诲彇
	//涓嬮潰瀵硅鍙栫殑娓╁害杩涜杞崲 
	
	init_ds18b20();//鍐嶆杩涜鍒濆鍖?
	Write_DS18B20(0XCC);
	Write_DS18B20(0XBE);//璇绘殏瀛樺櫒鎸囦护锛屾俯搴﹂兘鍑烘潵涔嬪悗浼氬瓨鍌ㄥ埌鏆傚瓨鍣ㄩ噷锛屾墍浠ヨ鎶婂畠璇诲嚭鏉?
	   
	low=Read_DS18B20();//璇诲彇DS18B20鐨勬俯搴︽暟鎹?
	high=Read_DS18B20();
	
/********涓嬮潰鏄鍙栨俯搴︾殑甯﹀皬鏁板啓娉?******************/		
	
//	temp=(high&0x0f);  //0000 1010;  1010 0000 鍙栨秷姝h礋鏄剧ず
//	temp <<=8;
//	temp|=low;
//	
//	temp=temp*625;     //绮惧害涓?0.0625锛屽皢瀹為檯娓╁害鎵╁ぇ浜?0000鍊?
/********涓嬮潰鏄鍙栨俯搴︾殑鏁存暟鍐欐硶*******************/

	temp=high<<4;//鍚戝乏绉?浣? 鍘绘帀琛ㄧず姝h礋鐨勪綅
	temp|=(low>>4);//鍚戝彸绉?浣? 鍘绘帀琛ㄧず灏忔暟鐨?浣?
	
	return temp;
}

/*******************************************************************/
#ifndef __ONEWIRE_H
#define __ONEWIRE_H

#include 

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P1^4;  

unsigned char rd_temperature(void);  
//long Tempget();//读函数n  自己写 
uchar Tempget();//读函数n  自己写 

#endif

 长按、短按、双击

/*
实现功能:对于S7按键,长按、短按、双击分别实现不同功能
*/
#include 

#define uchar unsigned char
#define uint unsigned int
	
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar Smg_num=0;
uchar Smg[]={0,8,10,4,0,10,1,1};

uchar S7_num=0,LED_Bit=0XFF,SS7_flag=0;
bit led3_flag=0,led1_flag=0,led2_flag=0,S7_flag=0;
uint S7_tt=0,SS7_tt=0;

void Allinit();
void Delayms(uint ms);
void Keyscan();
void Keyscan16();
void Timer2Init(void);		//1毫秒@12.000MHz

void main()
{
	Allinit();
	Timer2Init();
	while(1)
	{
		if(led1_flag==1)
		{
			LED_Bit&=0XFE;P0=LED_Bit;P2|=0X80;P2&=0X9F;P2&=0X1F;
			LED_Bit|=0X02;P0=LED_Bit;P2|=0X80;P2&=0X9F;P2&=0X1F;
			LED_Bit|=0X04;P0=LED_Bit;P2|=0X80;P2&=0X9F;P2&=0X1F;
		}
		else if(led2_flag==1)
		{
			LED_Bit&=0XFD;P0=LED_Bit;P2|=0X80;P2&=0X9F;P2&=0X1F;
			LED_Bit|=0X01;P0=LED_Bit;P2|=0X80;P2&=0X9F;P2&=0X1F;
			LED_Bit|=0X04;P0=LED_Bit;P2|=0X80;P2&=0X9F;P2&=0X1F;
		}
		else if(led3_flag==1)
		{
			LED_Bit&=0XFB;P0=LED_Bit;P2|=0X80;P2&=0X9F;P2&=0X1F;
			LED_Bit|=0X02;P0=LED_Bit;P2|=0X80;P2&=0X9F;P2&=0X1F;
			LED_Bit|=0X01;P0=LED_Bit;P2|=0X80;P2&=0X9F;P2&=0X1F;
		}
		Keyscan();
		//Keyscan16();
		//Delayms(5);
	}
}

void timer2() interrupt 12
{
	P0=0XFF;
	P2|=0XC0;
	P2&=0XDF;
	P2&=0X1F;
	
	P0=0XFF;
	P2|=0XE0;
	P2&=0XFF;
	P2&=0X1F;
	
	P0=(1<=100))
			{
				led1_flag=1;S7_tt=0;led2_flag=0;led3_flag=0;//S7_double_flag=0;
			}
			else if(S7_tt>=1000)
			{
				led2_flag=1;S7_tt=0;led1_flag=0;led3_flag=0;//S7_double_flag=0;
			}
		}
		else if(S7_num==2)
		{
			led3_flag=1;S7_tt=0;led1_flag=0;led2_flag=0;S7_num=0;
		}
	}
	
	if(SS7_flag==1)
	{
		SS7_tt++;
		if(SS7_tt==1100)
		{
			SS7_tt=0;SS7_flag=2;
		}
	}
}

/*
双击原理:在原来长按短按的基础上修改。增加一个总计时标志位和记录按下次数的变量。
按键一按下,总计时标志位置1,总计时开始计时,直到1100毫秒结束,
并将总计时标志位置2。判断时满足两个条件:总计时标志位置2和按键松开。
然后对记录按下次数 分为 1次和2次进行判断,一次的再判断长按还是短按。
*/

void Timer2Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0x20;		//设置定时初始值
	T2H = 0xD1;		//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时

	IE2|=0X04;EA=1;
}

void Keyscan16()
{
	uchar temp;
	
	P3=0X7F;P42=1;P44=0;
	temp=P3;
	temp=temp&0X0F;
	if(temp!=0X0F)
	{
		Delayms(5);
		temp=P3;
		temp=temp&0X0F;
		if(temp!=0X0F)
		{
			temp=P3;
			switch(temp)
			{
				case 0X7E:Smg[0]=1;break;
				case 0X7D:Smg[1]=2;break;
				case 0X7B:Smg[2]=3;break;
				case 0X77:Smg[3]=4;break;
			}
			while(temp!=0X0F)
			{
				temp=P3;
				temp=temp&0X0F;
			}
		}
	}
	
	P3=0XBF;P42=0;P44=1;
	temp=P3;
	temp=temp&0X0F;
	if(temp!=0X0F)
	{
		Delayms(5);
		temp=P3;
		temp=temp&0X0F;
		if(temp!=0X0F)
		{
			temp=P3;
			switch(temp)
			{
				case 0XBE:Smg[4]=5;break;
				case 0XBD:Smg[5]=6;break;
				case 0XBB:Smg[6]=7;break;
				case 0XB7:Smg[7]=8;break;
			}
			while(temp!=0X0F)
			{
				temp=P3;
				temp=temp&0X0F;
			}
		}
	}
	
	P3=0XDF;P42=1;P44=1;
	temp=P3;
	temp=temp&0X0F;
	if(temp!=0X0F)
	{
		Delayms(5);
		temp=P3;
		temp=temp&0X0F;
		if(temp!=0X0F)
		{
			temp=P3;
			switch(temp)
			{
				case 0XDE:Smg[0]=1;break;
				case 0XDD:Smg[1]=2;break;
				case 0XDB:Smg[2]=3;break;
				case 0XD7:Smg[3]=4;break;
			}
			while(temp!=0X0F)
			{
				temp=P3;
				temp=temp&0X0F;
			}
		}
	}
	
	P3=0XEF;P42=1;P44=1;
	temp=P3;
	temp=temp&0X0F;
	if(temp!=0X0F)
	{
		Delayms(5);
		temp=P3;
		temp=temp&0X0F;
		if(temp!=0X0F)
		{
			temp=P3;
			switch(temp)
			{
				case 0XEE:Smg[0]=8;break;
				case 0XED:Smg[1]=8;break;
				case 0XEB:Smg[2]=8;break;
				case 0XE7:Smg[3]=8;break;
			}
			while(temp!=0X0F)
			{
				temp=P3;
				temp=temp&0X0F;
			}
		}
	}
}

void Keyscan()
{
	if(P30==0)
	{
		Delayms(5);
		if(P30==0)
		{
			S7_flag=1;SS7_flag=1;
			if(S7_num==0) S7_num=1;
			else if(S7_num==1) S7_num=2;
		}
		while(!P30);
	}
	
	else if(P30==1)
	{
		S7_flag=0;
		if(P31==0)
		{
			Delayms(5);
			if(P31==0)
			{
				Smg[1]=2;
			}
			while(!P31);
		}

		else if(P32==0)
		{
			Delayms(5);
			if(P32==0)
			{
				Smg[2]=3;
			}
			while(!P32);
		} 
		
		else if(P33==0)
		{
			Delayms(5);
			if(P33==0)
			{
				Smg[3]=4;
			}
			while(!P33);
		} 
	}
}

void Allinit()
{
	P2|=0XA0;P2&=0XBF;P0=0X00;
	
	P2|=0X80;P2&=0X9F;P0=0XFF;
	
	P2|=0XC0;P2&=0XDF;P0=0XFF;
	P2|=0XE0;P2&=0XFF;P0=0XFF;
}

void Delayms(uint ms)
{
	uint i,j;
	for(i=ms;i>0;i--)
	for(j=910;j>0;j--);
}

其他

uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,//0-9
	             0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,//0.-9.
                             0XBF,0XFF,0X8E,0XC1};//- 关 F U

10 继电器 40 蜂鸣器 50

从左到右:LED_Bit&=~(0X01<>i);LED_Bit|=(0X80>>(i-1));

蓝桥杯备赛_第1张图片

 

你可能感兴趣的:(单片机)