标题: 新人求助,51单片机控制LCD12864显示学号 [打印本页]

作者: lm023    时间: 2015-12-29 12:43
标题: 新人求助,51单片机控制LCD12864显示学号
刚入门。
要求是利用单片机控制LCD12864滚动显示学号,名字。程序的显示方法已经写好了,就是不知道主程序里面该怎么写,初始位置怎么定
以下是程序:
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int

sbit p_rst=P2^5;
sbit p_csl=P2^4;
sbit p_csr=P2^3;
sbit p_di=P2^2;
sbit p_rw=P2^1;
sbit p_e=P2^0;

uchar code xingming[]=
{
0x20,0x82,0x20,0x82,0x2A,0x45,0x2A,0x45,0xAA,0x25,0x6A,0x15,0x3E,0x0D,0x2B,0xFF,
0xAA,0x04,0xAA,0x0C,0xEA,0x14,0xAA,0x24,0x2A,0x65,0x22,0xC2,0x20,0x42,0x00,0x00,

0x08,0x01,0x08,0x41,0x88,0x80,0xFF,0x7F,0x48,0x42,0x8C,0x24,0xE4,0x18,0x9C,0x16,
0x80,0x21,0x44,0x48,0x44,0x48,0xFC,0x4F,0x42,0x48,0x42,0x48,0x42,0x40,0x00,0x00,

};
uchar code xuehao[]=
{
0x00,0x00,0x10,0x20,0xF0,0x3F,0x00,0x20,//1//0

0x00,0x00,0x10,0x20,0xF0,0x3F,0x00,0x20,//1//1

0x30,0x38,0x88,0x20,0x70,0x1F,0x00,0x00,//3//2

0x00,0x00,0x10,0x20,0xF0,0x3F,0x00,0x20,//1//3

0xF0,0x1F,0x08,0x21,0x98,0x20,0x00,0x1F,//6//4

0xF0,0x1F,0x08,0x20,0xF0,0x1F,0x00,0x00,//0//5

0x30,0x38,0x88,0x20,0x70,0x1F,0x00,0x00,//3//6

0xF0,0x1F,0x08,0x20,0xF0,0x1F,0x00,0x00,//0//7

0x70,0x38,0x08,0x27,0xF0,0x30,0x00,0x00,//2//8

0x70,0x38,0x08,0x27,0xF0,0x30,0x00,0x00,//2//9

0xF0,0x1F,0x08,0x21,0x98,0x20,0x00,0x1F,//6//10

};
void delay(unsigned int k) //延时函数
{
  unsigned int a,b;
  for(a=0;a<k;a++) ;
  for(b=0;b<20;b++)        ;
}
//复位子函数
void reset()
{          
    p_rst=0;
    delay(20);
    p_rst=1;
   delay(20);
}
void lcd_busy(void)        //忙检测
{       
        P0=0x00;
        p_di=0;
    p_rw=1;
        p_e=1;
        while(P0 & 0x80);
        p_e=0;
}
//写指令到LCM
void wcode(uchar c,uchar csl,uchar csr)
{          
    p_csl=csl;
    p_csr=csr;
    lcd_busy();
    p_di=0;
    p_rw=0;
    P0=c;//将变量C赋予LCM
    p_e=1;
    p_e=0;
}
//写数据到LCM子函数
void wdata(uchar c,uchar csl,uchar csr)
{         
    p_csl=csl;
    p_csr=csr;
    lcd_busy();
    p_di=1;
    p_rw=0;
    P0=c;//将变量C赋予LCM
    p_e=1;
    p_e=0;
}
//设定起始行
void set_startline(uchar i)
{          
    i=0xc0+i;
    wcode(i,1,1);
}
//定位x,y方向
void set_xy(uchar x,uchar y)
{          
    x=x+0x40;
    y=y+0xb8;          
    wcode(x,1,1);
    wcode(y,1,1);
}

////屏幕开启、关闭
void dison_off(uchar o)
{          
    o=o+0x3e;  //o为1为开,为0是关
    wcode(o,1,1);
}
//写数据到LCM
void lw(uchar x,uchar y,uchar dd)
{         
     if(x>=64)
     { set_xy(x-64,y);
       wdata(dd,0,1);
     }
     else
         { set_xy(x,y);
           wdata(dd,1,0);
         }
}
//LCM初始化
void lcd_init(void)
{          
    uchar x,y;
    reset();
    dison_off(0);
    for(y=0;y<8;y++)
     { for(x=0;x<128;x++)
         lw(x,y,0);
      }
    dison_off(1);
   set_startline(0);
}

void disp_Hz(uchar xx,uchar yy,uchar n,uchar fb)//xx为该行第xx个字,共8字,yy为第几行,共8行。
{       
        uchar i,dx;   
    for(i=0;i<16;i++)
         {        dx=xingming[2*i+n*32]; //2*i为选择偶数行,因其为列扫描
           if(fb)
                  dx=255-dx;//反白显示
                lw(xx*16+i,yy,dx);
                dx=xingming[(2*i+1)+n*32];
                if(fb)
                 dx=255-dx;
                lw(xx*16+i,yy+1,dx);
          }
}
void disp_Ez(uchar xx,uchar yy,uchar n,uchar fb)//显示数字或英语
{  uchar i,dx;
    for(i=0;i<8;i++)
     {        dx=xuehao[2*i+n*16];
                    if(fb)
                          dx=255-dx;
                        lw(xx*8+i,yy,dx);//
              dx=xuehao[(2*i+1)+n*16];
                        if(fb)
                         dx=255-dx;
                        lw(xx*8+i,yy+1,dx);

          }

}

  void main()
{
    int t;
    lcd_busy();
    reset();
        lcd_init();

        while(1)   //就是不知道这里改怎么写,试着写过,但是显示的位置有问题
        {
         for(t=0;t<64;t++)

        }
}



由于初学,知道实际问题应该比较简单,,但是······,希望大神帮忙写一下最后的部分,最好给点注释。非常非常感谢






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1