51单片机里的汇编程序看不懂,谁能帮忙翻译成C语言啊,谢谢!1622液晶驱动程序。 20
CSBITP1.0;片选信号WWRBITP1.1;时钟(写信号)SDABITp1.2;数据口DATEQU50H;写入数据暂存单元ADDREQU51H;写入目标地址暂存单元...
CS BIT P1.0 ;片选信号
WWR BIT P1.1 ;时钟(写信号)
SDA BIT p1.2 ;数据口
DAT EQU 50H ;写入数据暂存单元
ADDR EQU 51H ;写入目标地址暂存单元
;--------------------------------------
ORG 0000H
AJMP MAIN
ORG 0030H ;保留地址给中断
MAIN:
NOP
NOP
MOV R6,#100
MAI1: MOV R7,#200
MAI2: NOP
NOP
DJNZ R7,MAI2 //减1后不为0则转移
DJNZ R6,MAI1
CLR P3.2
MOV SP,#060H
LCALL DEL_20MS
LCALL LCD_INI ;初始化
LOOP:
MOV R5,#9 ;8个循环,对应8个动作字RAM
MOV DPTR,#TABLE1
LOOP1:
CLR CS ;CS置低,对1621操作有效
LCALL DATHEAD ;数据输入模式
MOV ADDR,#0H ;准备写入的目标地址,此处为0,是准备从0 Address开始
MOV A,ADDR ;将目标地址送入A
LCALL WRIT_AD ;调用写地址子程序
MOV A,#0
MOVC A,@A+DPTR
MOV DAT,A
MOV R6,#32 ;32个循环,分别对32字节RAM的8数据位写数据
LOOP2:
MOV A,DAT
LCALL WRIT_B ;调用写数据子程序
DJNZ R6,LOOP2 ;检查所有RAM是否写完
SETB CS ;片选置高,中止操作1621
LCALL DEL_500MS ;延时等待QC检测
INC DPTR
DJNZ R5,LOOP1 ;进入下一循环,写其他显示数据
RUN:
LCALL T_4KHZ
LCALL TONE_ON
LCALL DEL_300MS
LCALL T_2KHZ
LCALL TONE_ON
LCALL DEL_300MS
LCALL TONE_OFF
LJMP LOOP
;--------------------------------------
T_4KHZ:
CLR CS
LCALL INSHEAD
MOV A,#01000000B
LCALL WRIT8
SETB CS
RET
T_2KHZ:
CLR CS
LCALL INSHEAD
MOV A,#01100000B
LCALL WRIT8
SETB CS
RET
TONE_ON:
CLR CS
LCALL INSHEAD
MOV A,#00001001B
LCALL WRIT8
SETB CS
RET
TONE_OFF:
CLR CS
LCALL INSHEAD
MOV A,#00001000B
LCALL WRIT8
SETB CS
RET
WRIT_B:
PUSH ACC
MOV R1,#8
WIB:
RRC A
MOV SDA,C
ACALL WRI ; 写入SDA上面数据至1621
DJNZ R1,WIB
POP ACC
RET
;--------------------------------------
; 写入指令子程序
WRIT8:
MOV R1,#9 ; 指令格式为9位,即使后面是X
WI:
RLC A
MOV SDA,C
ACALL WRI ; 写入SDA上面数据至1621
DJNZ R1,WI
RET
;--------------------------------------
; 写入地址子程序,地址为6位,6个循环
WRIT_AD:
RLC A ; 去掉A的高两位
RLC A ; 地址以A的后6位有效
MOV R1,#6 ; 6个循环
WII:
RLC A
MOV SDA,C
ACALL WRI ; 写入SDA上面数据至1621
DJNZ R1,WII
RET
;--------------------------------------
; 命令写入模式
INSHEAD: ; Command mode (Command code 100) ,送入100
SETB SDA ; 1
ACALL WRI ; 送入data信号,只送1 bit
CLR SDA ; 0
ACALL WRI
CLR SDA ; 0
ACALL WRI
RET
;--------------------------------------
; 数据写入模式
DATHEAD: ; Write Mode (Command code 101 )
SETB SDA ; 1
ACALL WRI
CLR SDA ; 0
ACALL WRI
SETB SDA ; 1
ACALL WRI
RET
DEL_20MS:
MOV R0,#20
D2:
MOV R1,#200
D1:
NOP
NOP
NOP
DJNZ R1,D1
DJNZ R0,D2
RET
DEL_200MS:
MOV R2,#10
DEL_1:
LCALL DEL_20MS
DJNZ R2,DEL_1
RET
TABLE1:
DB 001H,002H,004H,008H,010H,020H,040H
这是自己翻译的主程序,430的,可是不能显示,为什么,有什么硬伤吗?
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P3DIR |=BIT3;//cs
P5DIR |=BIT4;//sda
P5DIR |=BIT6;//wwr
P5OUT &= ~WWR;
DEL_20MS();
LCD_INI();
while(1)
{
uchar address,i;
uchar *p=TABLE;
P3OUT &= ~CS;
for (i=0;i<9;i++)
{
for(address=0;address<32;address++) Wdata(address,*p);
P3OUT |=CS;
DEL_500MS();
p++;
}
T_4KZ();
TONE_ON();
DEL_300MS();
T_2KZ();
TONE_ON();
DEL_300MS();
TONE_OFF();
}
} 展开
WWR BIT P1.1 ;时钟(写信号)
SDA BIT p1.2 ;数据口
DAT EQU 50H ;写入数据暂存单元
ADDR EQU 51H ;写入目标地址暂存单元
;--------------------------------------
ORG 0000H
AJMP MAIN
ORG 0030H ;保留地址给中断
MAIN:
NOP
NOP
MOV R6,#100
MAI1: MOV R7,#200
MAI2: NOP
NOP
DJNZ R7,MAI2 //减1后不为0则转移
DJNZ R6,MAI1
CLR P3.2
MOV SP,#060H
LCALL DEL_20MS
LCALL LCD_INI ;初始化
LOOP:
MOV R5,#9 ;8个循环,对应8个动作字RAM
MOV DPTR,#TABLE1
LOOP1:
CLR CS ;CS置低,对1621操作有效
LCALL DATHEAD ;数据输入模式
MOV ADDR,#0H ;准备写入的目标地址,此处为0,是准备从0 Address开始
MOV A,ADDR ;将目标地址送入A
LCALL WRIT_AD ;调用写地址子程序
MOV A,#0
MOVC A,@A+DPTR
MOV DAT,A
MOV R6,#32 ;32个循环,分别对32字节RAM的8数据位写数据
LOOP2:
MOV A,DAT
LCALL WRIT_B ;调用写数据子程序
DJNZ R6,LOOP2 ;检查所有RAM是否写完
SETB CS ;片选置高,中止操作1621
LCALL DEL_500MS ;延时等待QC检测
INC DPTR
DJNZ R5,LOOP1 ;进入下一循环,写其他显示数据
RUN:
LCALL T_4KHZ
LCALL TONE_ON
LCALL DEL_300MS
LCALL T_2KHZ
LCALL TONE_ON
LCALL DEL_300MS
LCALL TONE_OFF
LJMP LOOP
;--------------------------------------
T_4KHZ:
CLR CS
LCALL INSHEAD
MOV A,#01000000B
LCALL WRIT8
SETB CS
RET
T_2KHZ:
CLR CS
LCALL INSHEAD
MOV A,#01100000B
LCALL WRIT8
SETB CS
RET
TONE_ON:
CLR CS
LCALL INSHEAD
MOV A,#00001001B
LCALL WRIT8
SETB CS
RET
TONE_OFF:
CLR CS
LCALL INSHEAD
MOV A,#00001000B
LCALL WRIT8
SETB CS
RET
WRIT_B:
PUSH ACC
MOV R1,#8
WIB:
RRC A
MOV SDA,C
ACALL WRI ; 写入SDA上面数据至1621
DJNZ R1,WIB
POP ACC
RET
;--------------------------------------
; 写入指令子程序
WRIT8:
MOV R1,#9 ; 指令格式为9位,即使后面是X
WI:
RLC A
MOV SDA,C
ACALL WRI ; 写入SDA上面数据至1621
DJNZ R1,WI
RET
;--------------------------------------
; 写入地址子程序,地址为6位,6个循环
WRIT_AD:
RLC A ; 去掉A的高两位
RLC A ; 地址以A的后6位有效
MOV R1,#6 ; 6个循环
WII:
RLC A
MOV SDA,C
ACALL WRI ; 写入SDA上面数据至1621
DJNZ R1,WII
RET
;--------------------------------------
; 命令写入模式
INSHEAD: ; Command mode (Command code 100) ,送入100
SETB SDA ; 1
ACALL WRI ; 送入data信号,只送1 bit
CLR SDA ; 0
ACALL WRI
CLR SDA ; 0
ACALL WRI
RET
;--------------------------------------
; 数据写入模式
DATHEAD: ; Write Mode (Command code 101 )
SETB SDA ; 1
ACALL WRI
CLR SDA ; 0
ACALL WRI
SETB SDA ; 1
ACALL WRI
RET
DEL_20MS:
MOV R0,#20
D2:
MOV R1,#200
D1:
NOP
NOP
NOP
DJNZ R1,D1
DJNZ R0,D2
RET
DEL_200MS:
MOV R2,#10
DEL_1:
LCALL DEL_20MS
DJNZ R2,DEL_1
RET
TABLE1:
DB 001H,002H,004H,008H,010H,020H,040H
这是自己翻译的主程序,430的,可是不能显示,为什么,有什么硬伤吗?
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P3DIR |=BIT3;//cs
P5DIR |=BIT4;//sda
P5DIR |=BIT6;//wwr
P5OUT &= ~WWR;
DEL_20MS();
LCD_INI();
while(1)
{
uchar address,i;
uchar *p=TABLE;
P3OUT &= ~CS;
for (i=0;i<9;i++)
{
for(address=0;address<32;address++) Wdata(address,*p);
P3OUT |=CS;
DEL_500MS();
p++;
}
T_4KZ();
TONE_ON();
DEL_300MS();
T_2KZ();
TONE_ON();
DEL_300MS();
TONE_OFF();
}
} 展开
5个回答
展开全部
for d = s:100,
path = [];
if parent(d) ~= 0 % if there is a path!
%path = [];
t = d;
path = [d];
while t ~= s
p = parent(t);
path = [p path];
if netCostMatrix(t, farthestPreviousHop(t)) < netCostMatrix(t, p)
farthestPreviousHop(t) = p;
path = [];
if parent(d) ~= 0 % if there is a path!
%path = [];
t = d;
path = [d];
while t ~= s
p = parent(t);
path = [p path];
if netCostMatrix(t, farthestPreviousHop(t)) < netCostMatrix(t, p)
farthestPreviousHop(t) = p;
展开全部
你的这段汇编有问题。org 0030h应该是个中断入口点,单你的main也在这里。难道main是个中断程序?
追问
汇编通过了,能显示啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我就不明白了,汇编看不懂,为什么就看不懂C语言呢,我学单片机就是就C入的门,汇编是后来学的,不过学的不好,上面的程序我也看不太懂、
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
汇编你都看不懂,怎么能看懂C语言呢。
追问
一直用的c语言,没用过汇编,帮忙翻译一下吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-12-28
展开全部
还没学,,,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询