zchenj 发表于 2009-8-7 17:02:23

提供一个m16+RA8835 320X240的显示程序

本程序是又51改写过来的,要注意的写数据和写指令处加延时。本人初学写的不好不要介意哦~
用的m16的片子用的内部8M (开始死活没有数据就是用了8M 改1M 就好 最后发现要加点延时用8M没有问题 用的16最大就8M更大测试不了)
PA口接DO-D7;
PD0 接rd
PD1 接wr
PD2 接cd
RA8835 用的是8080 信号模式 驱动320X240
用的是ICC编译

程序:
/*--------------------------------------------------------------*/
#include <iom16v.H>


/*--------------------------------------------------------------*/

//端口定义
#define        LCD320_BUS        PORTA       
#define        LCD320_RD0        PORTD&=0B11111110               
#define    LCD320_WR0        PORTD&=0B11111101                       
#define        LCD320_CD0        PORTD&=0B11111011       
       
#define        LCD320_RD1        PORTD|=0B00000001       
#define LCD320_WR1        PORTD|=0B00000010                       
#define        LCD320_CD1        PORTD|=0B00000100               


/*8080接口信号的组合功能
CD                /RD                /WR
0                0                1                读状态标志位               
0                1                0                写指令参数和显示数据
1                0                1                读显示数据和光标指针
1                1                0                写指令代码


/*--------------------------------------------------------------*/
//定义指令代码、指令参数
#define systemset                0x40                //初始化设置,后续8字节参数串systemset_P8[]
const unsigned charsystemset_P8[] = {0x30, 0x85, 0x07, 0x34, 0x4f, 0xef, 0x35, 0x00};
                                                                        //P1        P2          P3        P4          P5        P6          P7        P8

#define scroll                        0x44                //设定显示起始地址和显示范围,后续10字节参数串scroll_P10[]
#define basepart1                0x00
#define basepart2                0x28
#define basepart3                0x28*2
#define basepart4                0x00
const unsigned char scroll_P10[]   = {0x00, basepart1, 0xf0,                //第一显示区RAM,10KB,240行
                                                                       0x00, basepart2, 0xf0,                //第二显示区RAM,10KB,240行
                                                                     0x00, basepart3,                        //第三显示区RAM,10KB
                                                                       0x00, basepart4};                        //第四显示区RAM,32KB

#define sleepin                          0x53                //休闲模式设置                后续参数:无

#define dispoff                   0x58                //显示关闭                         后续参数1字节
#define dispon                    0x59                //显示状态打开                后续参数1字节

#define hdotscr                   0x5a                //点位移量设置                后续参数1字节
#define ovlay                   0x5b                //显示合成设置                后续参数1字节
#define cgramadr                0x5c                //CGRAM首地址设置        后续参数2字节
#define csrform                   0x5d                //光标形状设置                后续参数2字节

#define csrdirr                   0x4c                //光标向右方向移动        后续参数:无
#define csrdirl                   0x4d                //光标向左方向移动        后续参数:无
#define csrdiru                   0x4e                //光标向上方向移动        后续参数:无
#define csrdird                   0x4f                //光标向下方向移动        后续参数:无

#define csrw                      0x46                //设置光标地址                后续参数2字节
#define csrr                      0x47                //读出光标地址                后续参数2字节

#define mwrite                    0x42                //显示数据写入                后续参数N字节
#define mread                   0x43                //显示数据读取                后续参数N字节



/*--------------------------------------------------------------*/
#define busy                      0x40                //忙信号D6                        0100 0000
#define AP                                (systemset_P8)//一行所占显示存储单元的字节数


/*--------------------------------------------------------------*/
//函数声明
//void check_busy(void);                        //忙状态检测
void write_cmd(unsigned char cmd);        //写指令代码
void write_dat(unsigned char dat);        //写指令参数、显示数据
//unsigned char read_dat(void);                //读出数据

void lcd_init(void);                                //液晶初始化
void lcd_cls(void);                                        //液晶清屏,32KB RAM 清零
void show_on(void);                                        //开启显示
void show_off(void);                                //关闭显示
//void sleep_in(void);                                //进入省电模式
//void sleep_out(void);                                //退出省电模式
void delay200ms(void);                                //延时500ms
void locate_xy(unsigned char x, unsigned char y);                                                //光标定位
void show_char(unsigned char x, unsigned char y, unsigned char *string);//显示字符串


/*--------------------------------------------------------------*/
//延时200000+0us 函数定义
void delay200ms(void)
{
    unsigned char i, j, k;
    for(i = 201; i > 0; i--)
    for(j = 32; j > 0; j--)
    for(k = 14; k > 0; k--);
}
void delay()
{
unsigned int i;
i=1;
while(i--);
}



//写指令代码
void write_cmd(unsigned char cmd)
{
        LCD320_RD1;               
        LCD320_BUS = cmd;
        LCD320_CD1;                //指令
        LCD320_WR0;                //上升沿写入
        delay();
        LCD320_WR1;
}


/*--------------------------------------------------------------*/
//写指令参数、显示数据
void write_dat(unsigned char dat)
{
        LCD320_RD1;
        LCD320_BUS = dat;
        LCD320_CD0;                //数据
        LCD320_WR0;                //上升沿写入
        delay();
        LCD320_WR1;
}



//液晶初始化
void lcd_init(void)
{
        unsigned char i;

        write_cmd(systemset);                        //初始化设置
        for(i = 0; i < 8; i++)        write_dat(systemset_P8);

        write_cmd(scroll);                                //设定显示起始地址和显示范围
        for(i = 0; i < 10; i++)        write_dat(scroll_P10);

        write_cmd(hdotscr);                                //点位移量设置
        write_dat(0x00);                                //不移动       
        write_cmd(ovlay);                                //显示合成设置                       
        write_dat(0x00);                                //二重合成,文本显示,逻辑或
        show_off();                                                //关闭显示
        lcd_cls();                                                //液晶清屏,64KB RAM 清零       
        show_on();                                                //开启显示
}


/*--------------------------------------------------------------*/
//液晶清屏,32KB RAM 清零
void lcd_cls(void)
{
        unsigned int i = 32768;        //32KB RAM
        write_cmd(csrw);                //写入光标地址
        write_dat(0x00);                //先写低八位
        write_dat(0x00);                //后写高八位
        write_cmd(csrdirr);                //光标向右方向移动
        write_cmd(mwrite);                //显示数据写入
        while(i--)        write_dat(0x00);
}



/*--------------------------------------------------------------*/
//开启显示
void show_on(void)
{
        write_cmd(dispon);                //显示状态开启
        write_dat(0x57);                //显示图像,光标1Hz闪烁
}


/*--------------------------------------------------------------*/
//关闭显示
void show_off(void)
{
        write_cmd(dispoff);                //显示状态关闭
        write_dat(0x57);                //显示图像,光标1Hz闪烁
}


//光标定位
//x横坐标:        0~53        320/6=53余2
//y纵坐标:        0~29        240/8=30
void locate_xy(unsigned char x, unsigned char y)
{
        unsigned intaddr;
        addr=(unsigned int)(y) * AP + x;
        write_cmd(csrw);                                                        //写入光标地址
        write_dat((unsigned char)(addr & 0xff));         //先写低八位
        write_dat((unsigned char)(addr >> 8));                //后写高八位
}


/*--------------------------------------------------------------*/
//显示字符串
//x横坐标:        0~52        320/6=53余2
//y纵坐标:        0~29        240/8=30
void show_char(unsigned char x, unsigned char y, unsigned char *string)
{
        locate_xy(x, y);                                //光标定位
        write_cmd(csrform);                                //光标形状设置
        write_dat(0x05);                                //水平显示宽度6
        write_dat(0x07);                                //线状光标显示,高度8

        write_cmd(csrdirr);                                //光标向右方向移动
       
        write_cmd(dispon);                                //显示状态开启
        write_dat(0x57);                                //显示图像,光标1Hz闪烁

        write_cmd(mwrite);                                //显示数据写入
        while(*string)
        {
                write_dat(*string);
                string++;
                delay200ms();
        }
}


/*--------------------------------------------------------------*/
//主函数
void main(void)
{
       DDRA = 0xFF;
       PORTA = 0xFF;   
       DDRD = 0xFF;
       PORTD = 0xFF;
        lcd_init();


        while(1)
        {
       show_char(0, 0, "Isdfasefergaergin ");
        show_char(0, 2, "   abdhfiudhsfouaoreijoiajwefe?");
       
        }       
}

zchenj 发表于 2009-8-7 17:04:12

刚学的avr 发现这是个好论坛 以后会在这跟大家好好交流

czhaii 发表于 2009-8-7 20:03:38

为何不顶一顶呢?






最好弄张电路图.

wang_xm 发表于 2009-8-7 22:27:19

讨论 BASCOM 的阵地 欢迎来玩
http://www.diyzone.cn/forum/list_65.html
http://www.diyzone.cn/forum/list_65.html

gxy508 发表于 2010-6-12 14:55:01

mark

steven_wangsr 发表于 2010-9-1 22:09:37

这个程序不全吧, cd 是哪个接口 ??

A0和 CS怎么没有定义??

buduo1216 发表于 2011-3-14 14:33:14

cd就是AO

tgp6188 发表于 2011-9-24 07:00:00

谢谢哪位好心的师傅帮忙解释一下 取指针地址的函数: addr =(unsigned int)(y) * AP + x; 这个公式是怎么得到的?tgp6188@hotmail.com

lzkaka 发表于 2011-9-24 10:36:15

不错,收藏了

wangfriend 发表于 2012-11-5 16:30:09

楼主你好,不知道您还看这个贴子不, 我把这段程序写入M16后,PD0,PD1全为高电平,PD2为低电平。就是读与写都有效了。 这个是怎么回事,我正要看程序中。。。。。

ping666999 发表于 2013-5-25 03:26:50

程序能运行,有点小错误:write_dat(systemset_P8); write_dat(scroll_P10); 应写成:write_dat(systemset_P8);write_dat(scroll_P10); 谢谢分享!



页: [1]
查看完整版本: 提供一个m16+RA8835 320X240的显示程序