搜索
bottom↓
回复: 48

M16 LCD1602显示程序优化,超级稳定+汉字+高可移植性+精确延时

[复制链接]

出0入0汤圆

发表于 2009-3-6 13:37:07 | 显示全部楼层 |阅读模式
//M16_8MHZ_20090304
/************************宏定义******************************/
#include <iom16v.h>
#include <macros.h>

#define uint  unsigned int
#define uchar unsigned char

#define LCD1602_EN_PORT    PORTA
#define LCD1602_RW_PORT    PORTA
#define LCD1602_RS_PORT    PORTA
#define LCD1602_DATA_PORT  PORTA

#define LCD1602_EN         (1 << PA0)
#define LCD1602_RW         (1 << PA1)
#define LCD1602_RS         (1 << PA2)
#define LCD1602_DATA       0xf0
//DATA必须为连续的端口高四位

#define LCD1602_EN_DDR     DDRA
#define LCD1602_RW_DDR     DDRA
#define LCD1602_RS_DDR     DDRA
#define LCD1602_DATA_DDR   DDRA

#define LCD1602_DATA_PIN   PINA

/***********************函数声明***********************************/
void LCD1602_init         ( void );
void LCD1602_en_wait          ( void );
void LCD1602_en_write     ( void );
void LCD1602_set_xy       ( signed char x, uchar y );
void LCD1602_write_ins    ( uchar ins );
void LCD1602_write_data   ( uchar data );
void LCD1602_write_string ( uchar x,uchar y,uchar *s );
void LCD1602_write_pic    ( uchar addr , uchar c[8] );
void delay_nus            ( uint n );
void delay_nms            ( uint n );

/************************主函数*****************************************/
void main( void )
{
     uchar c1[8] = {0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02},   //年
           c2[8] = {0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11},   //月
           c3[8] = {0x0f,0x09,0x09,0x09,0x0f,0x09,0x09,0x0f};   //日

         LCD1602_init();
         
         LCD1602_write_pic(1,c1);
     LCD1602_write_pic(2,c2);
         LCD1602_write_pic(3,c3);
         
     while(1)
     {
             LCD1602_write_ins(0x01);
                 LCD1602_write_string(0,0,"TIME:");
                 LCD1602_write_string(-2,0,"2009");
                 LCD1602_write_data(0x01);
                 LCD1602_write_string(-2,0,"03");
                 LCD1602_write_data(0x02);
                 LCD1602_write_string(-2,0,"06");
                 LCD1602_write_data(0x03);
                 
                 LCD1602_write_string(1,0,"FHimem Hacker");

         delay_nms(3000);
                 
                 LCD1602_write_ins(0x01);
         LCD1602_write_string(0,0,"feiniao200201");
         LCD1602_write_string(1,0,"@163.com");
                 
         delay_nms(3000);
      }
}

/************************子函数*****************************************/
void LCD1602_init( void )       //液晶初始化
{
        LCD1602_EN_DDR   |= LCD1602_EN  ;
        LCD1602_RW_DDR   |= LCD1602_RW  ;
        LCD1602_RS_DDR   |= LCD1602_RS  ;
        LCD1602_DATA_DDR |= LCD1602_DATA;

        delay_nms(15);
        LCD1602_write_ins(0x28);//显示模式设置三次(此时不管lcd空闲与否)
        delay_nms(5);
        LCD1602_write_ins(0x28);
        delay_nms(5);
        LCD1602_write_ins(0x28);
        delay_nms(5);
        LCD1602_write_ins(0x28);//4位显示
        //以后每次写指令、读/写数据操作均需要检测忙信号
       
        LCD1602_write_ins(0x08); //显示关闭
        LCD1602_write_ins(0x01); //显示清屏
        LCD1602_write_ins(0x06); //显示光标移动设置
        LCD1602_write_ins(0x0c); //显示开及光标设置
}


void LCD1602_en_wait(void)
{
        LCD1602_DATA_DDR&=~LCD1602_DATA;//设置busy口为输入
        LCD1602_RS_PORT&=~LCD1602_RS;//RS=0
        LCD1602_RW_PORT|=LCD1602_RW;//RW=1
       
        delay_nus(1);
        LCD1602_EN_PORT|=LCD1602_EN;//E=1
        delay_nus(1);
       
        while(LCD1602_DATA_PIN&(1<<7));//等待LCD1602_DB7为0
       
        LCD1602_EN_PORT&=~LCD1602_EN;//重设E=0
        LCD1602_DATA_DDR|=LCD1602_DATA;//设置busy口为输出
}

void LCD1602_en_write(void)  //液晶使能
{
  LCD1602_EN_PORT|=LCD1602_EN;
  delay_nus(1);
  LCD1602_EN_PORT&=~LCD1602_EN;
}

void LCD1602_set_xy( signed char x, uchar y )  //写地址函数
{
    if(x>-1)LCD1602_write_ins( 0x40+(0x40<<x)+y);
    else if(x==-1) LCD1602_write_ins( 0x40+(y<<3));
}

void LCD1602_write_data   ( uchar data )
{        
  LCD1602_en_wait();
  
  LCD1602_RW_PORT&=~LCD1602_RW;//RW=0
  LCD1602_RS_PORT|=LCD1602_RS;  //RS=1
  
  LCD1602_DATA_PORT&=0X0f;
  LCD1602_DATA_PORT|=data&0xf0;  //写高四位
  LCD1602_en_write();
  
  data=data<<4;
   
  LCD1602_DATA_PORT&=0X0f;
  LCD1602_DATA_PORT|=data&0xf0;   //写低四位
  LCD1602_en_write();
}

void LCD1602_write_ins(unsigned char command) // 写数据
{
  if(command!=0x38||command!=0x28)LCD1602_en_wait();
  
  LCD1602_RW_PORT&=~LCD1602_RW;   //RW=0
  LCD1602_RS_PORT&=~LCD1602_RS;   //RS=0
  
  LCD1602_DATA_PORT&=0X0f;
  LCD1602_DATA_PORT|=command&0xf0; //写高四位
  LCD1602_en_write();
  
  command=command<<4;
  
  LCD1602_DATA_PORT&=0x0f;
  LCD1602_DATA_PORT|=command&0xf0;  //写低四位
  LCD1602_en_write();
}

void LCD1602_write_string(uchar x,uchar y,uchar *s)
{
    LCD1602_set_xy( x, y );
    while (*s)
        LCD1602_write_data( *s++ );
}

void LCD1602_write_pic(uchar addr,uchar c[8])
{
    uchar i=8;
        LCD1602_set_xy( -1, addr );
    while (i--)
        LCD1602_write_data( *c++ );
}

void delay_nus(unsigned int n)       //N us延时函数
{
   if(n>3) n=n-3;
   else return;
   while(n--)
   {   
      NOP();
          NOP();
   }
}
  
void delay_nms(unsigned int x)
{   
        unsigned int i;
        while(x--)
        {
           i=1331;
           while(i--);
        }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-3-6 13:38:30 | 显示全部楼层
程序比网站的历程稳定多了

加入了忙检测 汉字

出0入0汤圆

 楼主| 发表于 2009-3-6 13:39:07 | 显示全部楼层
程序代码也做了不少精简

出0入0汤圆

发表于 2009-3-6 13:44:46 | 显示全部楼层
顶一个。学习一下。

出0入0汤圆

发表于 2009-3-6 18:36:32 | 显示全部楼层
用别的例子试验了几次,4位数据线就是不显示,8位正常,初始化写28时间也应该够了,不知什么原因。

出0入162汤圆

发表于 2009-3-6 19:16:57 | 显示全部楼层
1602能显示汉字???

出0入0汤圆

发表于 2009-3-6 19:23:39 | 显示全部楼层
可以写几个自定义字符,不过只能那么几个,还是6*8的。多谢共享!

出0入0汤圆

发表于 2009-3-6 20:16:26 | 显示全部楼层
说啥呢.呵呵...

我昨天晚上也玩这个玩意显示汉字来着也整出来了.

玩了4个晚上才整出来...

你只显示了6*8的汉字,可以利用64byt的CGRAM显示3*6x2*8的汉字.效果嘛.反正怎么看都别扭.

出0入0汤圆

 楼主| 发表于 2009-3-7 08:33:31 | 显示全部楼层
【4楼】 AAVVRR

我的加入忙检测后就好了

液晶没有处理完数据,你就发送,它处理不过来

出0入0汤圆

发表于 2009-3-7 08:43:41 | 显示全部楼层
我搞了个最简单的都没搞出来,谢谢楼主分享!!

出0入18汤圆

发表于 2009-3-11 21:54:57 | 显示全部楼层
谢谢分享! 收藏中!

出0入0汤圆

发表于 2009-3-11 23:14:40 | 显示全部楼层
学习了..

出0入0汤圆

发表于 2009-3-12 16:34:31 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-6-7 10:51:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-9 22:35:32 | 显示全部楼层
学习中

出0入0汤圆

发表于 2009-6-16 21:18:21 | 显示全部楼层
楼主说一下怎么接线啊是不是
数据口是不是pa4--pa7啊
pa0-pa3接控制口啊

出0入0汤圆

发表于 2009-6-16 21:50:35 | 显示全部楼层
学习中,感谢楼主

出0入0汤圆

 楼主| 发表于 2009-6-19 16:19:43 | 显示全部楼层
【15楼】 lakemy6   

看看宏定义就知道了,改端口直接改宏就可以,所以修改起来比较方便


编译器编译时,宏会被特定的代码替换,加了宏对效率没影响,占得空间也一样

出0入0汤圆

发表于 2009-6-19 16:53:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-19 17:00:04 | 显示全部楼层
Mark

出0入0汤圆

发表于 2009-6-19 20:31:13 | 显示全部楼层
水一贴

出0入0汤圆

发表于 2009-6-19 21:06:04 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2009-6-20 21:01:28 | 显示全部楼层
hehe

出0入0汤圆

发表于 2010-8-19 01:17:11 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-6-15 16:31:29 | 显示全部楼层
1602显示汉字

出0入0汤圆

发表于 2011-6-16 20:57:01 | 显示全部楼层
正在搞这个,研究研究。

出0入0汤圆

发表于 2011-7-4 17:23:19 | 显示全部楼层
哈哈,终于成功驱动1602啦。

出0入0汤圆

发表于 2011-7-21 12:29:12 | 显示全部楼层
正在研究4位驅動,多謝分享。

出0入0汤圆

发表于 2011-7-21 13:12:25 | 显示全部楼层
1602也显示汉字了?
嗯,不错,值得收藏。

出0入0汤圆

发表于 2011-7-22 00:09:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-13 20:14:09 | 显示全部楼层
lz的程序真的好好用,对1602for_4bit的延时一直很头疼
刚刚贴上用了下,真是无比的好用,谢谢楼主
看来lz是用时间了,再次感谢

出0入0汤圆

发表于 2011-8-13 20:55:11 | 显示全部楼层
学习了.

出0入0汤圆

发表于 2012-10-29 19:43:07 | 显示全部楼层
lz的程序真的好好用

出0入0汤圆

发表于 2012-11-2 15:27:07 | 显示全部楼层
mark!!!!!

出0入0汤圆

发表于 2012-11-13 15:02:15 | 显示全部楼层

出0入0汤圆

发表于 2012-11-16 14:06:47 | 显示全部楼层
果断来学习一下

出0入0汤圆

发表于 2012-11-16 18:49:40 | 显示全部楼层
1602能显示汉字,真行啊

出0入0汤圆

发表于 2012-11-17 13:09:23 | 显示全部楼层
好好研究一下,谢谢LZ

出0入0汤圆

发表于 2013-1-23 15:07:34 | 显示全部楼层
有空,好好看看!

出0入0汤圆

发表于 2013-1-23 15:36:18 | 显示全部楼层
有空仔细研究下      

出0入0汤圆

发表于 2013-1-31 19:09:14 来自手机 | 显示全部楼层
标记一下

出10入0汤圆

发表于 2013-2-1 10:33:01 | 显示全部楼层
顶一个                        

出0入0汤圆

发表于 2013-2-1 12:53:50 | 显示全部楼层
标记,谢谢,学习了

出0入0汤圆

发表于 2013-6-4 11:51:07 | 显示全部楼层
学习哈,谢谢 LZ分享

出0入0汤圆

发表于 2013-6-4 12:47:36 | 显示全部楼层
分享一下

出0入0汤圆

发表于 2013-6-4 16:33:32 | 显示全部楼层
必须顶贴

出0入0汤圆

发表于 2013-6-15 17:39:19 | 显示全部楼层
AAVVRR 发表于 2009-3-6 18:36
用别的例子试验了几次,4位数据线就是不显示,8位正常,初始化写28时间也应该够了,不知什么原因。 ...

功能设置的DL不是高电平为4位数据线吗,为什么写28H的,28H不是把DL位置低了吗?不就成了8位总线了吗?

出0入0汤圆

发表于 2013-8-1 17:42:21 | 显示全部楼层
借用一下,谢谢了。

出0入0汤圆

发表于 2013-10-13 15:46:29 | 显示全部楼层
MARK ,谢谢。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表