|  | 
 
| 
×
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册  
 
    
        复制代码
 #include <stc12c5a.h>
#include <intrins.h>
#include <math.h>
//------------定义接口-------------//
sbit RS=P2^2 ;
sbit RW=P2^3 ;
sbit E=P2^4;
sbit PSB= P2^5;   //H=并口; L="串口";
//sbit P34=P3^4;
//sbit P35=P3^5;
//sbit P36=P3^6;
#define Lcd_Bus P0
// P0 接 LCM
#define uchar unsigned char
#define FIRST_ADDR 0 
uchar T=0,y=32,x=32;
//定义字符/汉字显示起始位置
/*------------------检查忙位-----------------------------*/
void chk_busy()
{
    RS=0 ;
    RW=1 ;
    E=1 ;
    Lcd_Bus=0xff ;
    while((Lcd_Bus&0x80)==0x80);
    E=0 ;
}
/*------------------延时子程序-----------------------------*/
void delay(unsigned int t)
{
    unsigned int i,j ;
    for(i=0;i<t;i++)
    for(j=0;j<10;j++);
}
/*------------------写命令到LCD------------------------------*/
void write_com(unsigned char cmdcode)
{
    chk_busy();
    RS=0 ;
    RW=0 ;
    E=1 ;
    Lcd_Bus=cmdcode ;
    delay(5);
    //------------------在数据写入的时候加入适当的延时
    E=0 ;
    delay(5);
}
/*-------------------写数据到LCD----------------------------*/
void write_data(unsigned char Dispdata)
{
    chk_busy();
    RS=1 ;
    RW=0 ;
    E=1 ;
    Lcd_Bus=Dispdata ;
    delay(5);
    //------------------在数据写入的时候加入适当的延时
    E=0 ;
    delay(5);
}
/*------------------初始化LCD屏--------------------------*/
void lcdreset()
{
    PSB = 1;
    delay(2000);
    write_com(0x30);
    delay(10);
    //选择基本指令集
    write_com(0x30);
    //选择8bit数据流
    delay(5);
    write_com(0x0c);
    //开显示(无游标、不反白)
    delay(10);
    write_com(0x01);
    //清除显示,并且设定地址指针为00H
    delay(500);
    write_com(0x06);
    //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
    delay(0);
}
/*------------------显示字符串--------------------------*/
void hzkdis(unsigned char code*s)
{
    while(*s>0)
    {
        write_data(*s);
        s++;
        delay(50);
    }
}
/*------------------首屏显示--------------------------*/
void ceshi()
{
    write_com(0x01);
    //清除显示,并且设定地址指针为00H
    delay(5);
    
    write_com(0x80);
    //第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)
    hzkdis("贵阳学院");
    
    write_com(0x90);
    //第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)
    hzkdis("电子与通信工程");
    
    write_com(0x88);
    //第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)
    hzkdis("电子信息工程");
    
    write_com(0x98);
    //第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)
    hzkdis("波形测试程序");
}
//------------------清整个GDRAM空间----------------------------
void clrgdram()
{
    unsigned char x,y ;
    for(y=0;y<64;y++)
    for(x=0;x<16;x++)
    {
        write_com(0x34);
        write_com(y+0x80);
        //行地址
        write_com(x+0x80);
        //列地址
        write_com(0x30);
        write_data(0x00);
        write_data(0x00);
    }
}
//------------------------------------------------------------
void clrscreen()
{
    write_com(0x01);
    delay(10);
}
unsigned char ReadByte(void)
{
    unsigned char byReturnValue ;
    chk_busy();
    Lcd_Bus=0xff ;
    RS=1 ;
    RW=1 ;
    E=0 ;
    E=1 ;
    byReturnValue=Lcd_Bus ;
    E=0 ;
    
    return byReturnValue ;
}
/*增加画点子程序
函数功能:在坐标为(x,y)点画一个点
参数意义?
X:12864屏幕的横坐标,范围是0到128(从左到右)
Y:12864的纵坐标,范围是0到64(从上到下)
Color:为1的时候表示为黑点
*/
void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
{
    unsigned char Row,Tier,Tier_bit ;
    unsigned char ReadOldH,ReadOldL ;
    write_com(0x34);
    write_com(0x36);
    Tier=X>>4 ;
    Tier_bit=X&0x0f ;
    if(Y<32)
    {
        Row=Y ;
    }
    else 
    {
        Row=Y-32 ;
        Tier+=8 ;
    }
    write_com(Row+0x80);
    write_com(Tier+0x80);
    ReadByte();
    ReadOldH=ReadByte();
    ReadOldL=ReadByte();
    write_com(Row+0x80);
    write_com(Tier+0x80);
    if(Tier_bit<8)
    {
        switch(Color)
        {
            case 0 :
            ReadOldH&=(~(0x01<<(7-Tier_bit)));
            break ;
            case 1 :
            ReadOldH|=(0x01<<(7-Tier_bit));
            break ;
            case 2 :
            ReadOldH^=(0x01<<(7-Tier_bit));
            break ;
            default :
            break ;
        }
        write_data(ReadOldH);
        write_data(ReadOldL);
    }
    else 
    {
        switch(Color)
        {
            case 0 :
            ReadOldL&=(~(0x01<<(15-Tier_bit)));
            break ;
            case 1 :
            ReadOldL|=(0x01<<(15-Tier_bit));
            break ;
            case 2 :
            ReadOldL^=(0x01<<(15-Tier_bit));
            break ;
            default :
            break ;
        }
        write_data(ReadOldH);
        write_data(ReadOldL);
    }
    write_com(0x30);
}
void main(void)
{
    uchar i,j,colour=1;
        ET0=1;
        EA=1;
        TMOD=0X11;
        TR0=1;
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;
    RW=0 ;
    lcdreset();
    ceshi();
    clrgdram();
    delay(2000);
    clrscreen();
 while(1)
 {
    for(i=127;i>0;i--)
    {
         j=y-x*sin(2*i*3.14/(64+T));  //y纵向参数,可以上下调节波形位置
         DrawPoint(i,j,colour);           //T调节周期,x调节幅度
    }
                 //T+=4;        
                //clrgdram();
            delay(6000);
                //clrscreen();
                
 }
    while(1);
}
void key() interrupt 1
{
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;
        if(P34==0)
        {        delay(20);
                if(P34==0)
                {
                        clrgdram();
                        T+=4;
                        if(T>200)
                                T=0;
                }
        }
        
        if(P35==0)
        {        delay(20);
                if(P35==0)
                {
                        clrgdram();
                        x-=4;
                        if(x<0)
                                x=32;
                }
        }
        
        
        if(P36==0)
        {        delay(20);
                if(P36==0)
                {
                        clrgdram();
                        y-=4;
                        if(y<0)
                                y=32;
                }
        }                        
}
 | 
 
    
        
             
            
                
                波形.zip
                
             54.9 KB, 下载次数: 6
                , 下载积分:
                资产 -2 信元, 下载支出 2 信元 
                
             51单片机用12864显示正弦波 |