有图有程序 就是不知道哪里不对 不显示 不用74HC573就能显示,但是有个其他复杂电路需要用锁存器,想先把这个液晶弄明白
以下是程序,也不知道哪里不对
哪位大神指教一下 万分感谢TAT
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^0;
sbit wela=P2^1;
uchar code HZ0[4][128]={{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,
0x03,0x80,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0xC0,0x0F,0x80,
0x00,0x03,0xFF,0x80,0x00,0x1F,0xE0,0x00,0x3C,0x00,0xE0,0x00,0x1E,0x00,0xF0,0x00,
0x0E,0x00,0xE0,0x00,0x06,0x00,0xE0,0x00,0x00,0xE0,0xE0,0x00,0x00,0xC0,0xE0,0x00,
0x01,0xC0,0xE0,0x00,0x03,0x80,0xE0,0x00,0x03,0x80,0xE1,0xC0,0x07,0x01,0xFF,0xF0,
0x0F,0xFF,0xE0,0x70,0x1E,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,
0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0xE0,0x1E,0x00,0x00,0xF7,0xFF,0x00,0x00,0x77,0x0F,0x00,0x0E,0x00,0x0F,0x00,
0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,
0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,
0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,
0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x3F,0x00,0x07,0x00,0x1F,0x00,
0x06,0x00,0x0F,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x0F,0xF8,0x07,0x80,0x3E,0x3B,0xFF,0xC0,
0x07,0x39,0xC7,0x80,0x07,0x39,0xC7,0x80,0x07,0xF9,0xC7,0x00,0x07,0xF9,0xC7,0x00,
0x07,0x39,0xC6,0x00,0x07,0x38,0xFF,0x00,0x07,0xF8,0xC0,0x00,0x07,0x38,0x00,0x00,
0x07,0x38,0xCC,0x00,0x07,0x3E,0xE7,0x00,0x07,0xF8,0xE7,0xC0,0x07,0xF9,0xC3,0xE0,
0x7F,0x3B,0xC1,0xE0,0x7C,0x3F,0x80,0xF0,0x00,0x3E,0x00,0xF0,0x00,0x3C,0x00,0x20,
0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x01,0xC0,0x00,
0x00,0x01,0xE0,0x00,0x00,0x79,0xC0,0x00,0x00,0x79,0xC0,0x00,0x00,0x79,0xC0,0x00,
0x00,0x79,0xC0,0x00,0x00,0x39,0xC6,0x00,0x00,0x39,0xC7,0x00,0x00,0x39,0xCF,0x00,
0x0F,0x39,0xCE,0x00,0x07,0xB9,0xDC,0x00,0x07,0xB9,0xF8,0x00,0x03,0xF9,0xF0,0x00,
0x03,0xB9,0xE0,0x00,0x00,0x39,0xC0,0x00,0x00,0x39,0xC0,0x00,0x00,0x39,0xC0,0x00,
0x00,0x39,0xC0,0x00,0x00,0x3F,0xFF,0xE0,0x3F,0xFF,0x03,0xF0,0x7F,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
};
uchar code HZ1[4][128]={
{0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x03,0xC0,0xF0,0x00,0x03,0xC0,0xF0,0x00,
0x01,0xC0,0xF0,0x00,0x01,0xC0,0xE0,0x00,0x01,0xC0,0xE0,0x00,0x01,0x80,0xFF,0x00,
0x01,0x80,0xFE,0x00,0x01,0xFF,0xE0,0x00,0x3F,0xC0,0xE0,0x00,0x39,0x80,0xE0,0x00,
0x01,0x80,0xE0,0x00,0x01,0xB0,0xFE,0x00,0x01,0xE7,0xDE,0x00,0x03,0x8C,0x3C,0x00,
0x07,0x8E,0x38,0x00,0x1F,0x87,0x38,0x00,0xFD,0x83,0xF0,0x00,0xF1,0x80,0xF0,0x00,
0x01,0x81,0xF0,0x00,0x03,0x83,0xFC,0x00,0x03,0x87,0x9F,0x00,0x1F,0x9E,0x0F,0xE0,
0x0F,0xB8,0x07,0xF8,0x07,0x80,0x00,0x08,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0E,0x00,0x00,
0x00,0x0E,0x7C,0x00,0x00,0x0E,0x1E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x00,0x00,
0x00,0x0E,0x00,0x00,0x00,0x0F,0xFC,0x00,0x00,0x3F,0xF0,0x00,0x0F,0xFE,0x00,0x00,
0x00,0x3E,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x7F,0x80,0x00,0x00,0xFF,0xC0,0x00,
0x00,0xEE,0xE0,0x00,0x01,0xCE,0x78,0x00,0x03,0x8E,0x3E,0x00,0x07,0x0E,0x1F,0x80,
0x1E,0x0E,0x1F,0xE0,0x38,0x0E,0x07,0xF8,0x70,0x0E,0x00,0x00,0x00,0x0E,0x00,0x00,
0x00,0x1E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0C,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3C,0x00,0x01,0x9E,0x38,0x00,
0x01,0xEF,0x38,0x00,0x00,0xE7,0x70,0x00,0x00,0xE6,0x70,0x00,0x00,0x00,0x63,0x00,
0x00,0x00,0xFF,0xC0,0x0E,0xFF,0xC3,0xE0,0x0F,0xC0,0x07,0x80,0x0E,0x00,0x07,0x00,
0x1C,0x0F,0xEC,0x00,0x3C,0xFD,0xF0,0x00,0x18,0x01,0xC0,0x00,0x00,0x03,0x80,0x00,
0x00,0x07,0x00,0x00,0x00,0x07,0xFF,0x80,0x00,0x7F,0xFF,0xC0,0x1F,0xF3,0x80,0x00,
0x00,0x03,0x80,0x00,0x00,0x03,0x80,0x00,0x00,0x03,0x80,0x00,0x00,0x03,0x80,0x00,
0x00,0x03,0x80,0x00,0x00,0x3F,0x80,0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,
0x01,0xC1,0xE0,0x00,0x1F,0xE0,0xE0,0x00,0x1D,0xC0,0x1F,0x00,0x1D,0xDB,0xFF,0x80,
0x1F,0x9E,0x07,0x00,0x1F,0x38,0x0E,0x00,0x1F,0xF8,0x00,0x00,0x1D,0xF7,0xF8,0x00,
0x1F,0xCF,0x80,0x00,0x1F,0xC0,0x00,0x00,0x1D,0xC0,0xFE,0x00,0x1C,0xCF,0xF0,0x00,
0x1C,0x3E,0xE0,0x00,0x1C,0x07,0xE0,0x00,0x1C,0x0E,0xE0,0x40,0x1C,0x0E,0xE0,0xE0,
0x1C,0x1C,0xE0,0xE0,0x3C,0x38,0xE0,0xE0,0x3C,0x70,0xE0,0xE0,0x3C,0xE0,0x7F,0xF0,
0x19,0x80,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
};
void delayus(uchar x)
{
while(--x)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
uchar read_status() //读状态
{
uchar status;
wela=1;
P0=0x90;
wela=0;
status=P0;
return status;
}
void status_check() //检查状态,如果读状态后返回的值后两位为1,则退出检测状态,否则,需等待;要更改状态检测条件,只需改0x03(!为啥位选后两位是1)
{
uchar s;
while((s&0x03)!=0x03)//(这个0x03应该是位选,但是0x03是什么意思?)按位与,再和0x03相匹配,若一致,则退出检测
dula=1;//这里加位选 对么?
s=read_status();
dula=0;
}
void data_write(uint data1)
{
wela=1;
P0=0x40;//rd-1读选通信号失效 cd=0通道选择数据 ce=0启动控制芯片 wr=0写信号有效
P0=data1;
wela=0;
delayus(10);
wela=1;
P0=0xe0;//wr=1关写信号 ce=1 cd=1指令信号
wela=0;
}
void command_write(uchar command)
{
wela=1;
P0=0xe0;//rd=1读选通信号失效 cd=1选择指令通道 wr=0 ce=0
P0=command;
wela=0;
delayus(10);
wela=1;
P0=0xd0;//wr=1 ce=1 cd=0
wela=0;
}
void command_sending_with_one_data(uchar data1,uchar command)//先送参数 再送指令
{
status_check();//检查状态
dula=1; //打开段选 写入D0-D7?
data_write(data1);//写入数据
dula=0;
delayus(10);
status_check();//再检查一遍状态
dula=1; //打开段选 写入D0-D7?
command_write(command); //写入命令
dula=0;
}
void command_sending_with_two_data(uint data1,uint data2,uchar command)
{
status_check();
dula=1;
data_write(data1);
dula=0;
delayus(10);
status_check();
dula=1;
data_write(data2);
dula=0;
delayus(10);
status_check();
dula=1;
command_write(command);
dula=0;
}
void display_HZ(uchar x,uint y,uchar *hz)////x 0-3 y 0-7 位置指定,汉字指针
{
uchar i;
uint j=0;
uint k=x;
for(i=0;i<32;i++)
{
if(j>=32)x=k+(j/32);
command_sending_with_two_data((((j/2)<<4)|(y*4)),x,0x24);//地址指针设置 低地址,高地址,命令
command_sending_with_one_data(hz[j++],0xc0);
command_sending_with_one_data(hz[j++],0xc0);
command_sending_with_one_data(hz[j++],0xc0);
command_sending_with_one_data(hz[j++],0xc0);
}
}
void init_12864()
{
wela=1;
P0=0xe0;
wela=1;
status_check();
dula=1;
command_sending_with_two_data(0x00,0x00,0x21); //光标指针设置,本程序不设置偏移寄存器
dula=0;
delayus(5);
status_check(); //地址指针在开始写字的时候才进行设置
dula=1;
command_sending_with_two_data(0x00,0x00,0x42); //设置图形显示首地址
dula=0;
delayus(5);
status_check();
dula=1;
command_sending_with_two_data(32,0x20,0x43); //设置图形区域大小
dula=0;
delayus(5);
status_check();
dula=1;
command_write(0x80); //模式设置
dula=0;
delayus(5);
status_check();
dula=1;
command_write(0x98); //显示设置
dula=0;
delayus(5);
status_check();
dula=1;
command_write(0xa0); //光标设置
dula=0;
delayus(5);
}
void main()
{
uchar i=0;
init_12864();
for(i=0;i<4;i++)
dula=1;
display_HZ(0,i,HZ0);
dula=0;
for(i=0;i<4;i++)
dula=1;
display_HZ(4,i,HZ1);
dula=0;
}
|