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

📄 text1.c

📁 个人单片机入门程序集合 。很适合刚学单片机的人。用的是keil proteus
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong  unsigned long
//数据口定义
#define lcd1602_bus P3	
#define data P1   //the data interface between 51 and DDS(ad9850)
sbit W_CLK= P2^1;
sbit PQ_UD= P2^2;
	 

//引脚定义
sbit rs_1602=P2^5;	     
sbit rw_1602=P2^6;
sbit e_1602=P2^7;
sbit alarm=P0^0;


/*********延时子程序**********/
void delay_1ms(uint t)
{
   uint i,j;
   for(i=0;i<t;i++)
     for(j=0;j<120;j++);              
}

void delay(uchar t)
{
	uchar i;
	while(t--)
	{
		/* 对于11.0592M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
} 







/***********忙判断标志,返回一个位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(1);
}

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


/**********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;
}



void xianshu(unsigned long a)
{          unsigned long c,p=0;
				if (a!=0) 
 			{	
                
				c=a/1000000000;
				if(c!=0)
                {lcd1602_wrdata(c+0x30);
 			     p=1;
				 }
                 c=(a%1000000000)/100000000;
                 if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }
                 c=(a%100000000)/10000000;
                 if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }

                 c=(a%10000000)/1000000;
                 if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }
                  c=(a%1000000)/100000;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }
                 c=(a%100000)/10000;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }               
                c=(a%10000)/1000;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }
                
				c=(a%1000)/100;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }
                
				c=(a%100)/10;
                if(c!=0 || p==1)
                 {lcd1602_wrdata(c+0x30);
 			      }
                
	            c=a%10+0x30;
         	    lcd1602_wrdata(c);   
				
            }
}


void xianshi(uchar j)
{  	uchar str[][9]={{"1.sin   "},{"2.date  "},{"3.set F "},{"4.set dF"},{"1.sin   "}};   
    uchar i;
    unsigned char offset=0x80;
          lcd1602_clear();
  	  	    lcd1602_wrcmd(offset+0x00);

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


void ad9850(ulong f) 
{ 
  uint i,ch;	
   delay_1ms(100);
   W_CLK=0;PQ_UD=0;

      if(P2^3==0)   //step up
      {ch++;delay_1ms(500);}
       else if(P2^4==0){ch--;delay_1ms(500);}    //step down
  
     data=00;		       //5个字节数据的第一个,高5位控制相位A(0-32) 所以初相位大小为360/A 最小分辨率为11。25度;
     W_CLK=1;_nop_();
     W_CLK=0;_nop_();
    
/*	 data=f>>24;			//第1个数据 取最32位中的高8位
     W_CLK=1;_nop_();
     W_CLK=0;_nop_();

     f=f<<8;				 	//第2个数据 取最32位中的高9-16位
	 data=f>>24
     W_CLK=1;_nop_();
     W_CLK=0;_nop_();

	 f=f<<8;					   	//第3个数据 取最32位中的高17-24位
     data=f>>24;
     W_CLK=1;_nop_();
     W_CLK=0;_nop_();
	 
	 f=f<<8;					   //第4个数据 取最32位中的底8位
	 data=f>>24;
     W_CLK=1;_nop_();
     W_CLK=0;_nop_();			   //用下面的FOR语言描写更方便巧妙
  */

   for(i=0;i<4;i++)      //32bit control words
      {
     data=f>>24;
	 f=f<<8;
     W_CLK=1;_nop_();
     W_CLK=0;_nop_();
       }
    PQ_UD=1;_nop_();  //   update fre word
    PQ_UD=0;_nop_();
 

 


  
  lcd1602_clear();
  xianshu(f);
  lcd1602_wrdata('H');
  lcd1602_wrdata('Z');
  



}



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

   
 
	uchar j=0;     //标记
	ulong a,b=1000 ;  //a用来记录频率;b用来记录频率间隔(开始是为1000HZ)
	
	
    uchar d[]="please insert F:";
	uchar w[]="please insert dF:" ;


	uchar str0='A';
	uchar str1='3';
	uchar str2='2';
    uchar str3='1';

⌨️ 快捷键说明

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