打印

c语言汇编混合编程中出现的问题

[复制链接]
2024|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
想做一个万年历,底层的关于硬件的程序用汇编写好了,想用C语言来处理按键。于是,我先用汇编写了一个基于DS1388+12864的时钟显示程序,烧录之后运行正确。由于是第一次使用混合编程,就想先写一个简单的测试一下,于是我直接在C的主程序里调用刚才说的那个程序,结果12864上却没有显示,奇怪,求助!
以下是c语言程序:
#include<reg51.h> //主程序 MAIN.C清单,采用C51编写

extern DS1388_6();//声明函数,

void main(void)
{

while(1)

DS1388_6();

}

以下是汇编程序:
;======================================

;

;DS1388+IIC+12864LCD

;MCU:89S52

;MADE BY 651927693

;2012/09/06

;V1.3

;可显示时间,

;======================================

;NAME 01 //定义模块名

?PR?DS1388_6 SEGMENT CODE //声明 SETADC子程序所属代码段

PUBLIC DS1388_6 //声明子程序 DS1388_6为公用,以便C模块可以调用

RSEG ?PR?DS1388_6

DS1388_6:

;ORG 0000H

;LJMP MAIN

;ORG 0020H
;液晶管脚定义:

RS EQU P2.3 //寄存器选择端,H数据,L指令

RW EQU P2.4 //H读,L写

EEE EQU P2.5 //串口模式下为读写操作使能端。E的下降沿锁定数据

RES EQU P2.6

PSB EQU P2.7 //H并,L串

;实时芯片管脚定义

RST EQU P1.5
SCL EQU P1.4 //SERIAL CLOCK INPUT

SDA EQU P1.3 //SERIAL DATA OUTPUT内部寄存器的地址


IICADD EQU 38H //IIC器件(DS1388) 内部寄存器的地址

IICDAT EQU 39H //IIC器件(DS1388) 内部寄存器的内容(读出或写入)

IICNUM EQU 3AH //IIC器件(DS1388) 的地址


MAIN: ;初始化时间,30-37H分别存放着时间的数据

MOV 30H, #00H ;1/100s

MOV 31H, #00H ;s

MOV 32H, #54H ;min

MOV 33H, #08H ;h

MOV 34H, #07H ;day of week

MOV 35H, #08H ;date

MOV 36H, #07H ;month

MOV 37H, #12H ;year


;CLR 7FH //小时:分钟:秒 中的冒号显示与否的标志

;============================================

;DS1388's initialization

SETB SCL

SETB SDA

CLR RST

NOP

SETB RST
NOP


MOV IICNUM,#11010000B //DS1388's address

MOV R0, #30H

MOV R1, #00H

MOV R2, #08H

TIME_INIT:

MOV IICADD, R1

MOV IICDAT, @R0

LCALL IIC_WRITE

LCALL DEL0

INC R0

INC R1

DJNZ R2, TIME_INIT



LCD_INIT: CLR RES

LCALL DEL0

SETB RES

LCALL DEL0

SETB PSB

LCALL DEL0

MOV A,#30H

LCALL WRITE_COM

LCALL DEL0

MOV A,#30H

LCALL WRITE_COM

LCALL DEL0

MOV A,#0CH

LCALL WRITE_COM

LCALL DEL0

MOV A,#01H

LCALL WRITE_COM
LCALL DEL0

MOV A,#06H

LCALL WRITE_COM

LCALL DEL0

;LCD_INIT FINISHED






SHOW:

MOV R5, #0FFFFH

MOV R0, #30H //读出DS1388的时间

MOV R1, #00H

MOV R2, #08H
READTIME:

MOV IICADD, R1

LCALL IIC_READ

MOV @R0, IICDAT

INC R0

INC R1

DJNZ R2, READTIME

MOV A, #80H

LCALL WRITE_COM

LCALL DEL0

MOV A, 37H //年份+"/"

LCALL NUMSHOW

MOV A, #2FH

LCALL WRITE_DATA

LCALL DEL0


MOV A, 36H //月份+"/"

LCALL NUMSHOW

MOV A, #2FH

LCALL WRITE_DATA

LCALL DEL0


MOV A, 35H //日期+"/"

LCALL NUMSHOW


MOV A, #85H

LCALL WRITE_COM

LCALL DEL0


MOV DPTR,#WORD_1

MOV R7, #4

MOV R6, #0

LCALL SHOW_CHINESE


MOV DPTR, #WORD_2

MOV R7, #2

MOV R6,34H //日期的数据传给R6

DEC R6 //减一是因为要从0开始数

MOV A, R6 //乘以2,因为每个汉字占两位

ADD A, R6

MOV R6, A

LCALL SHOW_CHINESE


MOV A, #91H //小时+":"

LCALL WRITE_COM

LCALL DEL0

MOV A, 33H

LCALL NUMSHOW

MOV A, #3AH

LCALL WRITE_DATA


MOV A, 32H //分钟+":"

LCALL NUMSHOW

MOV A, #3AH

LCALL WRITE_DATA


MOV A, 31H //秒

LCALL NUMSHOW


DJNZ R5, SHOW


RET


NUMSHOW: MOV B,A //十六进制数据转换为LCD可显示的ASCII码数据

ANL A,#0F0H

SWAP A

ADD A,#30H

LCALL WRITE_DATA

LCALL DEL0

MOV A,B

ANL A,#0FH

ADD A,#30H

LCALL WRITE_DATA

LCALL DEL0

RET

WRITE_COM:

CLR RS

LCALL DEL0

CLR RW

LCALL DEL0

SETB EEE

RLC A

MOV 00H,C

RLC A

MOV 01H,C

RLC A

MOV 02H,C

RLC A

MOV 03H,C

RLC A

MOV 04H,C

RLC A

MOV 05H,C

RLC A

MOV 06H,C

RLC A

MOV 07H,C

MOV A,20H

MOV P0,A

LCALL DEL0

CLR EEE

LCALL DEL0

RET

WRITE_DATA:

SETB RS

LCALL DEL0

CLR RW

LCALL DEL0

SETB EEE

RLC A

MOV 00H,C

RLC A

MOV 01H,C

RLC A

MOV 02H,C

RLC A

MOV 03H,C

RLC A

MOV 04H,C

RLC A

MOV 05H,C

RLC A

MOV 06H,C

RLC A

MOV 07H,C

MOV A,20H

MOV P0,A

LCALL DEL0

CLR EEE

LCALL DEL0

RET

;;;;;;;;;;;延时程序;;;;;;;;;;;;;

DEL0:MOV 20H,#2

DEL1:MOV 21H,#2

DEL2:MOV 22H,#25

DJNZ 22H,$

DJNZ 21H,DEL2

DJNZ 20H,DEL1

RET

;--------------------------------------------

;IIC总线(读,写操作)

;IIC_WRITE:

;IICNUM中存放要写入的元件的地址,IICADD中存放要写入的地址, IICDAT中存放要写入的数据

;IIC_READ:

;IICNUM中存放要读取的元件的地址,IICADD中存放要写入的地址, IICDAT中存放读取的数据
;Made by 651927693

;2012/08/08

;--------------------------------------------


IIC_WRITE:
;LCALL IIC_INIT

LCALL IIC_START

MOV A, IICNUM

LCALL IIC_WRITE_BYTE

;LCALL IIC_WRITE_ACK

LCALL IIC_ACK

JC IIC_WRITE

MOV A, IICADD

LCALL IIC_WRITE_BYTE
;LCALL IIC_WRITE_ACK

LCALL IIC_ACK

JC IIC_WRITE

MOV A, IICDAT

LCALL IIC_WRITE_BYTE

;LCALL IIC_WRITE_ACK

LCALL IIC_ACK

JC IIC_WRITE

LCALL IIC_STOP

RET

IIC_READ:
;LCALL IIC_INIT

LCALL IIC_START

MOV A, IICNUM

LCALL IIC_WRITE_BYTE

;LCALL IIC_WRITE_ACK

LCALL IIC_ACK

JC IIC_READ

MOV A, IICADD

LCALL IIC_WRITE_BYTE

;LCALL IIC_WRITE_ACK

LCALL IIC_ACK

JC IIC_READ


;RESTART

LCALL IIC_START

MOV A, IICNUM

ORL A, #01H

LCALL IIC_WRITE_BYTE

;LCALL IIC_WRITE_ACK

LCALL IIC_ACK

JC IIC_READ

LCALL IIC_READ_BYTE

;LCALL IIC_READ_ACK

MOV IICDAT, A

LCALL IIC_STOP

RET


;IIC_INIT:

; SETB SDA

; SETB SCL

; NOP

; RET

;=====================================================

IIC_START:

SETB SDA

NOP

SETB SCL

NOP

NOP

NOP

NOP

NOP

CLR SDA

NOP

NOP

NOP

NOP

NOP

CLR SCL

RET

;=====================================================

IIC_STOP:

CLR SDA

NOP

SETB SCL

NOP

NOP

NOP

NOP

NOP

SETB SDA

NOP

NOP

NOP

NOP

NOP

RET

;=====================================================

IIC_WRITE_BYTE:
MOV B, #08H

IIC_WRITE_BYTE0:

RLC A

MOV SDA, C

NOP

SETB SCL

NOP

NOP

NOP

NOP

NOP

CLR SCL

NOP

DJNZ B, IIC_WRITE_BYTE0

RET

;====================================================

IIC_READ_BYTE:

MOV B, #08H
CLR A

SETB SDA

NOP

IIC_READ_BYTE0:

SETB SCL

NOP

NOP

NOP

NOP

NOP

MOV C, SDA

RLC A

CLR SCL

NOP

NOP

NOP

NOP

NOP

DJNZ B, IIC_READ_BYTE0

RET

;====================================================

MOV B, #0FFH

IIC_WRITE_ACK:
SETB SDA

SETB SCL

NOP

JB SDA, DEL_ACK

CLR SCL

NOP

RET

;=============================

DEL_ACK:

DJNZ B, $

CLR SCL

NOP

RET

;====================================================

IIC_READ_ACK:

CLR SCL

NOP

CLR SDA

NOP

SETB SCL

NOP

RET

;=====================================================

IIC_ACK: SETB SDA

NOP

NOP

SETB SCL

NOP

NOP

NOP

JB SDA,IIC_ACK0

CLR C

SJMP IIC_ACK_END

IIC_ACK0: SETB C

SJMP IIC_ACK_END

IIC_ACK_END: CLR SCL

RET

;=====================================================

;DPTR

;R7表示要显示的汉字个数*2

;A表示从第几个汉字开始显示

;=====================================================

SHOW_CHINESE:

MOV A, R6

MOVC A, @A+DPTR

LCALL WRITE_DATA

LCALL DEL0

INC DPTR

DJNZ R7, SHOW_CHINESE

LCALL DEL0

RET

;=====================================================


WORD_1:

DB "星期"

WORD_2:

DB "一二三四五六日"




END


相关帖子

沙发
NE5532| | 2012-9-6 22:00 | 只看该作者
能研究混合编程的人,这样的问题不应该拿来问。混合编程的重点是弄清C语言形参传递的接口格式,其他觉得不对的地方,可以看List文件或者反汇编文件来解决。

使用特权

评论回复
板凳
阿南| | 2012-9-6 22:00 | 只看该作者
楼主在调试环境中,切换到混合模式,查看反汇编的代码可以知道是否有按预期的方式调用。或者在调试状态下单步跟踪。

使用特权

评论回复
地板
651927693|  楼主 | 2012-9-7 15:09 | 只看该作者
我查看了反汇编的代码,发现其实我写的汇编程序并没有被调用,可是为什么呢

使用特权

评论回复
5
651927693|  楼主 | 2012-9-7 16:22 | 只看该作者
本帖最后由 651927693 于 2012-9-7 16:27 编辑


问题解决了,程序没有问题,只是多添加了一个文件"Standard 8051 Code”

使用特权

评论回复
6
651927693|  楼主 | 2012-9-7 16:28 | 只看该作者
但是为什么呢

使用特权

评论回复
7
NE5532| | 2012-9-7 20:47 | 只看该作者
你启动代码都没添加??

使用特权

评论回复
8
651927693|  楼主 | 2012-9-8 07:44 | 只看该作者
没有的,但是可以运行啊。

使用特权

评论回复
9
sedatefire| | 2012-9-8 13:13 | 只看该作者
除了寄存器的传参规则外
在51中,很容易出错的是bank
NOARGES的道理去了解下

使用特权

评论回复
10
651927693|  楼主 | 2012-9-8 19:46 | 只看该作者
除了寄存器的传参规则外
在51中,很容易出错的是bank
NOARGES的道理去了解下
sedatefire 发表于 2012-9-8 13:13

说实话,我完全没懂您的意思

使用特权

评论回复
11
651927693|  楼主 | 2012-9-8 19:51 | 只看该作者
而且,又出现了新的问题。
之前我将整个汇编程序写成一个函数用C调用,是可以看到运行结果的。
不过现在当我将这个汇编程序在分为几个子程序用C调用时, LCD却没有显示了

使用特权

评论回复
12
eydj2008| | 2012-9-8 20:24 | 只看该作者
C 里面汇汇函数 都没有 在C里面加入汇编 51 需要加关键字 #program
都没有看到 而且还要设置属性 你也没讲 就直接混合了。。。。

使用特权

评论回复
13
651927693|  楼主 | 2012-9-8 20:50 | 只看该作者
C 里面汇汇函数 都没有 在C里面加入汇编 51 需要加关键字 #program
都没有看到 而且还要设置属性 你也没讲 就直接混合了。。。。
eydj2008 发表于 2012-9-8 20:24

你说的是在C程序里内联汇编代码,只是插入一段汇编代码而已,我指的是用C51调用汇编程序。
至于属性的设置,我也做过了:

使用特权

评论回复
14
eydj2008| | 2012-9-8 23:35 | 只看该作者
对的

你不用弄那么复杂 表达架构就可以了 51 就是这样调用

使用特权

评论回复
15
651927693|  楼主 | 2012-9-9 15:24 | 只看该作者
可问题是,LCD上没有显示啊

使用特权

评论回复
16
初入江湖| | 2012-10-10 21:06 | 只看该作者

使用特权

评论回复
17
sedatefire| | 2012-10-10 23:08 | 只看该作者
偶滴妈呀,汇编,好懒得看啊

使用特权

评论回复
18
651927693|  楼主 | 2012-10-12 11:28 | 只看该作者
汇编对于像我这样的新手还是有好处的

使用特权

评论回复
19
wuzx-61| | 2012-12-20 21:51 | 只看该作者
俺也学混编,几次也是不成功.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

544

帖子

1

粉丝