51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > AVR单片机 > 详细内容
ATMEGA8单片机驱动LCD1602液晶C程序
发布时间:2009/8/6  阅读次数:4362  字体大小: 【】 【】【

调试过程总结一下:
1)由于找不到de1620资料,不知道它de操作时序。看到一些帖子说16201602没区别,还shi有点将信将疑。后面用网友编写de1602程序试验,才知道它们俩没啥区别。
2)关于shi否检测LCD处于空闲,觉得还shi最好在写指令和写数据时都加上。不检测,会导致显示结果不正常。
3)由于连线很多14根(加上背光就shi16根),如果有一根除了问题就会影响到显示。所以我shi用万用表一根线一根线量了之后才通电试验de。
4)看到很多帖子都建议在初始化LCD前延时几十毫秒。本例中并没有延时,显示也正常。
5)总de说来,不shi很难。在遇到问题时只要能够仔细分析,就能找出原因和解决方法。自己前几天在试程序时就shi显示结果不对,一直在检查自己de程序,没想到原来shi单片机deFlash到寿命了……那个郁闷啊…………

头文件中有五个函数:

Function1.unsigned char AskBusy(void)                   询问LCD1620shi否空闲, 返回值"1"空闲, "0"为忙;
Function2.WritEDAta(char data)                                               写数据到LCD1620;
Function3.WriteCommand(char command)         写指令到LCD1620;                                                 
Function4.PutOneCharLCD(x,y,*Disp)                          在LCD1620上显示一个字符, x,y定义位置
Function5.PutStringLCD(a,b,*DispString)             在LCD1620上显示一个字符串, a,b定义初始位置.                                                                                                                                                                                Function6.LCD_Init()                                                                                     初始化LCD

在使用此头文件之前,必须有以下宏定义:

#define DataPortPullup PORTx                                
#define DataPortDirection DDRx                        
#define ReadLCDPin PINx                                                                                                                                                                                                                                             
#define CtrlPortPullup PORTx                                    
#define CtrlPortDirection DDRx                              
#define RS_Bit Px?                                                      
#define RW_Bit Px?                                                        
#define E_Bit Px?  

其中“x”代表B,C,D(mega8中无A口),"?"代表“0~1”

完整头文件如下(解释搞了一大堆,也学学用英语……):

/*******************************************************/
/*         Project         :1620 Display Headfile                           */
/*         Date               :2008,3,11                                                   */
/*         Author           :lhy                                                               */
/*         Version         :v1.1                                                             */
/*         Rework           :lhy                                                               */
/*         Rework Date :2008.4.28                                                   */
/*                                                                                                         */
/*         Comments       :                                                                     */
/*         1 Function Description                                                   */
/*                 Function1.unsigned char AskBusy(void)             */
/*                     --Calls this Fun to ask if LCD is busy,     */
/*                     1--free,0--busy;                                                   */
/*                 Function2.WritEDAta(char data)                           */
/*                     --Write data to LCD                                             */
/*                 Function3.WriteCommand(char command)               */
/*                     --write command to LCD                                       */
/*                 Function4.PutOneCharLCD(x,y,*Disp)                   */
/*                     --Put one char to LCD.                                       */
/*                 Function5.PutStringLCD(a,b,*DispString)         */
/*                     --Put String to LCD. Max length 32bits.     */
/*                                                                                                         */
/*         2 How to use                                                                       */
/*                 Before use this HeadFile,                                     */
/*             need to define as below:                                           */
/*                 #define DataPortPullup PORTx                               */
/*                 #define DataPortDirection DDRx                           */
/*                 #define ReadLCDPin PINx                                         */
/*                 #define CtrlPortPullup PORTx                               */
/*                 #define CtrlPortDirection DDRx                           */
/*                 #define RS_Bit Px?                                                   */
/*                 #define RW_Bit Px?                                                   */
/*                 #define E_Bit Px?                                                     */
/*                         x -> A,B,C,D...                                             */
/*                         ? -> 0,1,2,3,4,5,6,7                                   */
/*                 And set control port output,like this:           */
/*                 CtrlPortDirection |=                                               */
/*                         (1<<E_Bit) | (1<<RS_Bit) | (1<<RW_Bit); */
/*         3 Add the Function "LCD_Init(void)"                         */
/*                 Before this Fun, you must set control port   */
/*             output.                                                                             */
/*******************************************************/

#ifndef _LCD1620_h
#define _LCD1620_h

//Calls this Fun to ask if LCD is busy,1--free,0--busy
unsigned char AskBusy(void)
{
   DataPortDirection = 0x00;
   DataPortPullup = 0xff;//enable pullup res
   CtrlPortPullup |= (1<<RW_Bit);//Set RW
   CtrlPortPullup &= ~(1<<RS_Bit);//Clear RS
   CtrlPortPullup |= (1<<E_Bit);//set enable pin
   if((ReadLCDPin & (1<<7))==0)
       return 1;//lcd is free
   else
       return 0;//lcd is busy
}

//wait until LCD was free
void WaitForFree(void)
{
   unsigned char BusyBit;
   do
     {
     BusyBit = AskBusy();
     }
   while(BusyBit !=1);
   CtrlPortPullup &= (~1<<E_Bit);//Clear enable pin
}

//Write data to LCD
void WritEDAta(char data)
{
   WaitForFree();
   CtrlPortPullup &= ~(1<<RW_Bit);//Clear RW
   CtrlPortPullup |= (1<<RS_Bit);//Set RS
  
   DataPortDirection = 0xff;
   DataPortPullup = data;
   CtrlPortPullup |= (1<<E_Bit);//set E
   CtrlPortPullup &= ~(1<<E_Bit);//Clear E
}

//write command to LCD
void WriteCommand(char command)
{
   WaitForFree();
   CtrlPortPullup &= ~(1<<RS_Bit);//Clear RS
   CtrlPortPullup &= ~(1<<RW_Bit);//Clear RW
   DataPortDirection |= 0xff;
   DataPortPullup = command;
  
   CtrlPortPullup |= (1<<E_Bit);//set E
   CtrlPortPullup &= ~(1<<E_Bit);//Clear E
}

//Write one char to LCD.
void PutOneCharLCD(unsigned char x,unsigned char y,unsigned char *Disp)
{
   unsigned char Location;
   if(x == 0)
       {
       Location = y | (1<<7);
       }
   else if(x == 1)
       {
       Location = y | (1<<6) |(1<<7);
       }
   WriteCommand(Location);
   WritEDAta(*Disp);
}

//Write String to LCD. Max length 32bits(determined by the location of the first byte).
void PutStringLCD(unsigned char a,unsigned char b,unsigned char *DispString)
{
   do
       {
       PutOneCharLCD(a,b,DispString);
       b ++;
       DispString ++;
       }
   while((b <= 15) && (*DispString));
  
   if(*DispString)
       {
       a ++;//Jump to 2nd row.
       b = 0;
       do
           {
           PutOneCharLCD(a,b,DispString);
           b ++;
           DispString ++;
           }
       while((b <= 15) && (*DispString));
       }
}

//Initialize the LCD1620
void LCD_Init(void)
{
   WriteCommand(0x38);//16X2,5X7 lattice,8 bit for transmit
   WriteCommand(0x08);//Close the display and cursor
   WriteCommand(0x0f);//Set cursor and enable dispaly
   WriteCommand(0x06);
   WriteCommand(0x01);//Clear the screen
}

#endif

把此头文件包含到主程序中:

/*******************************************************/
/*         Project     :1620 Display Function                               */
/*         Compiler   :ICCAVR 6.03A                                                 */
/*         Date           :2008,4,28                                                    */
/*         Author       :lhy                                                                   */
/*         Chip type :Atmega8                                                           */
/*         Comments   :                                                                         */
/*******************************************************/

#i nclude "iom8v.h"

#define DataPortPullup PORTD
#define DataPortDirection DDRD
#define ReadLCDPin PIND
#define CtrlPortPullup PORTC
#define CtrlPortDirection DDRC
#define RS_Bit PC0
#define RW_Bit PC1
#define E_Bit PC2

#i nclude "LCD1620.h"

void main()
{
   OSCCAL=0XA5;
   CtrlPortDirection |= ((1<<E_Bit)|(1<<RS_Bit)|(1<<RW_Bit));
   LCD_Init();
   PutStringLCD(0,0,"Li Heng Yuan is a good boy!!");
}

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号