zoukankan      html  css  js  c++  java
  • 使用AVR单片机驱动RT1601 LCD显示芯片

    研究了一下,如何用ATmega 16单片机,来驱动字符型液晶显示芯片,现把研究心得写出来:
    我手里的这个RT1601液晶显示模块,使用的是S6A0069显示芯片。
    各个引脚简单说明一下:

    控制和数据引脚配置如下:
    -------------------------------
    PORTD_0 - RS
    PORTD_1 - R/W
    PORTD_2 - E
    PORTA     - DATA BUS
    ------------------------------
    LCD.h

     1#ifndef _LCD_H_
     2#define _LCD_H_
     3/*****************************************
     4RS  - PORTD_0
     5R/W - PORTD_1
     6E   - PORTD_2
     7DB     - PORTA
     8******************************************/

     9void LCD_Set_RS(void);
    10void LCD_Clear_RS(void);
    11void LCD_Set_RW(void);
    12void LCD_Clear_RW(void);
    13void LCD_Set_E(void);
    14void LCD_Clear_E(void);
    15void LCD_CheckBF(void);
    16// Write Command
    17void LCD_Write_Cmd(unsigned char byCmd);
    18// Write Data
    19void LCD_Write_Data(unsigned char byData);
    20void LCD_Delay_5ms(void);
    21void LCD_Delay_500ms(void);
    22void LCD_PortInit(void);
    23
    24// Application Interface
    25void LCD_Init(void);
    26void LCD_Display(char* pstrText);
    27
    28#endif
    29

    LCD.c
    这里是液晶驱动的实现部分,对外开放两个接口:LCD_Init, LCD_Display。(我这个模块,是两行显示的,共16个字符)

      1#include "LCD.h"
      2#include <iom16v.h>
      3#include <macros.h>
      4
      5/*****************************************
      6RS  - PORTD_0
      7R/W - PORTD_1
      8E   - PORTD_2
      9DB     - PORTA
     10******************************************/

     11
     12
     13void LCD_Set_RS(void)
     14{
     15    PORTD |= (1 << 0);
     16
     17    return;
     18}

     19
     20void LCD_Clear_RS(void)
     21{
     22    PORTD &= ~(1 << 0);
     23
     24    return;
     25}

     26
     27void LCD_Set_RW(void)
     28{
     29    PORTD |= (1 << 1);
     30
     31    return;
     32}

     33
     34void LCD_Clear_RW(void)
     35{
     36    PORTD &= ~(1 << 1);
     37
     38    return;
     39}

     40
     41void LCD_Set_E(void)
     42{
     43    PORTD |= (1 << 2);
     44
     45    return;
     46}

     47
     48void LCD_Clear_E(void)
     49{
     50    PORTD &= ~(1 << 2);
     51
     52    return;
     53}

     54
     55void LCD_CheckBF(void)
     56{    
     57    DDRA = 0x00;    // Input
     58
     59    LCD_Clear_RS();
     60    LCD_Set_RW();
     61    LCD_Set_E();
     62    while (PINA & 0x80)
     63    {
     64        ;
     65    }

     66    LCD_Clear_E();
     67
     68    DDRA = 0xFF;    // Output
     69
     70    return;
     71}

     72
     73// Write Command
     74void LCD_Write_Cmd(unsigned char byCmd)
     75{
     76    LCD_CheckBF();
     77
     78    LCD_Clear_RS();
     79    LCD_Clear_RW();
     80    LCD_Set_E();
     81    PORTA = byCmd;
     82    LCD_Clear_E();
     83
     84    return;
     85}

     86
     87// Write Data
     88void LCD_Write_Data(unsigned char byData)
     89{
     90    LCD_CheckBF();
     91
     92    LCD_Set_RS();
     93    LCD_Clear_RW();
     94    LCD_Set_E();
     95    PORTA = byData;
     96    LCD_Clear_E();
     97
     98    return;
     99}

    100
    101void LCD_Delay_5ms(void)
    102{
    103    unsigned int i = 5552;
    104    while (i--)
    105    {
    106        ;
    107    }

    108
    109    return;
    110}

    111
    112void LCD_Delay_500ms(void)
    113{
    114    unsigned char i = 5;
    115    unsigned char j = 0;
    116
    117    while (i--)
    118    {
    119        j = 7269;
    120        while (j--)
    121        {
    122            ;
    123        }

    124    }

    125
    126    return;
    127}

    128
    129// Port Init
    130void LCD_PortInit(void)
    131{
    132    PORTD = 0x00
    133    DDRD = 0xFF;           // Output
    134    DDRA = 0xFF;
    135
    136    return;
    137}

    138
    139// LCD Init
    140void LCD_Init(void)
    141{
    142    LCD_PortInit();
    143
    144    LCD_Delay_500ms();
    145
    146    LCD_Write_Cmd(0x38);    // Function Set. 8bit data length, 2-line, 5*8 font
    147    LCD_Delay_5ms();
    148    LCD_Write_Cmd(0x0C);    // Display ON/OFF Control. Display ON, Cursor OFF, Blink OFF
    149    LCD_Delay_5ms();
    150    LCD_Write_Cmd(0x01);    // Display Clear.
    151    LCD_Delay_5ms();
    152    LCD_Write_Cmd(0x06);    // Entry Mode Set. Increment mode, Entire shift off
    153
    154    return;
    155}

    156
    157void LCD_Display(char* pstrText)
    158{
    159    unsigned char i = 0;
    160
    161    LCD_Write_Cmd(0x80 | 0x00);        // 1 Line Position
    162    while (*pstrText != 0x00)
    163    {
    164        if (i == 8)
    165        {
    166            LCD_Write_Cmd(0x80 | 0x40);    // 2 Line Position
    167        }
            
    168
    169        LCD_Write_Data(*(pstrText++));
    170        i++;
    171    }

    172
    173    return;
    174}

    175
    176

    client端调用如下:

     1//ICC-AVR application builder : 2008-6-4 8:41:19
     2// Target : M16
     3// Crystal: 4.0000Mhz
     4#include <iom16v.h>
     5#include <macros.h>
     6#include "LCD.h" 
     7
     8void main(void)
     9{
    10    LCD_Init();    
    11    LCD_Display("RT1601Demo by WF");
    12
    13    while (1)
    14    {
    15        ;
    16    }

    17
    18    return;
    19}

     好了,就这些,有关该芯片的详细资料,请查看 S6A0069资料。
    好运!

  • 相关阅读:
    noip模拟赛 花
    noip模拟赛 柜(暴力)
    noip模拟赛 读
    Java基础知识强化47:StringBuffer类之StringBuffer的三个面试题
    Java基础知识强化46:StringBuffer类之判断一个字符串是否对称案例
    Java基础知识强化45:StringBuffer类之字符串反转的案例
    Java基础知识强化44:StringBuffer类之把数组拼接成指定格式的字符串的案例
    Java基础知识强化43:StringBuffer类之StringBuffer和String的相互转化
    Java基础知识强化42:StringBuffer类之StringBuffer的截取功能
    Java基础知识强化41:StringBuffer类之StringBuffer的反转功能
  • 原文地址:https://www.cnblogs.com/vsignsoft/p/1214361.html
Copyright © 2011-2022 走看看