RA8822液晶模块的AVR程序

来源:互联网 发布:老版的龙霸网络电视 编辑:程序博客网 时间:2024/05/17 00:52

该液晶 模块为240*128,RA8822芯片,CM240128-7型号,使用AVR ATMega32单片机驱动,以下为源程序。子程序CM240128.h同样适用于80C51,只需要去掉主程序中的预定义_CM240128_AVR,并且稍微修改主程序即可。

 

#include <mega32.h>
#include 
<delay.h>

#define _CM240128_AVR    // for AVR ATMega32
#include 
"CM240128.h"

uchar ss[] 
= "液晶显示屏CM240128-7";
void main()
{
    
// 等待几秒钟
    uchar i;   
#ifdef _CM240128_AVR    
    DDRA 
= 0xFF;    /* output */
    PORTA 
= 0xFF;    /* all off */
    DDRB 
= 0xFF;
    PORTB 
= 0xFF;
    DDRD 
= 0xFF;    /* output */
    PORTD 
= 0xFF;    /* all off */
#endif    
    
for(i=0; i<20; i++)
        delay_ms(
200);
    
    LCD_Reset();
    LCD_Initial();
    LCD_Clear();
    GotoXY(
6,0); // 设定光标位置
    PrintStr(ss, 1);
}

 

以下为功能子程序:

 

/* 
        CM240128.h 
        液晶模块控制芯片为RA8822,型号为CM240128-7
        使用RA8822英文版文档中的源代码修改而得。原来的源代码为320*240屏的,初始化设置
        时候需要重新设置以符合240*128的屏。此代码用于80C51和AVR单片机,主要是管脚定义
        的差别,请看以下预定义。
        
        by Gorden. 2007-04-09
*/

#ifndef __CM240128_h
#define __CM240128_h    

#define uchar    unsigned char    // 0~255
#define uint    unsigned int     // 0~65535    
#include 
<stdio.h>

#ifdef _CM240128_AVR        
// for AVR ATMega32
    
    
#define LCD_RS        PORTB.0
    
#define LCD_WR        PORTB.4
    
#define LCD_RD        PORTB.1
    
#define LCD_CS1        PORTB.2
    
#define LCD_RST        PORTB.3
    
    
#define LCD_cmdReg    PORTA
    
#define LCD_cmdData PORTA
    
#define LCD_DATA    PORTA
    
    
// #define LCD_READY    P2
    #define LCD_CS2        PORTB.5
    
#define LCD_BUSY    PORTB.6
    
#define LCD_INT        PORTB.7
    
#else                       // for 80C51    

    
#define LCD_RS        P0_5
    
#define LCD_WR        P0_3
    
#define LCD_RD        P0_6
    
#define LCD_CS1        P0_4
    
#define LCD_RST        P0_2
    
    
#define LCD_cmdReg    P2
    
#define LCD_cmdData P2
    
#define LCD_DATA    P2
    
    
// #define LCD_READY    P2
    #define LCD_CS2        P3_4
    
#define LCD_BUSY    P3_5
    
#define LCD_INT        P3_6
    
    
void delay_ms(unsigned int m)        // 11.0592MHz晶振,1.0us周期
    {
        unsigned 
int j;
        unsigned 
int i;
    
        
for(i=0; i<m; i++)
            
for(j=0; j<109; j++)
                _nop_();
    }

        
#endif
//=============================================
extern void delay (int i);
extern void LCD_CmdWrite(unsigned char, unsigned char);
extern unsigned char LCD_CmdRead(unsigned char);
extern void LCD_DataWrite(unsigned char);
extern void LCD_ChkBusy(void);
extern void LCD_Reset(void);
extern void LCD_Initial(void);
extern void LCD_Clear(void);
extern void LCD_Fill(void);
extern void PrintStr(char *ptr,int delay_time);
extern void putHEX(unsigned int var);
extern void putHEX2(unsigned char var);
extern void GotoXY(unsigned char x1,unsigned char y1);
static const char ASCIITable[] = "0123456789ABCD";

//===================================================================//
// LCD Command Write Subroutine //
//===================================================================//
void LCD_CmdWrite(unsigned char cmdReg,unsigned char cmdData)
{
    
//LCD_ChkBusy();
    LCD_cmdReg = cmdReg; // 写入缓存器的地址
    LCD_CS1 =0// 致能 RA8803 读写动作
    LCD_RD = 1// 禁能读取动作
    LCD_RS = 0// 设定为写入资至缓存器模式
    LCD_WR = 0// 开始写入缓存器的地址
    
//delay(10);
    LCD_WR = 1;
    LCD_RS 
= 1;
    LCD_CS1 
=1// 致能 RA8803 读写动作
    
//…………………………………………………………….
    
//LCD_ChkBusy();
    delay(1);
    LCD_cmdReg 
= cmdData; // 写入缓存器的数据
    LCD_CS1 =0// 致能 RA8803 读写动作
    LCD_RD = 1// 禁能读取动作
    LCD_RS = 0// 设定为写入数据至缓存器模式
    LCD_WR = 0// 开始写入缓存器的数据
    
//delay(10);
    LCD_WR = 1;
    LCD_RS 
= 1;
    LCD_CS1 
=1// 致能 RA8803 读写动作
    
//delay(1);
}


void delay(int i)
{
    
int k ;
    
for ( k=0 ; k < i ; k++ );
}


//*******************************************************************************//
// *** 定义 所有 缓存器的 初始值 **************************************************//
//*******************************************************************************//
void LCD_Initial(void)
{
    LCD_CmdWrite(
0x00,0xCD); // LCD 基本显示功能设定-1        C9
    LCD_CmdWrite(0x01,0xF1); // 系统工作频率与中断准位设定    F1
    LCD_CmdWrite(0x02,0x10); // LCD 内存读写速度与功能设定
    LCD_CmdWrite(0x03,0x80); // LCD 特殊显示功能
    LCD_CmdWrite(0x10,0x6B); // LCD 基本显示功能设定-2
    LCD_CmdWrite(0x11,0x20); // 设定光标高度与行距
    LCD_CmdWrite(0x12,0x91); // LCD 显示图层设定
    LCD_CmdWrite(0x20,0x1D); // 设定实际显示窗口垂直起始地址(X1)    320*160 = 0x27
    LCD_CmdWrite(0x30,0x9F); // 设定实际显示窗口水平起始地址(Y1)    320*160 = 0xEF
    LCD_CmdWrite(0x40,0x00); // 设定实际显示窗口垂直结束地址(X2)
    LCD_CmdWrite(0x50,0x00); // 设定实际显示窗口水平结束地址(Y2)
    LCD_CmdWrite(0x21,0x1D); // 设定LCD 模块垂直起始地址(X1)        320*160 = 0x27
    LCD_CmdWrite(0x31,0x9F); // 设定LCD 模块水平起始地址(Y1)        320*160 = 0xEF
    LCD_CmdWrite(0x41,0x00); // 设定LCD 模块垂直结束地址(X2)
    LCD_CmdWrite(0x51,0x00); // 设定LCD 模块水平结束地址(Y2)
    LCD_CmdWrite(0x60,0x00); // 设定光标水平地址(Common)
    LCD_CmdWrite(0x61,0x00); // 设定垂直开始显示地址(Segment)
    LCD_CmdWrite(0x70,0x00); // 设定光标垂直地址(Segment)
    LCD_CmdWrite(0x71,0x00); // 设定于水平区块移动模式下,起始地址
    LCD_CmdWrite(0x72,0xEF); // 设定于水平区块移动模式下,结束地址
    LCD_CmdWrite(0x80,0x33); // 光标闪烁时间设定
    LCD_CmdWrite(0x81,0x00); // 变换FRM 极性的起始地址(Common)
    LCD_CmdWrite(0x91,0x00); // 变换FRM 极性的结束地址(Common)
    LCD_CmdWrite(0x90,0x04);
    LCD_CmdWrite(
0xA0,0x11); // 中断功能设定
    LCD_CmdWrite(0xA1,0x00); // 键盘扫描控制缓存器
    LCD_CmdWrite(0xA2,0x00); // 键盘扫描控制输出数据
    LCD_CmdWrite(0xA3,0x00); // 键盘扫描控制输入数据
    LCD_CmdWrite(0xB0,0x27); // 设定水平方向断点的地址
    LCD_CmdWrite(0xB1,0xEF); // 设定垂直方向断点的地址
    LCD_CmdWrite(0xC0,0xD0); // 触控屏幕功能设定
    LCD_CmdWrite(0xC1,0x0A); // 读写并可侦测触控屏幕的状态
    LCD_CmdWrite(0xC8,0x80); // 读取触控屏幕水平轴的数据(高字节)
    LCD_CmdWrite(0xC9,0x80); // 读取触控屏幕水平轴的数据(高字节)
    LCD_CmdWrite(0xCA,0x00); // 读取触控屏幕水平轴与垂直轴的数据(低字节)
    LCD_CmdWrite(0xD0,0x0C); // 设定DAC 电流输出,可调整LCD 亮度
    LCD_CmdWrite(0xE0,0x00); // 设定写入显示内存的数据(需搭配缓存器[F0]使用
    LCD_CmdWrite(0xF0,0xA0); // 设定中文字型为”BIG5”    // A0-GB 90-BIG5 80-ENG
    LCD_CmdWrite(0xF1,0x0F); // 改变字型垂直与水平显示大小
}


//*******************************************************************************//
// *** 清除显示内存 子程序 ******************************************************//
//*******************************************************************************//
void LCD_Clear(void)
{
    unsigned 
char READ_REG;
#if 0
    
// 此处清屏命令无效,不知为何
    LCD_CmdWrite(0xE0,0x40); // 设定将显示内存的数据全部写入”0x00”
    READ_REG = LCD_CmdRead(0xF0);
    READ_REG 
&= 0xF7;
    READ_REG 
|= 0x08;
    LCD_CmdWrite(
0xF0,READ_REG); // 当缓存器[0xF0]之位3 设定为”1”时,
#else
    
// 使用填充空格的方式清屏
    GotoXY(00);
    
for(READ_REG=0; READ_REG<240; READ_REG++)
    
{
        LCD_DataWrite(
' ');
    }

#endif    
    delay(
1000); // 硬件自动将显示内存全部写入缓存器[E0]的资料
}


void LCD_Fill(void)
{
    unsigned 
char READ_REG;
    LCD_CmdWrite(
0xE0,0xff);
    READ_REG 
= LCD_CmdRead(0xF0);
    READ_REG 
&= 0xF7;
    READ_REG 
|= 0x08;
    LCD_CmdWrite(
0xF0,READ_REG);
    delay(
1000);
}


void LCD_DataWrite(unsigned char WrData)
{
    LCD_ChkBusy(); 
// 判断 RA8803 是否忙碌中
    LCD_DATA = WrData; // 准备预写入显示内存的数据
    LCD_CS1 =0// 致能 RA8803 读写动作
    LCD_RD = 1// 禁能读取动作
    LCD_RS = 1// 设定为写入数据至显示内存模式
    LCD_WR = 0// 开始写数据至显示内存
    LCD_WR = 0// WR = 0;
    LCD_WR = 0// WR = 0;     
    
//delay(1);
    LCD_WR = 1;
    LCD_RS 
= 1;
    LCD_CS1 
=1// 禁能 RA8803 读写动作
}


void PrintStr(char *ptr,int delay_time)
{
    
while(*ptr != '
原创粉丝点击