51单片机驱动12864液晶问题? 30
我的液晶是ST7920的,12864,要做成下面这种形式的界面要怎么做啊?高手指教,最好给出相关的程序,能看出思路最好不过了小弟谢过了...
我的液晶是ST7920的,12864,要做成下面这种形式的界面要怎么做啊?高手指教,最好给出相关的程序,能看出思路最好不过了 小弟谢过了
展开
2个回答
展开全部
很简单的,对照硬件连接
#include <REG52.H>
#include <intrins.H>
//定义引脚连接
#define LCD_DATA P1 //数据口
sbit RS = P2^0; //并行的指令/数据选择信号, H数据, L命令
sbit RW = P2^1; //并行读写选择信号, H读, L写
sbit E = P2^2; //并行使能端, H有效, L无效
//待显示的内容
unsigned char code Tab1[]={"自定义内容"};
unsigned char code Tab2[]={"自定义内容"};
unsigned char code Tab3[]={"自定义内容"};
unsigned char code Tab4[]={"自定义内容"};
//延时子程序
void Delay1mS(unsigned int tt) //延时tt毫秒
{
unsigned char i;
while(tt--)
for(i=113;i>0;i--); ;
}
bit CheckBusy() //读BF标志位,检查LCD是否就绪
{
RS=0;
_nop_();
RW=1;
_nop_();
E=1;
_nop_();
if(LCD_DATA&0x80)
return 1;
else
return 0;
}
void Wait() //等待LCD就绪
{
}
/*unsigned char Read_Data() //读数据
{
Wait();
RS=1;
RW=1;
E=1;
_nop_();
return LCD_DATA;
}
*/
Write_Data(unsigned char dat) //写一个字节数据
{
Wait();
RS=1;
RW=0;
E=1;
_nop_();
LCD_DATA=dat;
E=0;
_nop_();
}
Write_Command(unsigned char dat) //写命令
{
Wait();
RS=0;
RW=0;
E=1;
_nop_();
LCD_DATA=dat;
E=0;
_nop_();
}
Write_String(unsigned char *p) //写字符串
{
char cnt=0;
while(*(p+cnt)!='\0')
{
Write_Data(*(p+cnt));
cnt++;
}
}
void LCD_Init() //LCD初始化
{
Write_Command(0x30);//基本指令, 扩充指令为34H
Delay1mS(1);
Write_Command(0x0c);//显示开, 关光标 .开光标0X0E
Delay1mS(1);
Write_Command(0x01);//清屏
Delay1mS(1);
}
void Set_Position(unsigned char x, unsigned char y) //设置待显示的位置
{
unsigned char p;
switch(x%4)
{
case 0: p = 0x80; break; //第一行开始地址
case 1: p = 0x90; break; //第二行
case 2: p = 0x88; break; //第三行
case 3: p = 0x98; break; //第四行
}
p += y;
Write_Command(p);
}
main()
{
LCD_Init();
Set_Position(0,0);
Write_String(Tab1);
Set_Position(1,0);
Write_String(Tab2);
Set_Position(2,0);
Write_String(Tab3);
Set_Position(3,0);
Write_String(Tab4);
while(1);
}
#include <REG52.H>
#include <intrins.H>
//定义引脚连接
#define LCD_DATA P1 //数据口
sbit RS = P2^0; //并行的指令/数据选择信号, H数据, L命令
sbit RW = P2^1; //并行读写选择信号, H读, L写
sbit E = P2^2; //并行使能端, H有效, L无效
//待显示的内容
unsigned char code Tab1[]={"自定义内容"};
unsigned char code Tab2[]={"自定义内容"};
unsigned char code Tab3[]={"自定义内容"};
unsigned char code Tab4[]={"自定义内容"};
//延时子程序
void Delay1mS(unsigned int tt) //延时tt毫秒
{
unsigned char i;
while(tt--)
for(i=113;i>0;i--); ;
}
bit CheckBusy() //读BF标志位,检查LCD是否就绪
{
RS=0;
_nop_();
RW=1;
_nop_();
E=1;
_nop_();
if(LCD_DATA&0x80)
return 1;
else
return 0;
}
void Wait() //等待LCD就绪
{
}
/*unsigned char Read_Data() //读数据
{
Wait();
RS=1;
RW=1;
E=1;
_nop_();
return LCD_DATA;
}
*/
Write_Data(unsigned char dat) //写一个字节数据
{
Wait();
RS=1;
RW=0;
E=1;
_nop_();
LCD_DATA=dat;
E=0;
_nop_();
}
Write_Command(unsigned char dat) //写命令
{
Wait();
RS=0;
RW=0;
E=1;
_nop_();
LCD_DATA=dat;
E=0;
_nop_();
}
Write_String(unsigned char *p) //写字符串
{
char cnt=0;
while(*(p+cnt)!='\0')
{
Write_Data(*(p+cnt));
cnt++;
}
}
void LCD_Init() //LCD初始化
{
Write_Command(0x30);//基本指令, 扩充指令为34H
Delay1mS(1);
Write_Command(0x0c);//显示开, 关光标 .开光标0X0E
Delay1mS(1);
Write_Command(0x01);//清屏
Delay1mS(1);
}
void Set_Position(unsigned char x, unsigned char y) //设置待显示的位置
{
unsigned char p;
switch(x%4)
{
case 0: p = 0x80; break; //第一行开始地址
case 1: p = 0x90; break; //第二行
case 2: p = 0x88; break; //第三行
case 3: p = 0x98; break; //第四行
}
p += y;
Write_Command(p);
}
main()
{
LCD_Init();
Set_Position(0,0);
Write_String(Tab1);
Set_Position(1,0);
Write_String(Tab2);
Set_Position(2,0);
Write_String(Tab3);
Set_Position(3,0);
Write_String(Tab4);
while(1);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询