HBZHPLJ 发表于 2010-8-27 12:36:23

得到块5.7寸液晶屏,是RA8835AP控制芯片,内带32KRAM,用汇编写了个测试程序,可怎么也不行

我不懂C,玩过51,还有PIC,一直都是用汇编,当然程序都不是很大。近来玩AVR的128,得到块5.7寸液晶屏,是RA8835AP控制芯片,内带32KRAM,用汇编写了个测试程序,可怎么也行,请高手指点!程序如下:
      *******
;AVR汇编程序实例
;sed1335 320*240 Atmega128 显示‘液’字!
;********************************************************
.include "m128def.inc" ;引用器件I/O配置文件

;定义程序中使用的变量名(在寄存器空间)

.def temp = r23 ;临时变量
.def temp1 = r24 ;临时变量


;中断向量区定义,flash空间$0000-$0045
.org $0000
jmp reset ;复位处理

;程序开始
.org $0046
reset:
ldi r16,high(RAMEND) ;设置堆栈指针高位
out sph,r16
ldi r16,low(RAMEND) ;设置堆栈指针低位
out spl,r16

ser temp
out ddra,temp ;设置PORTA为输出,段码输出
out ddrc,temp ;设置PORTC为输出,位码控制

sbi $02,2 ; 设E口第二位为输出
ldi temp,0x80
out mcucr,temp

MAIN:
rcall begin
rcall display
rjmp main

begin:
cbi$15,7;LED-CS
cbi$03,2;开灯
lditemp,0x40 ;初始化设置
sts0x1101,temp
rcall delay
clrtemp1
begin1:
clrr0
ldizl,low(tab1*2)
ldizh,high(tab1*2)
addzl,temp1
adczh,r0
lpm
sts0x1100,r0
rcall delay
inctemp1
cpitemp1,0x09
brnebegin1
clr   temp1
ldi   temp,0x44;显示域设置
sts   0x1101,temp
rcall delay
begin2:
clr   r0
ldi   zl,low(tab2*2)
ldizh,high(tab2*2)
addzl,temp1
adczh,r0
lpm
sts0x1100,r0
rcall delay
inctemp1
cpitemp1,0x0b
brnebegin2
begin3:
lditemp,0x5a;点位移动设置
sts0x1101,temp
rcall delay
lditemp,0x00
sts0x1100,temp
rcall delay
lditemp,0x5b   ;显示合成设置
sts0x1101,temp
rcall delay
lditemp,0x00
sts0x1100,temp
rcall delay
lditemp,0x59    ;显示状态设置
sts0x1101,temp
rcall delay
lditemp,0x04
sts0x1100,temp
rcall delay
lditemp,0x46   ;设置光标地址
sts0x1101,temp
rcall delay
lditemp,0x00
sts0x1100,temp
rcall delay
lditemp,0x4c;光标移动方向设置
sts0x1101,temp
rcall delay
ret
display:
clr r16
clr r17
lditemp,0x47    ;读出光标地址
sts0x1101,temp
rcall delay
ldsr16,0x1101
rcall delay
ldsr17,0x1101
rcall delay
lditemp,0x4f   ;光标移动方向设置
sts0x1101,temp
rcall delay
lditemp,0x42   ;显示数据写入
sts0x1100,temp
rcall delay
play1:
clr   r0
ldi   zl,low(hanzi*2)
ldizh,high(hanzi*2)
addzl,temp1
adczh,r0
lpm
sts0x1100,r0
rcall delay
inctemp1
inctemp1
cpitemp1,0x20
brneplay1
lditemp,0x46   ;光标移动方向设置
sts0x1101,temp
rcall delay
lditemp,0x08
addtemp,r17
sts0x1101,temp
rcall delay
ldi temp,0x42;显示数据写入
sts 0x1101,temp
rcall delay
lditemp1,0x01
play2:
clr   r0
ldi   zl,low(hanzi*2)
ldizh,high(hanzi*2)
addzl,temp1
adczh,r0
lpm
sts0x1100,r0
rcall delay
inctemp1
inctemp1
cpitemp1,0x21
brneplay2
ret


delay:
ldi temp,$ff
dela:
   nop
   nop
   nop
   nop
   nop
   dec temp
   brne dela
   ret


.CSEG
tab1:
.db 0x30,0x87,0x07,0x27,0x32,0xef,0x28,0x00
.CSEG
tab2:
.db 0x00,0x00,0xf0,0xb0,0x04,0xf0,0x30,0x2a,0xe0,0x2e
.CSEG
hanzi:
.db 0x00,0x80,0x40,0x44,0x37,0xfe,0x10,0x20,0x81,0x20,0x61,0x3c,0x22,0x44,0x0a,0x64
.db 0x16,0x98,0x2b,0x48,0xe2,0x50,0x22,0x20,0x22,0x50,0x22,0x8e,0x23,0x04,0x22,0x00;液

以下蓝色文字由站长:armok 于:2010-08-27,20:51:29 加入。你的原标题:“<font color=black>近来很痛苦!” 不合符规定。请更改成能说明帖子大意的标题
试想一下,如果本论坛的帖子标题清一色的‘帮助!’,‘ADC求救!’等笼统的标题,你在阅读的过程中会造成许多麻烦。
所以本论坛规定:一定要起一个能说明帖子大意的标题。不允许“关于 AVR 的 ADC 使用!”这种笼统标题。作为标题,必须说明清楚:
 ①你是在请教问题,还是在介绍有关的知识?
 ②ADC的问题有许多,你是想说那方面的内容?
注意以上两点,标题应该改成如:“请教:ADC 可以不使用中断吗?”。
起一个能说明帖子大意的标题,除了减轻我们的帖子分类整理工作,还方便其它人阅读,节省大家的时间。
注:使用合格的标题,对你来说只是举手之劳,但却会为我们的管理工作提供很大的便利。谢谢你的支持。
./bbs_upload/files_6/armok01122228.gif

mkbest 发表于 2010-8-27 13:16:40

lz 很厉害。 可惜我等菜鸟看不懂汇编。自从51汇编做项目后,到了avr基本都是c了

mcu2007 发表于 2010-8-27 13:28:00

这个AVR的汇编我就看不懂了,不过一般都是初始时序不对才点不亮的,LZ可以设置更长的延迟来做初始化试试看。

dengxiaofeng 发表于 2010-8-27 13:38:15

看不懂汇编

billtian 发表于 2010-8-27 14:36:12

可怎么也行,请高手指点什么?

myqiang1990 发表于 2010-8-27 14:39:29

我从51开始就不学汇编。。我也看不懂啊。。哈哈。。./emotion/em003.gif

zck9 发表于 2010-8-27 15:11:22

看来lz未看过8835的数据手册.今发个8835的pdf
你要解决问题先将硬件接线发上来.
从你的汇编来看没有对8835的端口操作,只用一个delay这是延时,这怎么能成功.
点击此处下载 ourdev_578144.pdf(文件大小:404K) (原文件名:RA8835.pdf)

page_zero 发表于 2010-8-27 15:56:38

晕死了,明明是牛人却不变通一下,埋没了自己的才能.
花点点时间学C,然后就发现自己牛得不行了.

HBZHPLJ 发表于 2010-8-27 17:55:15

回复【6楼】zck9
-----------------------------------------------------------------------

谢谢,我看看,争取用一个星期把它弄出来!

HBZHPLJ 发表于 2010-8-27 17:56:14

回复【4楼】billtian mcu杀手
-----------------------------------------------------------------------

真的不行呀!

HBZHPLJ 发表于 2010-8-27 17:56:53

回复【7楼】page_zero
-----------------------------------------------------------------------

是真的吗?

user1st 发表于 2010-8-27 18:04:56

没有用过128.装做很认真的看了下.
好像都没有往端口写数
只看到
cbi$15,7;LED-CS
cbi$03,2;开灯
还有
ser temp
out ddra,temp ;设置PORTA为输出,段码输出
out ddrc,temp ;设置PORTC为输出,位码控制

sbi $02,2 ; 设E口第二位为输出
除此之外再也没看到有端口操作,可能没看到
顺便问一下有个神奇的SRAM地址,0X1100,X1101
你怎么那么喜欢用??

gmolzc 发表于 2010-8-27 18:11:31

看不懂!

不過有一點要說明那個62256的顯存是給8835用的,寫顯示數據是要通過8835才能寫進去的!不是寫個地址然後寫數據進去變會顯示的!

plc_avr 发表于 2010-8-27 18:44:10

都用M128了,还是慢慢学会用C吧,我从学了C过后,很少用汇编了.这个看的脑袋都大了.

youthvision 发表于 2010-8-27 19:37:56

以前用C写单片机软件,最近用汇编,汇编很带劲噢。。

HBZHPLJ 发表于 2010-8-27 19:50:45

回复【14楼】youthvision 重楼
-----------------------------------------------------------------------

回复【14楼】youthvision 重楼
以前用c写单片机软件,最近用汇编,汇编很带劲噢。。
-----------------------------------------------------------------------

终于找到知音了!

HBZHPLJ 发表于 2010-8-27 20:02:35

回复【11楼】user1st
没有用过128.装做很认真的看了下.
好像都没有往端口写数
只看到
cbi$15,7;led-cs
cbi$03,2;开灯
还有
ser temp   
out ddra,temp ;设置porta为输出,段码输出
out ddrc,temp ;设置portc为输出,位码控制
sbi $02,2 ; 设e口第二位为输出   
除此之外再也没看到有操作,可能没看到
顺便问一下有个神奇的sram地址,0x1100,x1101
你怎么那么喜欢用??

-----------------------------------------------------------------------

我认为不用再端口操作了吧,我是把液晶屏当着128外部的一个存储空间来对待的,0x1100写数据,0x1101为写指令,其中最低位为A0,经过74H557锁存。ldi temp,0x80 out mcucr,temp 这两条指令已经告诉128了我要对外部0x1100和0x1101进行读写操作!

HBZHPLJ 发表于 2010-8-27 20:03:57

回复【12楼】gmolzc
看不懂!
不過有一點要說明那個62256的顯存是給8835用的,寫顯示數據是要通過8835才能寫進去的!不是寫個地址然後寫數據進去變會顯示的!

-----------------------------------------------------------------------

是的!

Cybers 发表于 2010-8-28 10:22:33

RA8835的使用要注意3个问题:

1、要加一个硬件的复位电路


2、把刷新频率控制在64


3、RA8835有两个板本,RA8835P3N和RA8835AP3N
   


最好是用C语言编程,好处不用我说了,不过汇编也不能丢了(是不是废话?)。

HBZHPLJ 发表于 2010-8-28 10:26:51

回复【18楼】Cybers
ra8835的使用要注意3个问题:
1、要加一个硬件的复位电路
2、把在64
3、ra8835有两个板本,ra8835p3n和ra8835ap3n
   
最好是用c语言编程,好处不用我说了,不过汇编也不能丢了(是不是废话?)。
-----------------------------------------------------------------------

有硬件复位电路,可不知刷新频率怎么控制!

HBZHPLJ 发表于 2010-8-28 10:53:29

http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_578310.jpg
这就是上面程序的显示现象! (原文件名:新图像.jpg)

mcucow 发表于 2010-8-28 11:31:01

差不多成功了, 看看LCD的寄存器还有哪里需要设置

cuikai12345 发表于 2010-8-28 11:32:18

mark

Cybers 发表于 2010-8-28 12:48:13

模块的接口中的REST你是怎么接的?

Cybers 发表于 2010-8-28 12:53:16

REST不可以接+5V,上电了之后最好给一个复位信号

Cybers 发表于 2010-8-28 13:04:34

AVR的没有做过,看来是要学习一下AVR了,这是51下的C语言程序,你参考一下:



#include <REG51.h>
#include <lcd_command.h>

void delay1ms(unsigned int count)
{
    int i,j;
    for(i=0;i<=count;i++)
      for(j=0;j<=583;j++);
}

void lcd_reset(void)
{
   
    lcd_RES = 1;
    delay1ms(2);
    lcd_SEL1 = 0;
    lcd_A0 = 0;
    lcd_WR = 1;
    lcd_RD = 1;
    lcd_CS = 1;
    lcd_RES = 0;
    delay1ms(100);
    lcd_RES = 1;
    delay1ms(500);
   
}   

void lcd_initial(void)
{
   lcd_cmdwrite(0x40);       //SYSTEM SET
   lcd_datawrite(0x30);      //p1
   lcd_datawrite(0x87);      //p2   
   lcd_datawrite(0x07);      //p3   
   lcd_datawrite(0x27);      //p4   
   lcd_datawrite(0x37);      //p5
   lcd_datawrite(0xef);      //p6   
   lcd_datawrite(0x28);      //p7   
   lcd_datawrite(0x00);      //p8   
   

   lcd_cmdwrite(0x44);       //SCROLL
   lcd_datawrite(0x00);      //sa1-L
   lcd_datawrite(0x00);      //sa1-H
   lcd_datawrite(0xf0);      //sL1   
   lcd_datawrite(0x80);      //sa2-L   
   lcd_datawrite(0x25);      //sa2-H
   lcd_datawrite(0xf0);      //sL2
   lcd_datawrite(0x00);      //sa3-L
   lcd_datawrite(0x3a);      //sa3-H   
   lcd_datawrite(0x00);      //sa4-L
   lcd_datawrite(0x3a);      //sa4-H
      
   lcd_cmdwrite(0x5a);       //HDOT SCR
   lcd_datawrite(0x00);
      
   lcd_cmdwrite(0x58);       //DISP OFF
   lcd_datawrite(0x54);      
      
   lcd_cmdwrite(0x5d);       //CSR FORM
   lcd_datawrite(0x00);      //CRX
   lcd_datawrite(0x00);      //CRY
   
   lcd_cmdwrite(0x59);       //DISP ON
   lcd_datawrite(0x54);      

   lcd_cmdwrite(0x5b);      
   lcd_datawrite(0x00);      
}

void lcd_cmdwrite(unsigned char cmdx)
{   
    lcd_SEL1 = 0;
    lcd_CMD = cmdx;
    lcd_A0 = 1;
    lcd_CS = 0;
    lcd_WR = 0;
    lcd_WR = 1;
    lcd_CS = 1;
//        lcd_A0 = 0;
}

void lcd_datawrite(unsigned char datax)
{   
   lcd_chkbusy();

    lcd_SEL1 = 0;
    lcd_A0 = 0;
    lcd_DATA = datax;
    lcd_CS = 0;
    lcd_WR = 0;
    lcd_WR = 1;
    lcd_CS = 1;
    lcd_A0 = 1;
}

unsigned char lcd_cmdread(void)
{   
    unsigned char address_cmd;
    lcd_DATA=0xff;
    lcd_SEL1 = 0;
    lcd_A0 = 0;
    lcd_CS = 0;
    lcd_RD = 0;
    address_cmd = lcd_DATA;
    lcd_RD = 1;
    lcd_CS = 1;
    lcd_A0 = 0;
return(address_cmd);
}

unsigned char lcd_dataread(void)
{
    char address_data;

    lcd_DATA=0xff;
    lcd_SEL1 = 0;
    lcd_A0 = 1;
    lcd_CS = 0;
    lcd_RD = 0;

    address_data = lcd_DATA;
    lcd_RD = 1;
    lcd_CS = 1;
    lcd_A0 = 1;
return(address_data);
}


void lcd_cursorxy(unsigned char x,unsigned char y)
{
   //lcd_chkbusy();
    lcd_cmdwrite(0x46);
    lcd_datawrite(x);
    lcd_datawrite(y);
       
}

void lcd_chkbusy(void)
{
   unsigned char busy;

do
{
    busy =(lcd_cmdread() & 0x40);
   
}while(busy);

}

void lcd_showbig(unsigned char *text,unsigned int x)
{
    while(*text != '\0')         
        {
            lcd_datawrite(*text);
            ++text;

          delay1ms(x);
    }
}

void lcd_clear(void)
{   
    unsigned int i;
    lcd_cursorxy(0x00,0x00);
    lcd_cmdwrite(0x42);
   for(i=0;i<0x7fff;i++)   
       lcd_datawrite(0x00);
}


下面是lcd_command.h文件内容:

#define lcd_A0   P2_0
#define lcd_WR   P3_6
#define lcd_RD   P3_7
#define lcd_CS   P3_4
#define lcd_RES    P3_3
#define lcd_SEL1   P3_2
#define lcd_CMD    P0
#define lcd_DATA   P0

XA144F 发表于 2010-8-28 14:53:03

我用Code Vision AVR 写了一个,单片机Atmega128,普通端口操作,除了复位加延时之外,别的都没使用,一样工作的好好的啊,用18.432MHz晶振的时候读写都是正常的。

液晶是HGT1601602,RA8835控制器:
点击此处下载 ourdev_578349.TXT(文件大小:6K) (原文件名:LCD160X.TXT)

HBZHPLJ 发表于 2010-8-29 08:00:38

回复【21楼】mcucow
差不多成功了, 看看lcd的寄存器还有哪里需要设置
-----------------------------------------------------------------------

真的吗,还没弄好,真急呀!

HBZHPLJ 发表于 2010-8-29 08:03:19

回复【23楼】Cybers
模块的接口中的rest你是怎么接的?
-----------------------------------------------------------------------

在一个连接5V的4.7k电阻和连接地的1uf电容中间取的复位!

HBZHPLJ 发表于 2010-8-29 08:03:52

回复【24楼】Cybers
-----------------------------------------------------------------------

给了呀,硬件应该没问题!

HBZHPLJ 发表于 2010-8-29 08:04:45

回复【25楼】Cybers
-----------------------------------------------------------------------

谢谢!!

HYLG 发表于 2011-3-9 17:23:33

楼主的屏点亮没有呀。
我已经用汇编点亮了。

czhaii 发表于 2011-6-3 02:33:04

看看

zzccyy 发表于 2012-4-24 15:05:49

这是我写的。没有问题
void tuxing_init_lcd(void)   //初始化图形方式
{
lcd_rst_0 ;
delay_ms(5);
lcd_rst_1 ;
delay_ms(5);         //复位是必须的
wr_comm(0x40);         //WRITE SYSTEMSET 指令和参数
for(uchar i=0;i<8;i++)
   {
   wr_data(systab);
   }
wr_comm(0x44);         //WRITE SCROLL 指令和参数
for(uchar i=0;i<10;i++)
   {
   wr_data(scrtab);
   }
wr_comm(0x5a);    //显示画面水平移动量:00--07点
wr_data(0x00);    //显示画面不移动
wr_comm(0x5b);    //显示属性:DM1(DM2)=0,文本方式;DM1(DM2)=1,图形方式;OV=0,两重合成
wr_data(0x08);    //显示一区为文本方式显示,显示二,三区为图形方式显示
wr_comm(0x5d);    //光标形状设置,注:光标显示只在文本方式下有效
wr_data(0x07);    //光标占8个点
wr_data(0x87);    //光标为块状显示
wr_comm(0x4c);    //光标自动移动方向--向右
wr_comm(0x59);    // 打开显示
//wr_data(0x12);    //显示二区开,开光标,光标闪烁仅仅图形方式显示
wr_data(0x12 |0x06);

}

void wr_comm(uchar comm)   // 320 * 240 lcd写命令
{
lcd_ce_0 ;
lcd_a0_1 ;
PORTA = comm ;
lcd_rd_1 ;
lcd_wr_0 ;
lcd_wr_1 ;
lcd_ce_0 ;
}


void wr_data(uchar dat)      //lcd写数据
{   
lcd_ce_0 ;
lcd_a0_0 ;   // 0 写 数据
PORTA = dat ;
lcd_rd_1 ;
lcd_wr_0 ;
lcd_wr_1 ;
lcd_ce_0 ;
}


void lcd_clear(void)   //清屏清除了文字与图形区
{
wr_comm(0x59);       //DISP        ON
//wr_data(0x12);
wr_data(0x12 |0x06);
wr_comm(0x46);      //显示光标地址
wr_data(0x00);
wr_data(0x00);
wr_comm(0x42);   //连续些数据到内存中
for(int i=0;i<240;i++)
    {
   for(int j=0;j<80;j++)
         {
         wr_data(0x00);
         }
    }
}


void lcd_display_16_16_hanzi(uchar line,uchar position,uchar s_hanzi_str)   // 行位置具体的汉字320 24020*15= 300 个汉字
{
//uint   gra_addr_temp = 0 ;
for(int i = 0; i < 32; i++)// 每个汉字占32个字节
    {      
      if      ( s_hanzi_str == "0" ){s_hanzi_temp_buffer= (uchar)s_hanzi001;}
      else if ( s_hanzi_str == "1" ){s_hanzi_temp_buffer= (uchar)s_hanzi002;}
else if ( s_hanzi_str == "频" ) {s_hanzi_temp_buffer = (uchar)s_hanzi328;}
      
      
      
    }


for(int i = 0; i < 16; i++)// 由于每个汉字占 16 行,所以循环16次
    {
    wr_comm(0x59);          //DISP        ON
    //wr_data(0x12);
    wr_data(0x12 |0x06);
    wr_comm(0x46);
   
    //gra_addr_temp = (gra_start_addr+ (i * 40)+ ((line - 1)* 640 ));    //40代表每行40个字节16代表每个汉字占16行    40 * 16
    //gra_addr_temp = (gra_addr_temp + ((position*2) - 2 ));               // position   1代表字的宽度是 1个字节
    //wr_data((gra_addr_temp%256)& 0xff);
    //wr_data((gra_addr_temp/256)& 0xff); // 确定了文字的位置
   
    gra_addr_16_16_temp = (9600+ (i * 40)+ ((line - 1)* 640 )) + ((position*2) - 2 );    //40代表每行40个字节16代表每个汉字占16行    40 * 16   // position   1代表字的宽度是 1个字节
      
    wr_data((gra_addr_16_16_temp>>0) & 0xff);
    wr_data((gra_addr_16_16_temp>>8) & 0xff); // 确定了文字的位置
   
    wr_comm(0x42);
    wr_data( s_hanzi_temp_buffer[ (i*2) + 0 ] ); // 分2次写入数据   
    wr_data( s_hanzi_temp_buffer[ (i*2) + 1 ] );
   
    }
}


zzccyy 发表于 2012-4-24 16:08:26

26楼的大虾,我想问下:lcd_SEL1 具体指的LCD屏幕上的哪条控制线?

张伟690 发表于 2013-4-1 21:26:28

谢谢!辛苦了{:handshake:}

jiki119 发表于 2013-4-1 21:40:44

quani去啊你还是劝你还是用C 吧,hen easy,也很快的。
页: [1]
查看完整版本: 得到块5.7寸液晶屏,是RA8835AP控制芯片,内带32KRAM,用汇编写了个测试程序,可怎么也不行