有圖有程序 就是不知道哪里不對 不顯示 不用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;
}
|