得到块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 lz 很厉害。 可惜我等菜鸟看不懂汇编。自从51汇编做项目后,到了avr基本都是c了 这个AVR的汇编我就看不懂了,不过一般都是初始时序不对才点不亮的,LZ可以设置更长的延迟来做初始化试试看。 看不懂汇编 可怎么也行,请高手指点什么? 我从51开始就不学汇编。。我也看不懂啊。。哈哈。。./emotion/em003.gif 看来lz未看过8835的数据手册.今发个8835的pdf
你要解决问题先将硬件接线发上来.
从你的汇编来看没有对8835的端口操作,只用一个delay这是延时,这怎么能成功.
点击此处下载 ourdev_578144.pdf(文件大小:404K) (原文件名:RA8835.pdf) 晕死了,明明是牛人却不变通一下,埋没了自己的才能.
花点点时间学C,然后就发现自己牛得不行了. 回复【6楼】zck9
-----------------------------------------------------------------------
谢谢,我看看,争取用一个星期把它弄出来! 回复【4楼】billtian mcu杀手
-----------------------------------------------------------------------
真的不行呀! 回复【7楼】page_zero
-----------------------------------------------------------------------
是真的吗? 没有用过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
你怎么那么喜欢用?? 看不懂!
不過有一點要說明那個62256的顯存是給8835用的,寫顯示數據是要通過8835才能寫進去的!不是寫個地址然後寫數據進去變會顯示的! 都用M128了,还是慢慢学会用C吧,我从学了C过后,很少用汇编了.这个看的脑袋都大了. 以前用C写单片机软件,最近用汇编,汇编很带劲噢。。 回复【14楼】youthvision 重楼
-----------------------------------------------------------------------
回复【14楼】youthvision 重楼
以前用c写单片机软件,最近用汇编,汇编很带劲噢。。
-----------------------------------------------------------------------
终于找到知音了! 回复【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进行读写操作! 回复【12楼】gmolzc
看不懂!
不過有一點要說明那個62256的顯存是給8835用的,寫顯示數據是要通過8835才能寫進去的!不是寫個地址然後寫數據進去變會顯示的!
-----------------------------------------------------------------------
是的! RA8835的使用要注意3个问题:
1、要加一个硬件的复位电路
2、把刷新频率控制在64
3、RA8835有两个板本,RA8835P3N和RA8835AP3N
最好是用C语言编程,好处不用我说了,不过汇编也不能丢了(是不是废话?)。 回复【18楼】Cybers
ra8835的使用要注意3个问题:
1、要加一个硬件的复位电路
2、把在64
3、ra8835有两个板本,ra8835p3n和ra8835ap3n
最好是用c语言编程,好处不用我说了,不过汇编也不能丢了(是不是废话?)。
-----------------------------------------------------------------------
有硬件复位电路,可不知刷新频率怎么控制! http://cache.amobbs.com/bbs_upload782111/files_32/ourdev_578310.jpg
这就是上面程序的显示现象! (原文件名:新图像.jpg) 差不多成功了, 看看LCD的寄存器还有哪里需要设置 mark 模块的接口中的REST你是怎么接的? REST不可以接+5V,上电了之后最好给一个复位信号 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 我用Code Vision AVR 写了一个,单片机Atmega128,普通端口操作,除了复位加延时之外,别的都没使用,一样工作的好好的啊,用18.432MHz晶振的时候读写都是正常的。
液晶是HGT1601602,RA8835控制器:
点击此处下载 ourdev_578349.TXT(文件大小:6K) (原文件名:LCD160X.TXT) 回复【21楼】mcucow
差不多成功了, 看看lcd的寄存器还有哪里需要设置
-----------------------------------------------------------------------
真的吗,还没弄好,真急呀! 回复【23楼】Cybers
模块的接口中的rest你是怎么接的?
-----------------------------------------------------------------------
在一个连接5V的4.7k电阻和连接地的1uf电容中间取的复位! 回复【24楼】Cybers
-----------------------------------------------------------------------
给了呀,硬件应该没问题! 回复【25楼】Cybers
-----------------------------------------------------------------------
谢谢!! 楼主的屏点亮没有呀。
我已经用汇编点亮了。 看看 这是我写的。没有问题
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 ] );
}
}
26楼的大虾,我想问下:lcd_SEL1 具体指的LCD屏幕上的哪条控制线? 谢谢!辛苦了{:handshake:} quani去啊你还是劝你还是用C 吧,hen easy,也很快的。
页:
[1]