您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机KS0108 128X64 LCD C语言AVR程序 正文
KS0108 128X64 LCD C语言AVR程序

KS0108 128X64 LCD C语言AVR程序

点击数:7191 次   录入时间:03-04 12:03:00   整理:http://www.55dianzi.com   AVR单片机

KS0108 128X64 LCD C语言AVR程序

/*
LCD引脚定义
1---GND 
2---VCC
3---VLCD
4---D/I
5---R/W
6---E
7到14 D0-D7
15--CS1
16--CS2
17--RESET
18--VEE
19--SW
20--NC 
*/
#include <iom16v.h>
#include <macros.h>

unsigned char CurOffset,CurRow,CurPage,CurCol;    

/*  常量定义  */
#define LCD_STATUS_BUSY 0x80
#define  START_LINE0   0xc0
#define  DISPLAY_ON    0x3f
#define  DISPLAY_OFF   0x3e
#define  PARA1         0x40
//PORTA---数据口  PORTB----控制口
volatile unsigned char *LCD_DIR_PORT = &DDRA;
volatile unsigned char *LCD_IP_PORT  = &PINA;
volatile unsigned char *LCD_OP_PORT  = &PORTA;

volatile unsigned char *LCD_EN_PORT  = &PORTB;
volatile unsigned char *LCD_CS2_PORT = &PORTB;
volatile unsigned char *LCD_CS1_PORT = &PORTB;
volatile unsigned char *LCD_RW_PORT  = &PORTB;
volatile unsigned char *LCD_DI_PORT  = &PORTB;

char LCD_EN_BIT  = BIT(4);
char LCD_CS2_BIT = BIT(3);
char LCD_CS1_BIT = BIT(2);
char LCD_RW_BIT  = BIT(1);
char LCD_DI_BIT  = BIT(0);

#define SET_LCD_E                  *LCD_EN_PORT |= LCD_EN_BIT    //LCD使能
#define CLEAR_LCD_E               *LCD_EN_PORT &= ~LCD_EN_BIT   //LCD禁止

#define SET_LCD_DATA              *LCD_DI_PORT |= LCD_DI_BIT    //选择指令端口
#define SET_LCD_CMD               *LCD_DI_PORT &= ~LCD_DI_BIT   //选择数据端口

#define SET_LCD_READ              *LCD_RW_PORT |= LCD_RW_BIT    //读模式
#define SET_LCD_WRITE              *LCD_RW_PORT &= ~LCD_RW_BIT   //写模式

#define SET_LCD_CS2              *LCD_CS2_PORT |= LCD_CS2_BIT  //左屏选择禁止
#define CLEAR_LCD_CS2              *LCD_CS2_PORT &= ~LCD_CS2_BIT //左屏选择使能

#define SET_LCD_CS1              *LCD_CS1_PORT |= LCD_CS1_BIT  //左屏选择禁止
#define CLEAR_LCD_CS1              *LCD_CS1_PORT &= ~LCD_CS1_BIT //左屏选择使能

#define LEFT 0
#define RIGHT 1
#define CMD 0
#define DATA 1

void LCD_BUSY(unsigned char lr) //判断忙标志
{
    unsigned char status;
    CLI();
    if(lr==LEFT)
    {
        CLEAR_LCD_CS2; //cs2=0
        SET_LCD_CS1;   //cs1=1
    }
    else
    {
        SET_LCD_CS2;   //cs2=1
        CLEAR_LCD_CS1; //cs1=0
    }    
    SET_LCD_CMD;
    *LCD_DIR_PORT = 0x00;
    *LCD_OP_PORT = 0xff;        
    SET_LCD_READ;
    SET_LCD_E;                    
    asm("nop");    asm("nop");
    asm("nop");    asm("nop");
    while((*LCD_IP_PORT) & LCD_STATUS_BUSY)
    {
        CLEAR_LCD_E;               
        asm("nop");    asm("nop");
        asm("nop");    asm("nop");
        SET_LCD_E;
        asm("nop");    asm("nop");
        asm("nop");    asm("nop");
    }
    CLEAR_LCD_E;
    SET_LCD_WRITE;
    *LCD_OP_PORT = 0xff;
    SEI();
}

void write_LCD(unsigned char lr,unsigned char cd,unsigned char data) /*写入指令或数据*/
{    
    CLI();
    LCD_BUSY(lr);
    if(cd==CMD)    SET_LCD_CMD;
    else SET_LCD_DATA;
    SET_LCD_WRITE; 
    SET_LCD_E;
    *LCD_DIR_PORT = 0xff;
    *LCD_OP_PORT = data;
    asm("nop");    asm("nop");
    asm("nop");    asm("nop");
    CLEAR_LCD_E;
    *LCD_OP_PORT = 0xff;
    SEI();
}
unsigned char read_LCD(unsigned char lr)      /*  读显示数据 */
{
    unsigned char data;

    CLI();
    LCD_BUSY(lr);
    SET_LCD_DATA;
    *LCD_DIR_PORT = 0x00;
    *LCD_OP_PORT = 0xff;
    SET_LCD_READ;
    SET_LCD_E;
    asm("nop");    asm("nop");
    asm("nop");    asm("nop");
    data=*LCD_IP_PORT;
    CLEAR_LCD_E;
    SET_LCD_WRITE;

    LCD_BUSY(lr);
    SET_LCD_DATA; 
    *LCD_DIR_PORT = 0x00;
    *LCD_OP_PORT = 0xff;
    SET_LCD_READ; 

[1] [2] [3] [4] [5]  下一页


本文关键字:程序  C语言  AVR单片机单片机-工控设备 - AVR单片机