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

📄 lcd绘制三角波、方波、正弦波曲线程序.c

📁 通过LCD显示各种常见波形
💻 C
字号:
     //ST7920控制器串行方式C语言演示程序/
     #include <AT89X51.H>
     #include <intrins.h>
     #include <math.h>

     #define  uchar unsigned char
     #define  uint  unsigned int

     #define  RS         P1_5
     #define  RW         P1_6
     #define  E          P1_7 

     uchar    com,dat;

     void    Delay1ms(uint time);
     void    initialization(void);
     void    writecom(uchar com);
     void    writedat(uchar com);
     void    Gra(uchar x,uchar y);
     void    Clear(void);
     void    drawarc(uchar a,uchar b,uchar r); 

/************************************************************
*Function:                  主函数  
*************************************************************/  
 void main(void)
          { uchar  i=0,j=0;
            uchar  x=0,y=0;
            float  a=0,b=0;

            initialization();
            Clear();  
            while(1)
              {
                 for(x=0;x<128;x++)           //绘制三角波程序   //x坐标从0到128  
                  { if(x&0x20)
                     {y=(x&0x1f)+16;}
                    else
                     {y=48-(x&0x1f);}
                    Gra(x,y);
                    Delay1ms(50);
                  } 
                Delay1ms(2000);
                Clear(); 

                for(x=0;x<128;x++)           //锯齿波程序     
                  { {y=(x&0x1f)+16;}
                     Gra(x,y);
                   if(x==32||x==64||x==96)
                      {for(j=16;j<48;j++)
                          {Gra(x,j);}
                    }
                    Delay1ms(50);
                  } 
                Delay1ms(2000);
                Clear(); 
                for(x=0;x<128;x++)           //方波程序     
                  { if(x&0x10)
                      {Gra(x,48);}
                    else                   
                      {Gra(x,16);}
                    if(x==32||x==64||x==96||x==16||x==48||x==80||x==112)
                      {for(j=16;j<48;j++)
                       {Gra(x,j);}
                    }
                    Delay1ms(50);
                  } 
                Delay1ms(2000);
                Clear(); 

                for(x=0;x<128;x++)           //正弦波程序     
                  { a=x;
                    a=a/5;
                    b=sin(a);
                    b=b*32+32;
                    y=(uchar)b;
                    Gra(x,y);
                    Delay1ms(50);                
                  } 
               Delay1ms(2000);
               Clear();   
              }
          }
/************************************************************
*Function:     测试I/O口的状态
*************************************************************/        
     void chk_busy(void)             //测忙
         { uchar sign;
           RS=0;
           RW=1;
           E=1;
           for(;;)
              { P0=0xff;             //P1口置高,准备读数
                E=1;
                sign=P0;             //读忙信号
                E=0;                 //产生一个下降延
                if(sign<0x80)        //不忙则跳出循环
                  break;
              }
           E=0;
         }
/************************************************************
*Function:         写控制字
*parameter:    uchar com  要写的命令   
*Return:             无
*Modify:           改变j
*************************************************************/   
     void  writecom(uchar com)
          { chk_busy();          
            RS=0;
            RW=0;                    
            P0=com;                   
            E=1;
            E=0;
          }
/************************************************************
*Function:         写数据与地址
*parameter:    uchar data  要写的数据  
*************************************************************/ 
     void writedat(uchar dat)
          { chk_busy();
            RS=1;
            RW=0;                    
            P0=dat;                   
            E=1;
            E=0;
          }  
/************************************************************
*Function:         初始化程序
*************************************************************/
     void initialization(void)
          { Delay1ms(8);                   //8ms
            writecom(0x01);                //清屏    
            writecom(0x0c);                //显示状态设定
            writecom(0x30);                //功能设定
            writecom(0x04);                //位地址归位
            writecom(0x80);                //点设定,显示字符/光标从左到右移位,DDRA覯地址?一/
            writecom(0x02);                //0000,0010 DDRAM地址归位  
            writecom(0x01);                //清屏  
            writecom(0x34);
            writecom(0x36);           
          }

/************************************************************
*Function:   打点  x=0:128;  y=0:64;        
*************************************************************/
void Gra(uchar x,uchar y)
      { uchar aa,xx,yy; 
        uint  word=0,num1=0;
        uchar a=0,b=0,j;  
        aa=x; 
        xx=x>>4;                  
        yy=0x3f-y;          //yy=63-y;          
        if(yy>=32)               
          {xx=xx+8;yy-=32;}    //下一行  
        writecom(0x80+yy);       
        writecom(0x80+xx);       
        _nop_();        
        chk_busy(); 
        RS=1;
        RW=1;                 
        E=1;            
        a=P0;                     
        for(j=0;j<10;j++);       
        E=0;     
        E=1;
        for(j=0;j<10;j++);            
        b=P0;;                    
        E=0;              
        _nop_();         

    
        if((x&0x0f)<8)                 //该点在高位
          { num1=b;           
            num1=num1<<8;           
            num1=num1|a;
            word=0x8000>>(x&0x0f) ;    //该位置一   
            word=word|num1;
            writecom(0x80+yy);         //先设水平
            writecom(0x80+xx);        //后设垂直
            writedat(word>>8);               
          }
         else
         { num1=b;
           num1=num1<<8;
           (uchar)word=0x8000>>(x&0x0f); 
           word=word|a;
           word=word&0xff00;
           num1=num1|word;
           writecom(0x80+yy);       //先设垂直
           writecom(0x80+xx);       //后设水平
           writedat(b); 
           writedat(num1>>8);                                  
         }  
      }
/************************************************************
*Function:       绘图模式清屏    
*************************************************************/
void  Clear(void)
      { uchar  i,j;       
        for(j=0;j<16;j++)
           for(i=0;i<32;i++)
              { writecom(0x80+i);
                writecom(0x80+j);
                writedat(0x00);
                writedat(0x00);
              }     
      } 
/************************************************************
*Function:                     延时1毫秒
*parameter:    time:循环的次数,即延时多少毫秒,为整形           
*************************************************************/   
    void    Delay1ms(uint time)     //1ms延时程序
             { uchar i;
               while(time--)
                    { for(i = 0; i < 115; i++);}
             }   

⌨️ 快捷键说明

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