各位好!本人用AT89S52单片机控制12864显示几个汉字,但是只有背景亮,不显示字!现求助于大伙!谢谢! 5
#include"reg52.h"#include<stdio.h>sbitEN=P3^1;//定义读写使能信号,高电平有效sbitR_W=P3^0;//定义读写选择信号...
#include"reg52.h"
#include<stdio.h>
sbit EN=P3^1; //定义读写使能信号,高电平有效
sbit R_W=P3^0; //定义读写选择信号,1为读选通,0为写选通
sbit R_S=P3^6; //数据指令选择信号,1为数据操作,0为写指令或读状态
unsigned char l,xh,dz;
/*延时子函数*/
void delay_us(long int delay_us)
{
while(delay_us --);
}
void delay_ms(long int delay_ms)
{
unsigned char a,b;
while(delay_ms)
{
for(b=4;b>0;b--)
for(a=123;a>0;a--);
}
}
/*写指令子函数*/
void write_cmd(unsigned char com)
{
delay_ms(10); //延时
R_W=0; //写选通
R_S=0; //写指令
delay_us(20); //延时
P2=com; //将要写的数据送给P2口
EN=1; //使能有效
delay_ms(10); //延时
EN=0; //关闭使能信号
}
/*写数据子函数*/
void write_data(unsigned char dat)
{
delay_ms(10); //延时
R_S=1; //数据操作
R_W=0; //写选通
delay_us(20); //延时
P2=dat; //将要写的数据送给P2口
EN=1; //使能有效
delay_ms(10); //延时
EN=0; //关闭使能信号
}
/*初始化子程序*/
void sub_int() //初始化子函数
{
// P2=0xff;
// P3=0xff;
EN=0; //关闭使能信号
delay_ms(250);
write_cmd(0x30);
delay_us(250);
write_cmd(0x30);
delay_us(80);
write_cmd(0x0f);
delay_us(250);
write_cmd(0x01);
delay_ms(50);
write_cmd(0x06);
delay_ms(10);
}
/*扩充指令集清屏*/
void clrsreen( )
{
unsigned char m,n;
write_cmd(0x34);
write_cmd(0x36);
for(m=0;m<32;m++)
{
write_cmd(m+0x80);
write_cmd(0x80);
for(n=0;n<32;n++)
{
write_data(0x00);
}
}
}
/*显示汉字子程序--正常*/
void showhz(unsigned char code *s)
{
while(*s>0)
{
write_data(*s);
s++;
delay_us(250);
}
}
/*主函数*/
void main()
{
sub_int(); //调用初始化函数进行初始化操作
clrsreen(); //扩充指令清屏
/*基本指令清屏*/
write_cmd(0x30);
write_cmd(0x01);
delay_us(50);
/*屏幕滚动显示5次*/
for(;;)
{
write_cmd(0x80);
showhz("课程设计");
delay_us(50); }} 展开
#include<stdio.h>
sbit EN=P3^1; //定义读写使能信号,高电平有效
sbit R_W=P3^0; //定义读写选择信号,1为读选通,0为写选通
sbit R_S=P3^6; //数据指令选择信号,1为数据操作,0为写指令或读状态
unsigned char l,xh,dz;
/*延时子函数*/
void delay_us(long int delay_us)
{
while(delay_us --);
}
void delay_ms(long int delay_ms)
{
unsigned char a,b;
while(delay_ms)
{
for(b=4;b>0;b--)
for(a=123;a>0;a--);
}
}
/*写指令子函数*/
void write_cmd(unsigned char com)
{
delay_ms(10); //延时
R_W=0; //写选通
R_S=0; //写指令
delay_us(20); //延时
P2=com; //将要写的数据送给P2口
EN=1; //使能有效
delay_ms(10); //延时
EN=0; //关闭使能信号
}
/*写数据子函数*/
void write_data(unsigned char dat)
{
delay_ms(10); //延时
R_S=1; //数据操作
R_W=0; //写选通
delay_us(20); //延时
P2=dat; //将要写的数据送给P2口
EN=1; //使能有效
delay_ms(10); //延时
EN=0; //关闭使能信号
}
/*初始化子程序*/
void sub_int() //初始化子函数
{
// P2=0xff;
// P3=0xff;
EN=0; //关闭使能信号
delay_ms(250);
write_cmd(0x30);
delay_us(250);
write_cmd(0x30);
delay_us(80);
write_cmd(0x0f);
delay_us(250);
write_cmd(0x01);
delay_ms(50);
write_cmd(0x06);
delay_ms(10);
}
/*扩充指令集清屏*/
void clrsreen( )
{
unsigned char m,n;
write_cmd(0x34);
write_cmd(0x36);
for(m=0;m<32;m++)
{
write_cmd(m+0x80);
write_cmd(0x80);
for(n=0;n<32;n++)
{
write_data(0x00);
}
}
}
/*显示汉字子程序--正常*/
void showhz(unsigned char code *s)
{
while(*s>0)
{
write_data(*s);
s++;
delay_us(250);
}
}
/*主函数*/
void main()
{
sub_int(); //调用初始化函数进行初始化操作
clrsreen(); //扩充指令清屏
/*基本指令清屏*/
write_cmd(0x30);
write_cmd(0x01);
delay_us(50);
/*屏幕滚动显示5次*/
for(;;)
{
write_cmd(0x80);
showhz("课程设计");
delay_us(50); }} 展开
3个回答
展开全部
程序移植的时候注意下:
时钟频率大小,这个涉及到指令周期,导致你的程序中delay时间是否同预期的一致问题。因为很多芯片对时序是有要求的,12864也是如此。
还是时序问题,比较下指令周期,不同控制器是不一样的。
引脚定义,一般这个都会考虑,但还是要仔细核对检查,有一条线错了,都可能导致屏幕点不亮。屏幕点不亮一般是时序这方面有问题——当然先排除硬件问题以及背光灯问题。
时钟频率大小,这个涉及到指令周期,导致你的程序中delay时间是否同预期的一致问题。因为很多芯片对时序是有要求的,12864也是如此。
还是时序问题,比较下指令周期,不同控制器是不一样的。
引脚定义,一般这个都会考虑,但还是要仔细核对检查,有一条线错了,都可能导致屏幕点不亮。屏幕点不亮一般是时序这方面有问题——当然先排除硬件问题以及背光灯问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的12864是什么驱动?
追问
ST7920
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询