本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
手头上一块NH12864J-1,想用STC89C52点亮了,改了几个程序,都不能让它显出汉字,请各位帮忙看看了,感激不尽:
#include<reg52.h>
sbit pinRS=P2^0;
sbit pinRW=P2^1;
sbit pinE=P2^2;
sbit pinRST=P2^3;
sbit pinCSA=P2^6;
sbit pinCSB=P2^7;
#define uint unsigned int
#define uchar unsigned char
void shortdelay(uint i)
{
for(;i>0;i--);
}
void longdelay(uint i)
{
uint j;
for(;i>0;i--)
for(j=1000;j>0;j--);
}
//数据口控制
void data_con(bit i)
{
if(i==1) P0=0xff;
else P0=0x00;
}
//指令/数据选择
void RS_con(bit i)
{
if(i==1) pinRS=1;
else pinRS=0;
}
//读写操作控制
void RW_con(bit i)
{
if(i==1) pinRW=1;
else pinRW=0;
}
//使能信号
void EN_con(bit i)
{
if(i==1) pinE=1;
else pinE=0;
}
//复位
void RST_con(bit i)
{
if(i==1) pinRST=1;
else pinRST=0;
}
//读状态--(是否忙)---rw=1;rs=0;en=1;
uchar read_status(void)
{
uchar i;
data_con(1);
RS_con(1);
RW_con(0);
EN_con(0);
shortdelay(10);
EN_con(1);
shortdelay(10);
i=P0;
shortdelay(20);
EN_con(0);
return(i);
}
//读一字节数据 -从数据暂存器中读出数据
uchar read_onebyte(void)
{
uchar i;
data_con(1);
RW_con(1);
RS_con(1);
EN_con(0);
shortdelay(10);
EN_con(1);
shortdelay(10);
i=P0;
shortdelay(20);
EN_con(0);
return(i);
}
//写指令 --rs=0;rw=0.
void write_ins(uchar instruction)
{
while((read_status()&0x80)!=0x00);
data_con(0);
RW_con(0);
RS_con(0);
EN_con(0);
P0=instruction;
shortdelay(100);
EN_con(1);
shortdelay(100);
EN_con(0);
}
//intruction=(0x01为清除显示)(0x02为地址规位)
#define clearLCD() write_ins(0x01)
#define addreturn() write_ins(0x02)
//显示状态开/关(temp=0x08 显示关,游标关,游标位置反白关;0x0c 显示开,游标关,游标位置反白关
// 0x0d 显示开,游标关,游标位置反白开;0x0e 显示开,游标开,游标位置反白开)
#define disp_con(temp) write_ins(temp);
//进入点设置(temp=0x04 减量方式,不移位;0x05 减量方式,移位
// 0x06 增量方式,不移位;0x07 增量方式,移位)
#define Point_set(temp) write_ins(temp)
//游标显示 (temp=0x10 光标左移;0x14 光标右移;0x18 显示整体左移;0x1c 显示整体右移)
#define cursor_set(temp) write_ins(temp)
//函数功能设定(temp=0x20 4位数据,基本指令操作;0x24 4位数据,扩展指令操作
// 0x30 8位数据,基本指令操作;0x34 8位数据,扩展指令操作;)
#define function_set(temp) write_ins(temp)
//CGRAM、DDRAM地址设定
#define CGRAM_set(address) write_ins(0x40|address)
#define DDRAM_set(address) write_ins(0x80|address)
//卷动地址开启(temp=0x02 允许输入垂直卷动地址;
// 0x03 允许输入IRAM和CGRAM地址)
#define move_ON(temp) write_ins(temp)
//反白选择
#define notwihte_set(temp) write_ins((0x04|temp)&0x07)
//睡眠模式(0x08进入睡眠;0x0c脱离睡眠)
#define sleep_set(temp) write_ins(temp)
//扩充功能设定
// 0x20 :4位数据,基本指令操作,绘图关
// 0x22 :4位数据,基本指令操作,绘图开
// 0x24 :4位数据,扩充指令操作,绘图关
// 0x26 :4位数据,扩充指令操作,绘图开
// 0x30 :8位数据,基本指令操作,绘图关
// 0x32 :8位数据,基本指令操作,绘图开
// 0x34 :8位数据,扩充指令操作,绘图关
// 0x36 :8位数据,扩充指令操作,绘图开
#define ext_fun_set(temp) write_ins(temp)
//设定绘图RAM地址
#define SetFigRAM(address) writeInstruc(0x80|address)
//写一字节数据 --rs=1;rw=0.
void write_onebyte(uchar d)
{
while((read_status()&0x80)!=0x00);
data_con(0);
RW_con(0);
RS_con(1);
EN_con(0);
P0=d;
shortdelay(100);
EN_con(1);
shortdelay(100);
EN_con(0);
}
//复位
void reset_con(void)
{
longdelay(20);
RST_con(0);
longdelay(20);
RST_con(1);
longdelay(20);
}
//初始化
void initial_con(void)
{
reset_con();
function_set(0x30);//8位,基本指令操作;
longdelay(2);
function_set(0x30);
longdelay(2);
disp_con(0x0c); //显示开,游标关,游标位置反白关
longdelay(2);
clearLCD();
longdelay(2);
Point_set(0x06); //增量,不移位。
longdelay(2);
}
//显示一个汉字
void disp_one_word(uchar x,uchar y,uchar word)
{
uchar disp_add;
uchar add_H;
uchar add_L;
if((x==0x00)||(x==0x02)) add_H=0x80;
else add_H=0x90;
if((x==0x00)||(x==0x01)) add_L=y;
else add_L=y+0x08;
disp_add=(add_H|add_L)&0xff;
DDRAM_set(disp_add);
write_onebyte(((word&0xff00)>>8)&0xff);
write_onebyte(word&0xff);
}
//显示两个字符(8*16)
void disp_twocharacter(uchar x,uchar y,uchar A,uchar B)
{
uchar disp_add;
uchar add_H;
uchar add_L;
if((x==0x00)||(x==0x02)) add_H=0x80;
else add_H=0x90;
if((x==0x00)||(x==0x01)) add_L=y;
else add_L=y+0x08;
disp_add=(add_H|add_L)&0xff;
DDRAM_set(disp_add);
write_onebyte(A);
write_onebyte(B);
}
void main()
{
uint x=4;
P2=0x00;
pinCSA=1;
pinCSB=1;
shortdelay(10);
data_con(1);
initial_con();
while(x>0)
{
disp_one_word(x,2,0xabfe);
x--;
}
} |