問題描述:我用12864液晶顯示字符表的時候,液晶顯示字符不停地從第一行到最后一行快速刷新;后來我打算在主函數(shù)中加入“while(1);”希望可以停止刷新,字符穩(wěn)定顯示在液晶屏幕上。但是下載程序到單片機中,結果什么都不顯示了。嘗試了很多方法:驗證串行時序,查詢手冊規(guī)范初始化,調(diào)整延長時間,但并沒解決,望大家?guī)兔φ艺覇栴}。
基本信息:lcd:jm12864g 驅動器是st7920 單片機:stc89c52 編譯環(huán)境: keil軟件
程序內(nèi)容:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//*******JM12864端口定義***********//
sbit cs=P3^5; //數(shù)據(jù)命令輸入選擇
sbit sid=P3^6; //讀寫操作選擇
sbit sclk=P3^4; //液晶使能控制
sbit psb=P3^7; //串并數(shù)據(jù)傳輸方式選擇
sbit dula=P2^6;
sbit wela=P2^7; //位鎖端鎖
//***********************************************************//
//* 延遲函數(shù) *//
//***********************************************************//
void delay_Nms(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
delayNOP();
}
}
}
//***********************************************************//
//* 發(fā)送一個字節(jié)數(shù)據(jù) *//
//***********************************************************//
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) //寫指令或數(shù)據(jù)
{
uchar start_data,Hdata,Ldata;
if(start==0)
start_data=0xf8; //寫指令
else
start_data=0xfa; //寫數(shù)據(jù)
cs=1;
Hdata=ddata&0xf0; //取高四位
Ldata=(ddata<<4)&0xf0; //取低四位
sendbyte(start_data); //發(fā)送起始信號
delay_Nus(600);
sendbyte(Hdata); //發(fā)送高四位
delay_Nus(600);
sendbyte(Ldata); //發(fā)送低四位
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);
}
|