标题:
新人求助,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