搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

发表于 2009-8-7 17:02:23 | 显示全部楼层 |阅读模式
本程序是又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 char  systemset_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[6])//一行所占显示存储单元的字节数


/*--------------------------------------------------------------*/
//函数声明
//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 int  addr;
        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?");
       
        }       
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-8-7 17:04:12 | 显示全部楼层
刚学的avr 发现这是个好论坛 以后会在这跟大家好好交流

出0入0汤圆

发表于 2009-8-7 20:03:38 | 显示全部楼层
为何不顶一顶呢?






最好弄张电路图.

出0入0汤圆

发表于 2009-8-7 22:27:19 | 显示全部楼层
讨论 BASCOM 的阵地 欢迎来玩
  http://www.diyzone.cn/forum/list_65.html
  http://www.diyzone.cn/forum/list_65.html

出0入0汤圆

发表于 2010-6-12 14:55:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-1 22:09:37 | 显示全部楼层
这个程序不全吧, cd 是哪个接口 ??

A0和 CS怎么没有定义??

出0入0汤圆

发表于 2011-3-14 14:33:14 | 显示全部楼层
cd就是AO

出0入0汤圆

发表于 2011-9-24 07:00:00 | 显示全部楼层
谢谢哪位好心的师傅帮忙解释一下 取指针地址的函数: addr =(unsigned int)(y) * AP + x; 这个公式是怎么得到的?  tgp6188@hotmail.com

出0入0汤圆

发表于 2011-9-24 10:36:15 | 显示全部楼层
不错,收藏了

出0入0汤圆

发表于 2012-11-5 16:30:09 | 显示全部楼层
楼主你好,不知道您还看这个贴子不, 我把这段程序写入M16后,PD0,PD1全为高电平,PD2为低电平。  就是读与写都有效了。 这个是怎么回事,我正要看程序中。。。。。

出0入0汤圆

发表于 2013-5-25 03:26:50 | 显示全部楼层
程序能运行,有点小错误:write_dat(systemset_P8); write_dat(scroll_P10); 应写成:write_dat(systemset_P8[i]);write_dat(scroll_P10[i]); 谢谢分享!



回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表