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

📄 pwmdac.c

📁 基于at89s52的步进电机c语言程序
💻 C
字号:
//=======================1602常用指令集============================
//           LcdWriteCommand(0x01);  					//清显示
//           LcdWriteCommand(0x02);  					//光标复位
//           LcdWriteCommand(0x0E);                      //光标开显示,不闪烁.
//           LcdWriteCommand(0x0F);                      //光标开显示,并闪烁.
//			 LcdWriteCommand(0x10);                      //光标左移一个位置.
//			 LcdWriteCommand(0x14);                      //光标右移一个位置.
//			 LcdWriteCommand(0x18);                      //字符和光标一起左移一个位置
//			 LcdWriteCommand(0x1c);                      //字符和光标一起右移一个位置
//           LcdWriteCommand(0x0c);                      // 显示开及关光标显示
//=============================================================================
//================= LCM1602A端口地址定义 =======================

//#define   RS      0x00000400     // P0.10引脚控制,低电平点亮
//#define   RW      0x00000800     // P0.11引脚控制,低电平点亮
//#define   E       0x00001000     // P0.12引脚控制,低电平点亮
//#define  Lcd1602Port         0x00003c00    //

#include "lcd1602.h"
#include"chengnong.h"


#define Lcd1602_E           0x00001000
#define Lcd1602Cmd          0x00001000           //E=1 RS=0 RW=0    向lcd1602写入指令, 
#define Lcd1602Wdata        0x00001400           //E =1 RS=1 RW=0   向lcd1602写入数据,

//#define Lcd1602Cmd          0x00000c00           //E=1 RS=0 RW=0    向lcd1602写入指令,现已经取反   
//#define Lcd1602Wdata        0x00000400           //E =1 RS=1 RW=0   向lcd1602写入数据,现已经取反
//#define Lcd1602Status       0x00001400         //E=1 RS=0 RW=1    读取lcd1602状态,现已经取反

/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<50000; i++);
}

/****************************************************************************
* 名称:HC595_SendDat()
* 功能:向74HC595发送一字节数据
* 入口参数:dat		要发送的数据
* 出口参数:无
* 说明:发送数据时,高位先发送。
****************************************************************************/
void  HC595_SendDat(uint8 dat)
{  uint8  i;

   IOCLR = SPI_CS;			    // SPI_CS = 0
   for(i=0; i<8; i++)			// 发送8位数据
   {  IOCLR = SPI_CLK;			// SPI_CLK = 0
      /* 设置SPI的DATA输出值 */
      if( (dat&0x80)!=0 ) IOSET = SPI_DATA;
        else IOCLR = SPI_DATA;
      dat <<= 1;
      IOSET = SPI_CLK;			// SPI_CLK = 1
   }
   
   IOSET = SPI_CS;			    // SPI_CS = 1,输出显示数据
}

//==============================================================
//    液晶写使能函数,使能位E由高到低电平1602才写入数据
//==============================================================
void Lcd_En_write(void)
{
  IOSET = Lcd1602_E;
  IOSET = Lcd1602_E;
  IOSET = Lcd1602_E;
  IOSET = Lcd1602_E;
  IOSET = Lcd1602_E;
  IOSET = Lcd1602_E;
  
  IOCLR = Lcd1602_E;
  IOCLR = Lcd1602_E;
  IOCLR = Lcd1602_E;
  IOCLR = Lcd1602_E;
  IOCLR = Lcd1602_E;
  IOCLR = Lcd1602_E;
}

//=======================================================
//			写显示数据函数
//=======================================================
void LcdWriteData( uint8 dataW ) 
	{    
   
     IOCLR = Lcd1602Port;			 
	 IOSET = Lcd1602Wdata;	       //E =1 RS=1 RW=0   向lcd1602写入数据
     HC595_SendDat(dataW);
     
     Lcd_En_write();    //写使能

    }
    
//=======================================================
//			写控制字函数
//=======================================================
void LcdWriteCommand( uint8 CMD ) 
	{
     
	 IOCLR = Lcd1602Port;			 
	 IOSET = Lcd1602Cmd;	      //E =1 RS=1 RW=0   向lcd1602写入数据
     HC595_SendDat(CMD);
     
     Lcd_En_write();         //写使能

    }
    
//=======================================================
//            显示光标定位
//=======================================================
void LocateXY( int8 posx,int8 posy)// posy只能取1,2
	{
     uint8 temp;
     temp = posx & 0x0f;//posx与上00001111
     if(posy == 1)      //显示在第一行
       {
         temp |= 0x80;
       }
     else if(posy == 2)   //显示在第二行
           {
            temp |= 0xC0;   // 相当于  temp |= 0x40;  temp |= 0x80;
           }
     
     LcdWriteCommand(temp);
    }
//=======================================================
//            按指定位置显示数出一个字符                                                       
//=======================================================
void DisplayOneChar(uint8 x,uint8 y,uint8 Wdata) 
	{     
     LocateXY( x, y );//定位显示地址
     
     DelayMs(5);       //**************要注意延时*************
     
     LcdWriteData( Wdata );//写字符
    }
//=======================================================
//             显示字符串
//=======================================================
void ePutstr(uint8 x,uint8 y, uint8  *ptr) 
	{
     uint8 i,l=0;
     while (ptr[l]>31)
		{
		l++;
		};
     for(i=0;i<l;i++) 
		{
          DisplayOneChar(x++,y,ptr[i]);
          DelayMs(5);    //要延时
          if( x == 16 )
			{
              x  = 0;
			  y ^= 1;
            }
        }
    }
    
//=======================================================
//             显示无符号整数
//=======================================================
void ePutUint(uint8 x,uint8 y, uint32 z)
    {uint8 i;
	 while(z)
	    {i=z%10;
	     z=z/10;
	     DisplayOneChar(x--,y,i+0x30);
	     
	     DelayNS(5);     //要延时,否则会反向显示
	    }
	}   

//=======================================================
//           初始化程序, 必须按照产品资料介绍的初始化过程进行
//=======================================================
void LcdReset( void )
	{     
     LcdWriteCommand( 0x38);                      // 显示模式设置(不检测忙信号)
            DelayNS(5);
     LcdWriteCommand( 0x38);                      // 共三次
            DelayNS(5);
     LcdWriteCommand( 0x38);
            DelayNS(5);      
    
	 LcdWriteCommand( 0x38);                      // 显示模式设置(以后均检测忙信号)
     DelayNS(5);    //要延时,否则会不显示
     LcdWriteCommand( 0x08);                      // 显示关闭
     DelayNS(5);    //要延时,否则会不显示
     LcdWriteCommand( 0x01);                      // 显示清屏
     DelayNS(5);    //要延时,否则会不显示
     LcdWriteCommand( 0x06);                      // 显示光标移动设置
     DelayNS(5);    //要延时,否则会不显示
     LcdWriteCommand( 0x0c);                      // 显示开及光标设置
     
    }
    
    
 
/****************************************************************************
* 名称:main()
* 功能:控制LED数码管显示,并控制LED1、LED2、LED3、LED4显示。
****************************************************************************/
int  main(void)
{  
              
    PINSEL0 = 0x00080008;			// 设置PWM6连接到P0.9管脚,置PWM3连接到P0.1管脚,其余所有管脚连接GPIO
    PINSEL1 = 0x00000000;
  
   //IODIR = SPI_IOCON|CarDirection;			// 设置SPI控制口,车方向控制接口
   IODIR = SPI_IOCON|Lcd1602Port;			// 设置SPI控制口,液晶1602控制口为输出

   //********************************************************************** 
   // TargetInit();				//PWM初始化, 定时器0初始化(target.c文件)
   //**********************************************************************
    
   //**********************************************************************
   LcdReset( );           //1602初始化
   //**********************************************************************
   DelayNS(50);
   DisplayOneChar(6,2,'m'); 
  
   DelayNS(5);
   DisplayOneChar(6,2,'a');
    
   DelayNS(5);
   DisplayOneChar(6,2,'t');
   
   DelayNS(5);
   DisplayOneChar(6,2,'o'); 
  DelayNS(5);
   DisplayOneChar(6,2,'u'); 
   DelayNS(5);
  // ePutstr(5,1, "12345");
  //ePutUint(5,1, 12345);
   //IOCLR = Lcd1602Port;			 
   //IOSET = 0x30000000;	       //E =1 RS=1 RW=0   向lcd1602写入数据
   while(1)	
   { 
      /*HC595_SendDat(DISP_TAB[Speed]);        //用于指示作用
      SpeedTest();
      Carmode();*/
   }
   return(0);
}

   

⌨️ 快捷键说明

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