论坛风格切换切换到宽版
  • 3426阅读
  • 3回复

1601的驱动程序抱 [复制链接]

上一主题 下一主题
离线ncradio
 
发帖
11345
只看楼主 倒序阅读 0楼 发表于: 2004-07-08
这个程序包是我的网上找的,省的自己看这时序图去写.



用查表的方式实现显示,这个是程序中不太使用,



大家可以自己做点修改就可以了!
离线ncradio
发帖
11345
只看该作者 1楼 发表于: 2004-07-14
这个程序有错,大家不要用

对不起啊,没审查就直接发上来了

终于调试好了
离线bg4jj
发帖
5094
只看该作者 2楼 发表于: 2004-07-23
正确的是不是该发一下呀?:)
离线bravoradio
发帖
1968
只看该作者 3楼 发表于: 2004-07-24
16x2
/*===================================================================

                 ks0070(44780) 16x2 字符液晶屏驱动演示程序       晓奇
=====================================================================
连接线图:      lcm-------51      lcm-------51      lcm--------51
         db0-----p0.0      db4-----p0.4      rs-------p2.0
         db1-----p0.1      db5-----p0.5      rw-------p2.1
         db2-----p0.2      db6-----p0.6      e--------p2.7
         db3-----p0.3      db7-----p0.7      vlcd接1k2电阻到gnd

[注]:at89c51的晶振频率为12mhz
====================================================================*/

#include <reg51.h>
#include<intrins.h>

//变量类型标识的宏定义,大家都喜欢这么做
#define      uchar unsigned char
#define uint unsigned int

// 控制引脚定义,不同的连接必须修改的部分
sbit      rs      = p2^0;
sbit      rw      = p2^1;
sbit      elcm      = p2^7;
#define dataport p0                        // 数据端口

#define busy      0x80


code char exampl[]="for an example.   - by xiaoqi\n";

void delay400ms(void);
void delay5ms(void);
void waitforenable( void );
void lcdwritedata( char dataw );
void lcdwritecommand( uchar cmd,uchar attribc );
void lcdreset( void );
void display( uchar dd );
void disponechar(uchar x,uchar y,uchar wdata);
void eputstr(uchar x,uchar y, uchar code *ptr);

//测试主程序
void main(void)
{
     uchar temp;
     
     delay400ms();

     lcdreset();
     temp = 32;
     eputstr(0,0,exampl);            // 上面一行显示一个预定字符串

     delay400ms();
     delay400ms();
     delay400ms();
     delay400ms();
     delay400ms();
     delay400ms();
     delay400ms();
     delay400ms();

     while(1)
     {
           temp &= 0x7f;                  // 只显示ascii字符
           if (temp<32)temp=32;      // 屏蔽控制字符,不予显示
           display( temp++ );
           delay400ms();
     }
}

/*=======================================================
显示字符串
=======================================================*/
void eputstr(uchar x,uchar y, uchar code *ptr) {
uchar i,l=0;
     while (ptr[l] >31){l++;};
     for (i=0;i<l;i++) {
           disponechar(x++,y,ptr);
           if ( x == 16 ){
                 x = 0; y ^= 1;
           }
     }
}

/*=======================================================
演示一行连续字符串,配合上位程序演示移动字串
=======================================================*/
void display( uchar dd ) {

uchar i;
     
     for (i=0;i<16;i++) {
           disponechar(i,1,dd++);
           dd &= 0x7f;
           if (dd<32) dd=32;
     }
}

/*=======================================================
显示光标定位
=======================================================*/
void locatexy( char posx,char posy) {

uchar temp;

     temp = posx & 0xf;
     posy &= 0x1;
     if ( posy )temp |= 0x40;
     temp |= 0x80;
     lcdwritecommand(temp,0);
}

/*=======================================================
按指定位置显示数出一个字符
=======================================================*/
void disponechar(uchar x,uchar y,uchar wdata) {

     locatexy( x, y );                        // 定位显示地址
     lcdwritedata( wdata );                  // 写字符
}

/*=======================================================
初始化程序, 必须按照产品资料介绍的初始化过程进行
=======================================================*/
void lcdreset( void ) {

       lcdwritecommand( 0x38, 0);                  // 显示模式设置(不检测忙信号)
           delay5ms();
     lcdwritecommand( 0x38, 0);                  // 共三次
           delay5ms();
     lcdwritecommand( 0x38, 0);
           delay5ms();

     lcdwritecommand( 0x38, 1);                  // 显示模式设置(以后均检测忙信号)
  lcdwritecommand( 0x08, 1);                  // 显示关闭
       lcdwritecommand( 0x01, 1);                  // 显示清屏
     lcdwritecommand( 0x06, 1);                  // 显示光标移动设置
     lcdwritecommand( 0x0c, 1);                  // 显示开及光标设置
}

/*=======================================================
写控制字符子程序: e=1 rs=0 rw=0
=======================================================*/
void lcdwritecommand( uchar cmd,uchar attribc ) {

     if (attribc) waitforenable();                        // 检测忙信号?
     
     rs = 0;      rw = 0; _nop_();

     dataport = cmd; _nop_();                              // 送控制字子程序
     
     elcm = 1;_nop_();_nop_();elcm = 0;                  // 操作允许脉冲信号      
}
     
/*=======================================================
当前位置写字符子程序: e =1 rs=1 rw=0
=======================================================*/
void lcdwritedata( char dataw ) {

     waitforenable();                                          // 检测忙信号

     rs = 1; rw = 0; _nop_();

  dataport = dataw; _nop_();

     elcm = 1; _nop_(); _nop_(); elcm = 0;            // 操作允许脉冲信号            

}

/*=======================================================
正常读写操作之前必须检测lcd控制器状态:      cs=1 rs=0 rw=1
db7:   0 lcd控制器空闲; 1 lcd控制器忙
========================================================*/
void waitforenable( void ) {

     dataport = 0xff;

     rs =0; rw = 1; _nop_();      elcm = 1; _nop_(); _nop_();
     
     while( dataport & busy );

     elcm = 0;
}      
             

// 短延时
void delay5ms(void)
{
     uint i = 5552;
     while(i--);
}

//长延时
void delay400ms(void)
{
     uchar i = 5;
     uint j;
     while(i--)
     {
           j=7269;
           while(j--);
     };
}