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

📄 text1.c

📁 个人单片机入门程序集合 。很适合刚学单片机的人。用的是keil proteus
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char

//数据口定义
#define lcd1602_bus P0

/******************tlc549 port*********************/

sbit cs_0838=P1^3;
sbit sda_0838=P1^0;
sbit scl_0838=P1^1;

/*******************tlc5620 port***********************/
sbit load_5620=P1^5;
sbit clk_5620=P1^6;
sbit data_5620=P1^7;

/***************lcd1602 port******************************/
		
//引脚定义

sbit rs_1602=P2^5;	     
sbit rw_1602=P2^6;
sbit e_1602=P2^7;

uchar set[3];   //setting 
uchar mea[4];   //measure
uchar j;
bit b;
uchar data5620;

unsigned char bdata adc_0838;  //bdata  //bit data area
sbit  adc_0838low=adc_0838^0;   //最低位

uchar bdata u;
sbit us=u^7;

uchar code table[10]=
{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};


/**************adc_549convert*******************/
unsigned char adc_0838convert()
{  
   uchar i;
   u=0x80;
   scl_0838=0;
   sda_0838=1;
   cs_0838=0;
   _nop_();
   _nop_();
   scl_0838=1;
   _nop_();
   _nop_();
   for(i=0;i<4;i++)
   {
     scl_0838=0;
     sda_0838=us;
	 _nop_();
	 _nop_();
	 scl_0838=1;
	 u=u<<1;
   }
   sda_0838=1;
   _nop_();
   _nop_();
   scl_0838=0;
   _nop_();
   _nop_();
   adc_0838=0;
   for(i=0;i<8;i++)
   {
     adc_0838=adc_0838<<1;
     scl_0838=1;
	 _nop_();
	 _nop_();
	 scl_0838=0;
     _nop_();
	 _nop_();
     adc_0838low=sda_0838;
   }
   return(adc_0838);
}


void dac_5620(unsigned char dataa,unsigned char datab,
              unsigned char datac,unsigned char datad)
{
 unsigned char i;


 /****************dataa************/

 load_5620=1; 
 clk_5620=1; data_5620=0; clk_5620=0;
 clk_5620=1; data_5620=0; clk_5620=0;
 clk_5620=1; data_5620=0; clk_5620=0;
 for(i=0;i<8;i++)
   {
    clk_5620=1;
    if(dataa & 0x80) data_5620=1;  
       else data_5620=0;
     clk_5620=0;
    dataa=dataa<<1;
    }
 load_5620=0;
 _nop_();
 load_5620=1;


 /************datab*************/

 load_5620=1; 
 clk_5620=1; data_5620=0; clk_5620=0;
 clk_5620=1; data_5620=1; clk_5620=0;
 clk_5620=1; data_5620=0; clk_5620=0;
 for(i=0;i<8;i++)
   {
    clk_5620=1;
    if(datab & 0x80) data_5620=1;  
       else data_5620=0;
     clk_5620=0;
    datab=datab<<1;
    }
 load_5620=0;
 _nop_();
 load_5620=1;


/************datac*******************/

 load_5620=1; 
 clk_5620=1; data_5620=1; clk_5620=0;
 clk_5620=1; data_5620=0; clk_5620=0;
  clk_5620=1;data_5620=0; clk_5620=0;
 for(i=0;i<8;i++)
   {
    clk_5620=1;
    if(datac & 0x80) data_5620=1;  
       else data_5620=0;
     clk_5620=0;
    datac=datac<<1;
    }
 load_5620=0;
 _nop_();
 load_5620=1;


/***************datad***************/

 load_5620=1; 
 clk_5620=1; data_5620=1; clk_5620=0;
 clk_5620=1; data_5620=1; clk_5620=0;
 clk_5620=1; data_5620=0; clk_5620=0;
 for(i=0;i<8;i++)
   {
    clk_5620=1;
    if(datad & 0x80) data_5620=1;  
       else data_5620=0;
     clk_5620=0;
    datad=datad<<1;
    }
 load_5620=0;
 _nop_();
 load_5620=1;
 
}


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

/***********忙判断标志,返回一个位BF********************/

bit lcd1602_busy(void)
{
	unsigned char 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(unsigned char 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_1602(100);
}


/***********1602液晶的初始化***************/

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

/************键盘扫描*************/
uchar keyscan(void)
{
	uchar scancode,tmpcode;
	P3 = 0xf0;
	if ((P3&0xf0)!=0xf0)
	{
		delay_1602(125);
		if ((P3&0xf0)!=0xf0)
		{
			scancode = 0xfe;
			while((scancode&0x10)!=0)
			{
				P3 = scancode;
				if ((P3&0xf0)!=0xf0)
				{
					tmpcode = (P3&0xf0)|0x0f;
					return((~scancode)+(~tmpcode));
				}
				else scancode = (scancode<<1)|0x01;	
			}
		}
	}
	return(0);
}

void fen(unsigned int hex,uchar a[4])
{
   a[0]=table[hex/1000];
   hex=hex%1000;
   a[1]=table[hex/100];
   hex=hex%100;
   a[2]=table[hex/10];
   hex=hex%10;
   a[3]=table[hex]; 
}

void jia(n)
{
   uchar i;
   set[j]=table[n];
   lcd1602_wrcmd(0x8a-j);
   for(i=0;i<=j;i++)
     lcd1602_wrdata(set[i]);
   j++;
   data5620=data5620*10+n;      
}

   

main()
{
  uchar key,i;
  unsigned char str0[]="setting:   *10mA ";
  unsigned char str1[]="measure:    mA ";
  uchar data549=0;
  unsigned int  cov549=0;
  b=0;j=0;
  data5620=0;
  delay_1602(2);
  lcd1602_bus=0xff;
  lcd1602_init();
  lcd1602_wrcmd(0x80);
  for(i=0;i<16;i++)   
    lcd1602_wrdata(str0[i]);
  while(1)
  {
    lcd1602_wrcmd(0x8a);
    key=0;
    while(key==0)
	  key=keyscan();
	while(P3!=0xf0)
	  P3=0xf0;
    if(key==0x18)
	{
	  dac_5620(data5620,data5620,data5620,data5620);
	  b=1;j=0;
	  data549=adc_0838convert();
	  cov549=data549*19.6;
	  fen(cov549,mea);
	  lcd1602_wrcmd(0xc0);
	  for(i=0;i<14;i++)   
        lcd1602_wrdata(str1[i]);
	  lcd1602_wrcmd(0xc8);
	  for(i=0;i<4;i++)   
        lcd1602_wrdata(mea[i]);
	}
	else if(key==0x12)
	{
	   if(j>0)
	   {
	     j--;
         data5620=(data5620-(set[j]-0x30))/10;
	     lcd1602_wrcmd(0x8a-j);
         lcd1602_wrdata(0); 
         for(i=0;i<j;i++)
           lcd1602_wrdata(set[i]);   
	   }    
    }
	else
	{
	  if(j<3)
	  {
	  if(b==1)
	  {
	    set[0]=0;set[1]=0;set[2]=0;
		data5620=0;
		j=0;
  	    lcd1602_wrcmd(0xc0);
		for(i=0;i<14;i++)   
          lcd1602_wrdata(0);
        lcd1602_wrcmd(0x87);
		for(i=0;i<3;i++)   
          lcd1602_wrdata(0);
		b=0;
	  }
      switch(key)
	  {
	     case 0x14:jia(0);break;
		 case 0x28:jia(1);break;
		 case 0x24:jia(2);break;
		 case 0x22:jia(3);break;
		 case 0x48:jia(4);break;
		 case 0x44:jia(5);break;
		 case 0x42:jia(6);break;
		 case 0x88:jia(7);break;
		 case 0x84:jia(8);break;
		 case 0x82:jia(9);break;
		 default : break;
	  }
	 }
	}
  }
}

⌨️ 快捷键说明

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