钻石会员 
 
主题
回帖0
积分11931
阅读权限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带字库液晶显示上显示有正常,不知啥问题呀! 
 
 
 |   
 
 
 
 |