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

📄 4个菜单 1 7上下调.txt

📁 个人单片机入门程序集合 。很适合刚学单片机的人。用的是keil proteus
💻 TXT
字号:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//数据口定义
#define lcd1602_bus P3		 

//引脚定义
sbit rs_1602=P2^5;	     
sbit rw_1602=P2^6;
sbit e_1602=P2^7;
sbit cs_549=P0^2;
sbit data_549=P0^3;
sbit clk_549=P0^4;
sbit SCL=P2^0;
sbit SDA=P2^1;


uchar state;
uchar bdata adc_549; 
sbit  adc_549low=adc_549^0; 
uchar s; 
uchar mea,m[2];
uint in[2];

//ASCII码表
/**********0---9**************/
unsigned  int  code table[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/**********a---z**************/
unsigned  int code table1[26]={0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,
                               0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a};
/***********A---Z*************/
unsigned  int code table2[26]={0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,
                               0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a};

//基本变量定义
//uchar cnt;
// unsigned int d[3];
/*
hexstoascii2(unsigned int hex)
{
d[0]=table[hex/10];
hex=hex%10;
d[1]=table[hex]; 
}

hexstoascii3(unsigned int hex)
{
d[0]=table[hex/100];
hex=hex%100;
d[1]=table[hex/10];
hex=hex%10;
d[2]=table[hex];
}
 */
/**********************************lcd1602******************************************/

/*********延时子程序**********/
void delay(uchar dy)
{
  while(--dy);
} 


/*****************启动总线**********************/
void IICStart(void)
{
    SCL=0;                 
    SDA=1;SCL=1;SCL=1;SCL=1;SCL=1;
 	SDA=0;SDA=0;SDA=0;SDA=0;SDA=0;
    SCL=0;SCL=0;SCL=0;
    SDA=1;                  
}

/*****************停止IIC总线****************/
void IICStop(void)
{
    SCL=0;SDA=0;
    SCL=1;SCL=1;SCL=1;SCL=1;
    SDA=1;SDA=1;SDA=1;SDA=1;
    SCL=0;
}

/**************检查应答位*******************/
bit IICRecAck(void)
{
    SCL=0;
    SDA=1;
    SCL=1;SCL=1;SCL=1;SCL=1;SCL=1;
    CY=SDA;          //因为返回值总是放在CY中的
    SCL=0;
    return(CY);
}

/*****************不对IIC总线产生应答***************/
void IICNoAck(void)
{
    SDA=1;
    SCL=1;SCL=1;SCL=1;SCL=1;SCL=1;SCL=0;
}

/*******************向IIC总线写数据*********************/
void IICSendByte(uchar sendbyte)
{
    uchar j;
    for(j=8;j>0;j--)
   {
       SCL=0;
       sendbyte<<=1;        //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
       SDA=CY;
       SCL=1;
   }
   SCL=0;
}

/**********************从IIC总线上读数据子程序**********/
uchar IICReceiveByte(void)
{
    uchar receivebyte,ii;
    SCL=0;
    ii=8;
    while(ii--)
   {
       SCL=1;
       receivebyte=(receivebyte<<1)|SDA;
       SCL=0;
   }
   return(receivebyte);
}


/**************************************************************************************************
*
*IIC总线写函数
*函数声明:bit IICWrite(uint address,uchar buf);
*函数参数:address为AT24C64的地址,buf为要在这个地址写的数据
*函数作用:往地址写一个字节的数据
**************************************************************************************************/
bit IICWrite(uint address,uchar buf)
{      
       bit flag;
       flag=1;
       IICStart();
       IICSendByte(0xa0);
       if(IICRecAck())
       flag=0;
       IICSendByte((uchar)(address>>8));
       if(IICRecAck())
       flag=0;
       IICSendByte((uchar)address);
       if(IICRecAck())
       flag=0;
       IICSendByte(buf);
       if(IICRecAck())
           flag=0;
       IICStop();
       delay(255);
       delay(255);
       delay(255);
       delay(255);
       return(flag);
}

uchar IICRead(uint address)
{      uchar buf;
       IICStart();
       IICSendByte(0xa0);
       if(IICRecAck())
       buf=0xff;
       IICSendByte((uchar)(address>>8));
       if(IICRecAck())
       buf=0xff;
       IICSendByte((uchar)address);
       if(IICRecAck())
       buf=0xff;
       IICStart();
       IICSendByte(0xa1);
       if(IICRecAck())
       buf=0xff;
       buf=IICReceiveByte();
                               //read last byte data
       IICNoAck();      
       IICStop();
	   delay(50);
       return(buf);
}


/**************adc_549convert*******************/
uchar adc_549convert()
{   unsigned char i;
    cs_549=1;
    cs_549=0;
    clk_549=0;
    for(i=0;i<8;i++)
    {   
		data_549=1;
	    clk_549=1;
        adc_549low=data_549;  //read one bit
        clk_549=0;
        if(i<7) adc_549=adc_549<<1;//经八次左移adc初值可以不付
    }
    clk_549=0;
    cs_549=1;
    return(adc_549);
}


/***********忙判断标志,返回一个位BF********************/
bit lcd1602_busy(void)
{
	uchar busy_flag;
	rs_1602=0;
	rw_1602=1;
	_nop_();
	e_1602=1;
	_nop_();
	lcd1602_bus=0xff;
	busy_flag=lcd1602_bus;	 //e在高电平时读 
	e_1602=0;
	return (bit)(busy_flag&0x80);    //BF=1; BUSY  返回一个位
}


/********写命令,有两个参数,一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1;
判断: 为0 
***************/
void lcd1602_wrcmd(unsigned char lcdcmd)
{
   	while(lcd1602_busy());	   //等待空闲
	lcd1602_bus=lcdcmd;
	rs_1602=0;
	rw_1602=0;
	_nop_();
	e_1602=1;
	_nop_();
	_nop_();
	e_1602=0;      //产生一个下沿	  
}



/***************向液晶写数据******************/
void lcd1602_wrdata(uchar lcddata)
{
 while(lcd1602_busy());	      //等待空闲
 lcd1602_bus=lcddata;		  //在下沿的时候写数据
 rs_1602=1;
 rw_1602=0;
 _nop_();
 e_1602=1;
 _nop_();
 _nop_();
 e_1602=0;
 //lcd_bus=0xff;
}


/************液晶的清屏************/
void lcd1602_clear(void)
{
  lcd1602_wrcmd(0x01);	   //液晶清屏控制字	并延时>40us
  delay(100);
}

/***********1602液晶的初始化***************/
void lcd1602_init(void)
{
  lcd1602_wrcmd(0x38);	    	//功能设置-----8位数据接口,两行显示,5*7点阵字符显示
  delay(100);
  lcd1602_wrcmd(0x0e);	       //显示开关控制----显示开关开,光标开关关,闪烁开关关
  delay(100);
  lcd1602_wrcmd(0x06);	       //输入方式设置,AC自增1, S=0;
  delay(100);		   
  lcd1602_wrcmd(0x01);         //清屏
  delay(100);
}


/**********4*4矩阵键盘****************/
/************
 矩阵键盘
D---------P1.0
C---------P1.1
B---------P1.2
A---------P1.3
1---------P1.4
2---------P1.5
3---------P1.6
4---------P1.7
按键值的分布
   D   C  B  A
1〔15 14 13 12〕
2〔11 10  9  8〕
3〔 7  6  5  4〕
4〔 3  2  1  0〕
利用已有的那个按键程序  
*************/

uchar getkey_ii()

{
    unsigned char keycode=0xff,temp,i;
    P1=0x0f;
    temp=P1&0x0f;
    if(temp!=0x0f)        //判是否有键按下
    {
       // beep=0;
        P1=0xef;          //自第0行开始扫描输出,自列读入键值
        for(i=0;i<4;i++)
        {
            temp=P1&0x0f;
            if(temp==0x07)     //判断第0列是否有键按下
            {    
                keycode=i*4+0;
                break;
            }
            else if(temp==0x0b)//判断第1列是否有键按下
            {
                keycode=i*4+1;
                break;                                  						  
            }
            else if(temp==0x0d)//判断第2列是否有键按下
            {
                keycode=i*4+2;
                break;
            }
            else if(temp==0x0e)//判断第3列是否有键按下
            {
                keycode=i*4+3;
                break;
            }
            P1=(P1<<1)|0x1;
        }

         while((P1&0x0f)!=0x0f)   //等待释放
         {
             P1=0x0f;
         }
    //   beep=1;                                             
        
     }
     return keycode;
}

/**********lcd1602 测试程序**********************/
//上电后lcd1602 显示  
//            "System of P.H.Y"      
//             "   Welcome!"
//
//分别按矩阵最右下角的三个按键 分别出现下面几个显示界面:
//   key=0 显示
//    		"    2005/7/28";
//			"      20:27";
//   key=1 显示
//    		"<>?+-*/()="    
//     		"`-=\[]/.,;"    
//   key=2 显示
//         "!@#$%^&*()_+|~"
//         "!@#$%^&*()_+|~"

void xianshi(uchar j)
{  	uchar str[][9]={{"1.0ne  "},{"2.two  "},{"3.three"},{"4.four "},{"1.0ne  "}};   
    uchar i;
    unsigned char offset=0x80;
          lcd1602_clear();
  	  	    lcd1602_wrcmd(offset+0x00);

             lcd1602_wrcmd(offset+0x00);
             lcd1602_wrdata('#');
         	for(i=0;i<9;i++)   lcd1602_wrdata(str[j+0][i]);    
   
          	lcd1602_wrcmd(offset+0x40);
			 lcd1602_wrdata(' ');
             for(i=0;i<9;i++)   lcd1602_wrdata(str[j+1][i]);		   
}

void main()																	  		 
{	
   
    uchar i;
//	uint t;


 
	uchar j=0;     //标记
	
	
	

	unsigned char offset=0x80;   //定义一个偏移地址变量,lcd1602 写入控制字时用到
	unsigned char key;

	delay(2);
	lcd1602_bus=0xff;
	lcd1602_init();
    lcd1602_wrcmd(offset+0x00);
    xianshi(0);  
   
	
    


//	lcd1602_clear();
    while(1)
        {  	
           
		   key=getkey_ii();
//		   hexstoascii2(count1);
//         hexstoascii3(count2);
		  if(key==4)
		  	{ 
				j=j+1;
				if(j>3)j=0;
			     xianshi(j);      
			 
			 }
		   if (key==0)
		  	{ 			 
			    if (j==0) j=4;
				j=j-1;
			    

				xianshi(j);
		      //	lcd1602_clear();
     	  	  //  lcd1602_wrcmd(offset+0x00);
								
	      	    
			//	 a=a*10+4;
			//	 xianshi(a);  
		        //lcd1602_wrcmd(offset+0x40);
				//for(i=0;i<15;i++) lcd1602_wrdata(str22[i]);
			 }
		 
     }

}

⌨️ 快捷键说明

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