问题描述:我用12864液晶显示字符表的时候,液晶显示字符不停地从第一行到最后一行快速刷新;后来我打算在主函数中加入“while(1);”希望可以停止刷新,字符稳定显示在液晶屏幕上。但是下载程序到单片机中,结果什么都不显示了。尝试了很多方法:验证串行时序,查询手册规范初始化,调整延长时间,但并没解决,望大家帮忙找找问题。
基本信息:lcd:jm12864g 驱动器是st7920 单片机:stc89c52 编译环境: keil软件
程序内容:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//*******JM12864端口定义***********//
sbit cs=P3^5; //数据命令输入选择
sbit sid=P3^6; //读写操作选择
sbit sclk=P3^4; //液晶使能控制
sbit psb=P3^7; //串并数据传输方式选择
sbit dula=P2^6;
sbit wela=P2^7; //位锁端锁
//***********************************************************//
//* 延迟函数 *//
//***********************************************************//
void delay_Nms(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
delayNOP();
}
}
}
//***********************************************************//
//* 发送一个字节数据 *//
//***********************************************************//
void sendbyte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
if((byte<<i)&0x80)
{
sid= 1;
}
else
{
sid= 0;
}
sclk= 0;
sclk= 1;
}
}
void send(bit start, uchar ddata) //写指令或数据
{
uchar start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //写指令
else
start_data=0xfa; //写数据
cs=1;
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
sendbyte(start_data); //发送起始信号
delay_Nus(600);
sendbyte(Hdata); //发送高四位
delay_Nus(600);
sendbyte(Ldata); //发送低四位
delay_Nus(600);
cs=0;
}
//***********************************************************//
//* LCD初始化设定 *//
//***********************************************************//
void lcd_init()
{
psb=0;
send(0,0x30); //基本指令集
delay_Nms(1);
send(0,0x30); //基本指令集
delay_Nms(1);
send(0,0x0c); //显示开,关光标
delay_Nms(1);
send(0,0x01); //清屏
delay_Nms(20);
send(0,0x06); //游标右移
delay_Nms(10);
send(0,0x80); //设定起始位置
}
//***********************************************************//
//* 主程序 *//
//***********************************************************//
void main()
{
uchar i;
delay_Nms(1); //延时
lcd_init(); //初始化lcd
send(0,0x80); //设置显示位置为第一行第一个字符
for(i=1;i<16;i++)
{send(1,0x00+i);}
send(0,0x90); //设置显示位置为第二行第一个字符
for(i=1;i<16;i++)
{send(1,0x10+i);}
send(0,0x88);
for(i=1;i<16;i++)
{send(1,0x20+i);}
send(0,0x98); //设置显示位置为第四行第一个字符
for(i=1;i<16;i++)
{send(1,0x30+i);}
while(1);
}
|