12864 C语言程序 带详细注解

来源:互联网 发布:java读取zip文件乱码 编辑:程序博客网 时间:2024/06/10 17:23
12864 C语言程序 带详细注解 作者 hyhv126 日期 2010-8-31 0:19:00

/*Allen.H 2010-8-30*/

/*逐字显示汉字*/
#i nclude <reg52.h>
#i nclude <intrins.h>

#define uchar unsigned char
#define uint  unsigned int
/*TS12864A-3 端口定义*/
#define LCD_data  P0             //数据口
sbit LCD_RS  =  P2^4;            //寄存器选择输入
sbit LCD_RW  =  P2^5;            //液晶读/写控制
sbit LCD_E   =  P2^6;            //液晶并行使能控制
sbit LCD_PSB =  P2^1;            //串/并方式控制

 

uchar code dis1[] = {
"你好色彩日格科技" //写英文字符的话一行写16个
"我们的未来不是梦"
"让世界更美好美丽"
"品质卓越至尊服务"
};

 

#define delayNOP(); {_nop_();_nop_();_nop_();};

void delay(int);
bit lcd_busy();
void lcd_init();
void lcd_wcmd(uchar cmd);
void lcd_wdat(uchar cmd);
void lcd_pos(uchar X,uchar Y); 

/* 主程序  */

void main()
 { 
    uchar i;
 unsigned int j=0,k;

   P0=0x00;    //初始化数据口
    lcd_init(); //初始化LCD            
 while(1)      
  {
    i = 0;
  
    delayNOP();
    delayNOP();
    delayNOP();
    delayNOP();
    delayNOP();
    lcd_pos(0,0); //定位到第一行第一个字符地址
        delay(15);//改变这个时间可以改变垂直方向的显示,
       //时间短就是动态显示,四行同时显示,时间不合适就会闪烁
    for(j=0;j<16;j++)      //显示8个汉字,每个汉字两个字符宽,
          //若是英文的话,数组中一行输入16个字符
    {                  
           lcd_wdat(dis1[i]);
           i++;
       for(k=25000;k>0;k--);//改变时间控制逐字输出
    }
   
    lcd_pos(1,0);
    delay(15);
    for(j=16;j<32;j++)
    {                  
           lcd_wdat(dis1[i]);
           i++;
    for(k=25000;k>0;k--);
    }
    
    lcd_pos(2,0);
    delay(15);
    for(j=32;j<48;j++)
    {                  
           lcd_wdat(dis1[i]);
           i++;
    for(k=25000;k>0;k--);
    }
   
    lcd_pos(3,0);
    delay(15);
    for(j=48;j<64;j++)
    {                  
           lcd_wdat(dis1[i]);
           i++;
    for(k=25000;k>0;k--);
    }

 }
}

void delay(int ms)
{
    while(ms--)
 {
      uchar i;
   for(i=0;i<250;i++)  //0.5ms
    {
     _nop_();     
  _nop_();
 // _nop_();
 // _nop_();
    }
 }
}  

 

/*写指令数据到LCD  RS=L,RW=L,E=脉冲,D0-D7=指令码。只有LCD_RS的值不同
故这个函数可以和下面的写数据的函数写到一起,用两个参数,读者自己改写*/

void lcd_wcmd(uchar cmd)
{                         

    LCD_RS = 0;//并行指令选择打开
    LCD_RW = 0;//写
   
 delayNOP();
    delayNOP();
 delayNOP();
   // P0 = cmd;
 
    LCD_E = 1;//打开并口
 delayNOP();
 _nop_();
  P0 = cmd;
    delayNOP();
 delayNOP();
    LCD_E = 0; //关闭并口 这个函数怎么写,完全参照时序图去写, 
   
}

/*写显示数据到LCD RS=H,RW=L,E=脉冲,D0-D7=数据。*/

void lcd_wdat(uchar dat)
{                         

    LCD_RS = 1;
    LCD_RW = 0;

 delayNOP();
    delayNOP();
 delayNOP();
    //P0 = dat;
 

 LCD_E = 1;
 delayNOP();
 _nop_();
 P0 = dat;
    delayNOP();
 delayNOP();
    LCD_E = 0;
}

/*  LCD显示汉字初始化设定,只设必须的,若显示图片初始化设定得另外设定 */

void lcd_init()
{
 unsigned int i;
    LCD_PSB = 1;         //并口方式
   
    lcd_wcmd(0x34);      //扩充指令操作 0011xRGL  R=1扩充指令G=0关闭绘图显示L=0
 for(i=400;i>0;i--);
    lcd_wcmd(0x30);      //基本指令操作
   for(i=400;i>0;i--);
   lcd_wcmd(0x08);  //睡眠模式
   for(i=400;i>0;i--);
    lcd_wcmd(0x0C);      //显示开,关光标00001DCB  D=1整体显示,C=0关光标,B=0关游标位置
    for(i=80;i>0;i--);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(20);    //改变启动时间长短
/* lcd_wcmd(0x02);     
    delay(5);
 lcd_wcmd(0x80);     
    delay(5);*/
}

 

 

//设定显示位置

void lcd_pos(uchar X,uchar Y)
{                         
   uchar  pos;
   if (X==0)
    {X=0x80;}   //参照12864PDF文档设定
   else if (X==1)
    {X=0x90;}
   else if (X==2)
    {X=0x88;}
   else if (X==3)
   {X=0x98;}
   pos = X+Y ; 
    lcd_wcmd(pos);

原创粉丝点击