钻石会员
主题
回帖0
积分11936
阅读权限50
注册时间2009-7-18
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2012-5-3 20:49
|
显示全部楼层
本帖最后由 LBQ691477940 于 2012-5-3 20:55 编辑
/****************************************************************************************
CGM19264CFBD-N带字库液晶显示屏端口定义(CASIL生产)
1 = VSS 10 = D2
2 = VDD 11 = D3
3 = VO 12 = D4
4 = RS 13 = D5
5 = RW 14 = D6
6 = E1(上半屏) 15 = D7
7 = E2(下半屏) 16 = RST(接到2脚)
8 = D0 17 = VEE(接个14KΩ左右的电阻到3脚)
9 = D1 18 = LED+(接个47Ω左右的电阻到2脚)
2012-05-03
/****************************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_data P0 //数据口
sbit LCD_RS = P3^5; //寄存器选择输入
sbit LCD_RW = P3^6; //液晶读/写控制
sbit LCD_EN1 = P3^4; //液晶上半使能控制
sbit LCD_EN2 = P3^7; //液晶下半使能控制
static uchar p; //液晶上下半选择 = 0上半屏 =1下半屏
uchar code dis1[] = {"CGM19264CFBD-N带字库液晶"};
uchar code dis2[] = {"6 脚E1为液晶上半使能控制"};
uchar code dis3[] = {"带字库液晶CGM19264CFBD-N"};
uchar code dis4[] = {"7 脚E2为液晶下半使能控制 "};
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void lcd_pos(uchar X,uchar Y); //确定显示位置
/****************************************************************************************
延时函数
/****************************************************************************************/
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i = 0;i < 250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/****************************************************************************************
检查LCD忙状态
lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。
/****************************************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
if(p == 0)
LCD_EN1 = 1;
if(p == 1)
LCD_EN2 = 1;
delayNOP();
result = (bit)(P0 & 0x80);
if(p == 0)
LCD_EN1 = 0;
if(p == 1)
LCD_EN2 = 0;
return(result);
}
/****************************************************************************************
写指令数据到LCD
RS=L,RW=L,E=高脉冲,D0-D7=指令码。
/****************************************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
if(p == 0)
LCD_EN1 = 0;
if(p == 1)
LCD_EN2 = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
if(p == 0)
LCD_EN1 = 1;
if(p == 1)
LCD_EN2 = 1;
delayNOP();
if(p == 0)
LCD_EN1 = 0;
if(p == 1)
LCD_EN2 = 0;
}
/****************************************************************************************
写显示数据到LCD
RS=H,RW=L,E=高脉冲,D0-D7=数据。
/****************************************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
if(p == 0)
LCD_EN1 = 0;
if(p == 1)
LCD_EN2 = 0;
P0 = dat;
delayNOP();
if(p == 0)
LCD_EN1 = 1;
if(p == 1)
LCD_EN2 = 1;
delayNOP();
if(p == 0)
LCD_EN1 = 0;
if(p == 1)
LCD_EN2 = 0;
}
/****************************************************************************************
LCD初始化设定
/****************************************************************************************/
void lcd_init()
{
p = 0; //上半屏
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
p = 1; //下半屏
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/****************************************************************************************
主程序
/****************************************************************************************/
main()
{
uchar i;
lcd_init(); //初始化LCD
/****************************************************************************/
while(1)
{
p = 0;
lcd_pos(0,0); //设置显示位置为上半屏第1行的第1个字符
i = 0;
while(dis1 != '\0')
{ //显示字符
lcd_wdat(dis1);
delay(50); //让其一个一个慢慢显示出来
i++;
}
/****************************************************************************/
lcd_pos(1,0); //设置显示位置为上半屏第2行的第1个字符
i = 0;
while(dis2 != '\0')
{
lcd_wdat(dis2); //显示字符
delay(50); //让其一个一个慢慢显示出来
i++;
}
/****************************************************************************/
p = 1;
lcd_pos(0,0); //设置显示位置为下半屏第1行的第1个字符
i = 0;
while(dis3 != '\0')
{
lcd_wdat(dis3); //显示字符
delay(50); //让其一个一个慢慢显示出来
i++;
}
/****************************************************************************/
lcd_pos(1,0); //设置显示位置为下半屏第2行的第1个字符
i = 0;
while(dis4 != '\0')
{
lcd_wdat(dis4); //显示字符
delay(50); //让其一个一个慢慢显示出来
i++;
}
/****************************************************************************************/
delay(1000);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
p = 0;
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1000);
}
}
/****************************************************************************************
设定显示位置
/****************************************************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if(X == 0)
X = 0x80;
if(X == 1)
X = 0x90;
pos = X + Y ;
lcd_wcmd(pos); //显示地址
}
/****************************************************************************************/
请问大虾怎么显示不正常呢?这程序在CGM19264CFBD-N带字库液晶显示上显示有正常,不知啥问题呀!
|
|