各位大神帮我看看为什么我的显示汉字是会是这样子的 谢谢
//基于KS0108IC的LCD程序---无字库程序
//2012-5-23
//作者:奔跑着的水
#include<reg52.h>
#include<intrins.h>
//#include<ziku.h>
#include<FANGGE.H>
#define dataport P0
sbit rs=P2^0;//部分仿真里面是DI
sbit rw=P2^1;
sbit en=P2^2;//控制时能端
sbit cs1=P2^3;
sbit cs2=P2^4;
sbit rest=P2^5;
sbit SDA=P0^7;
sbit SCK=P0^6;
#define uchar unsigned char
#define uint unsigned int
uchar huan[]={0x80,0x84,0x44,0xC4,0xA4,0x94,0x8C,0xFF,0x8C,0x94,0xA4,0x24,0x44,0xC4,0x40,0x00,
0x00,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x00};//*欢*//
void screen(uchar see);
//LCD延时程序////
void delay_us(uchar i)
{
while(i--) _nop_();
}
void delay1ms(uchar c) //误差 0us,此程序由单片机
{
unsigned char a,b,i;
for(i=0;i<=c;i++)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void delay1s(uint n) //误差 0us
{
unsigned char a,b,c,d;
for(d=0;d<n;d++)
for(c=46;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
//读取忙碌标志
void busy(void)
{
P0=0X00;
rs=0;
rw=1;//LCD读指令状态
en=1;
while(P0&0x08);//为0时表示 不忙碌 ,程序继续执行
_nop_();
_nop_();
en=0;
}
//LCD写指令程序
void write_com(uchar com)
{
busy();
rs=0;
rw=0;
en=1;
P0=com;
_nop_();
_nop_();
en=0;
}
//LCD写数据程序
void write_data(uchar dat)
{
busy();
rs=1;
rw=0;
en=1;
P0=dat;
_nop_();
_nop_();
en=0;
}
//设置页地址
void set_page(uchar page)
{
page=page|0xb8;//起始也地址为 0xb8(总共有八页)
write_com(page);
}
//设置起始行
void set_line(uchar line)
{
line=line|0xc0; //起始行地址为0xc0(一页八行)
write_com(line);
}
//设置列
void set_cmm(uchar cmm)
{
cmm=cmm&0x3f;
cmm=cmm|0x40;//列最大地址我64 起始列地址为0x40
write_com(cmm);
}
//选择分屏程序
void selcet(uchar see)
{
switch(see)
{
case 0 : cs1=0;cs2=0;break;//全屏
case 1 : cs1=0;cs2=1;break;//左屏
case 2 : cs1=1;cs2=0;break;//右屏
}
}
//清屏程序 从第一个开始 一直写0
void screen(uchar see)
{
uchar i,j;
selcet(see);
for(i=0;i<8;i++)
{
set_page(i);
set_cmm(0);//起始列
for(j=0;j<64;j++)
{
write_data(0x00);
}
}
}
void setonoff(uchar onoff)//0不显示 1显示
{
onoff=onoff|0x3e;
write_com(onoff);
}
void intlcd()
{
busy();
selcet(0);
setonoff(0);
selcet(0);
setonoff(1);
selcet(0);
screen(0);
set_line(0);
}
//显示方格
void box1(uchar box)
{
uchar i,j,k;
//显示方格 所谓的棋局
for(i=0;i<8;i++)
{
set_page(i);
set_cmm(0);
set_line(0);
box=~box;
for(j=0;j<4;j++)//全屏显示 循环4次
{
for(k=0;k<8;k++)
write_data(box);
for(k=0;k<8;k++)
write_data(~box);
}
}
}
void box2(uchar box)
{
//delay1s(5);//延时3秒钟
unsigned char i,j,k;
delay1s(5);
for(i=0;i<8;i++)
{
set_page(i);
set_cmm(0);
set_line(0);
box=~box;
for(j=0;j<4;j++)//全屏显示 循环4次
{
for(k=0;k<8;k++)
write_data(~box);
for(k=0;k<8;k++)
write_data(box);
}
}
}
void line1(void)
{
//screen(0);//为什么这样
uchar n,m;
screen(0);
for(n=0;n<8;n++)
{
set_page(n);
set_cmm(0);
set_line(0);
for(m=0;m<64;m++)
{
write_data(0xaa);
}
}
delay1s(3);//延时3秒钟
screen(0);
for(n=0;n<8;n++)
{
set_page(n);
set_cmm(0);
set_line(0);
for(m=0;m<64;m++)
{
write_data(0x55);
}
}
}
void line2(uchar line)
{
uchar i,j,k;
for(i=0;i<8;i++)
{
set_page(i);
set_line(0);
set_cmm(0);
for(j=0;j<4;j++)
{
for(k=0;k<8;k++)
write_data(line);
for(k=0;k<8;k++)
write_data(~line);
}
}
//空白显示
for(i=0;i<8;i++)
{
set_page(i);
set_line(0);
set_cmm(0);
for(j=0;j<4;j++)
{
for(k=0;k<8;k++)
write_data(~line);
for(k=0;k<8;k++)
write_data(line);
}
}
}
void display_HZ(uchar page,line,cmm,see,uchar *p)
{
uchar i;
screen(0);//清全屏screen(0)
selcet(see);//选择屏幕
set_page(page);
set_line(line);
set_cmm(cmm);
for(i=0;i<16;i++)
{
write_data(p[i]);
}
set_page(page+1);
set_line(line);
set_cmm(cmm);
for(i=0;i<16;i++);
{
write_data(p[i+16]);
}
}
void main()
{
intlcd();
screen(0);
set_line(0);
box1(0xff);
delay1s(5);
box2(0xff);
delay1s(5);
line1();
delay1s(3);
line2(0xff);
delay1s(3);
display_HZ(3,0,0,1,huan);
while(1);
}
|