找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2958|回复: 3
收起左侧

关于单片机用锁存器74HC573控制液晶显示PG12864f

[复制链接]
ID:357361 发表于 2018-11-21 14:44 | 显示全部楼层 |阅读模式
45黑币
有图有程序 就是不知道哪里不对 不显示  不用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;
}


这是protues仿真

这是protues仿真
回复

使用道具 举报

ID:404160 发表于 2018-11-24 19:57 | 显示全部楼层
好像573的OE要接51的EA吧。再就是要用外部读写指令(C要指定或设置)
回复

使用道具 举报

ID:357361 发表于 2018-11-29 16:19 | 显示全部楼层
飞云居士 发表于 2018-11-24 19:57
好像573的OE要接51的EA吧。再就是要用外部读写指令(C要指定或设置)

不是吧? OE=0 LE=1的时候输入端等于输出端数据
外部读写指令??我这个涉及到了外部存储器吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表