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

[复制链接]
2894|18
 楼主| 651927693 发表于 2012-9-6 20:13 | 显示全部楼层 |阅读模式
想做一个万年历,底层的关于硬件的程序用汇编写好了,想用C语言来处理按键。于是,我先用汇编写了一个基于DS1388+12864的时钟显示程序,烧录之后运行正确。由于是第一次使用混合编程,就想先写一个简单的测试一下,于是我直接在C的主程序里调用刚才说的那个程序,结果12864上却没有显示,奇怪,求助!
以下是c语言程序:
  1. #include<reg51.h> //主程序 MAIN.C清单,采用C51编写

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

  3. void main(void)
  4. {

  5. while(1)

  6. DS1388_6();

  7. }

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

  2. ;

  3. ;DS1388+IIC+12864LCD

  4. ;MCU:89S52

  5. ;MADE BY 651927693

  6. ;2012/09/06

  7. ;V1.3

  8. ;可显示时间,

  9. ;======================================

  10. ;NAME 01 //定义模块名

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

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

  13. RSEG ?PR?DS1388_6

  14. DS1388_6:

  15. ;ORG 0000H

  16. ;LJMP MAIN

  17. ;ORG 0020H
  18. ;液晶管脚定义:

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

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

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

  22. RES EQU P2.6

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

  24. ;实时芯片管脚定义

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

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


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

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

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


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

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

  33. MOV 31H, #00H ;s

  34. MOV 32H, #54H ;min

  35. MOV 33H, #08H ;h

  36. MOV 34H, #07H ;day of week

  37. MOV 35H, #08H ;date

  38. MOV 36H, #07H ;month

  39. MOV 37H, #12H ;year


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

  41. ;============================================

  42. ;DS1388's initialization

  43. SETB SCL

  44. SETB SDA

  45. CLR RST

  46. NOP

  47. SETB RST
  48. NOP


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

  50. MOV R0, #30H

  51. MOV R1, #00H

  52. MOV R2, #08H

  53. TIME_INIT:

  54. MOV IICADD, R1

  55. MOV IICDAT, @R0

  56. LCALL IIC_WRITE

  57. LCALL DEL0

  58. INC R0

  59. INC R1

  60. DJNZ R2, TIME_INIT



  61. LCD_INIT: CLR RES

  62. LCALL DEL0

  63. SETB RES

  64. LCALL DEL0

  65. SETB PSB

  66. LCALL DEL0

  67. MOV A,#30H

  68. LCALL WRITE_COM

  69. LCALL DEL0

  70. MOV A,#30H

  71. LCALL WRITE_COM

  72. LCALL DEL0

  73. MOV A,#0CH

  74. LCALL WRITE_COM

  75. LCALL DEL0

  76. MOV A,#01H

  77. LCALL WRITE_COM
  78. LCALL DEL0

  79. MOV A,#06H

  80. LCALL WRITE_COM

  81. LCALL DEL0

  82. ;LCD_INIT FINISHED






  83. SHOW:

  84. MOV R5, #0FFFFH

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

  86. MOV R1, #00H

  87. MOV R2, #08H
  88. READTIME:

  89. MOV IICADD, R1

  90. LCALL IIC_READ

  91. MOV @R0, IICDAT

  92. INC R0

  93. INC R1

  94. DJNZ R2, READTIME

  95. MOV A, #80H

  96. LCALL WRITE_COM

  97. LCALL DEL0

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

  99. LCALL NUMSHOW

  100. MOV A, #2FH

  101. LCALL WRITE_DATA

  102. LCALL DEL0


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

  104. LCALL NUMSHOW

  105. MOV A, #2FH

  106. LCALL WRITE_DATA

  107. LCALL DEL0


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

  109. LCALL NUMSHOW


  110. MOV A, #85H

  111. LCALL WRITE_COM

  112. LCALL DEL0


  113. MOV DPTR,#WORD_1

  114. MOV R7, #4

  115. MOV R6, #0

  116. LCALL SHOW_CHINESE


  117. MOV DPTR, #WORD_2

  118. MOV R7, #2

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

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

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

  122. ADD A, R6

  123. MOV R6, A

  124. LCALL SHOW_CHINESE


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

  126. LCALL WRITE_COM

  127. LCALL DEL0

  128. MOV A, 33H

  129. LCALL NUMSHOW

  130. MOV A, #3AH

  131. LCALL WRITE_DATA


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

  133. LCALL NUMSHOW

  134. MOV A, #3AH

  135. LCALL WRITE_DATA


  136. MOV A, 31H //秒

  137. LCALL NUMSHOW


  138. DJNZ R5, SHOW


  139. RET


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

  141. ANL A,#0F0H

  142. SWAP A

  143. ADD A,#30H

  144. LCALL WRITE_DATA

  145. LCALL DEL0

  146. MOV A,B

  147. ANL A,#0FH

  148. ADD A,#30H

  149. LCALL WRITE_DATA

  150. LCALL DEL0

  151. RET

  152. WRITE_COM:

  153. CLR RS

  154. LCALL DEL0

  155. CLR RW

  156. LCALL DEL0

  157. SETB EEE

  158. RLC A

  159. MOV 00H,C

  160. RLC A

  161. MOV 01H,C

  162. RLC A

  163. MOV 02H,C

  164. RLC A

  165. MOV 03H,C

  166. RLC A

  167. MOV 04H,C

  168. RLC A

  169. MOV 05H,C

  170. RLC A

  171. MOV 06H,C

  172. RLC A

  173. MOV 07H,C

  174. MOV A,20H

  175. MOV P0,A

  176. LCALL DEL0

  177. CLR EEE

  178. LCALL DEL0

  179. RET

  180. WRITE_DATA:

  181. SETB RS

  182. LCALL DEL0

  183. CLR RW

  184. LCALL DEL0

  185. SETB EEE

  186. RLC A

  187. MOV 00H,C

  188. RLC A

  189. MOV 01H,C

  190. RLC A

  191. MOV 02H,C

  192. RLC A

  193. MOV 03H,C

  194. RLC A

  195. MOV 04H,C

  196. RLC A

  197. MOV 05H,C

  198. RLC A

  199. MOV 06H,C

  200. RLC A

  201. MOV 07H,C

  202. MOV A,20H

  203. MOV P0,A

  204. LCALL DEL0

  205. CLR EEE

  206. LCALL DEL0

  207. RET

  208. ;;;;;;;;;;;延时程序;;;;;;;;;;;;;

  209. DEL0:MOV 20H,#2

  210. DEL1:MOV 21H,#2

  211. DEL2:MOV 22H,#25

  212. DJNZ 22H,$

  213. DJNZ 21H,DEL2

  214. DJNZ 20H,DEL1

  215. RET

  216. ;--------------------------------------------

  217. ;IIC总线(读,写操作)

  218. ;IIC_WRITE:

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

  220. ;IIC_READ:

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

  223. ;2012/08/08

  224. ;--------------------------------------------


  225. IIC_WRITE:
  226. ;LCALL IIC_INIT

  227. LCALL IIC_START

  228. MOV A, IICNUM

  229. LCALL IIC_WRITE_BYTE

  230. ;LCALL IIC_WRITE_ACK

  231. LCALL IIC_ACK

  232. JC IIC_WRITE

  233. MOV A, IICADD

  234. LCALL IIC_WRITE_BYTE
  235. ;LCALL IIC_WRITE_ACK

  236. LCALL IIC_ACK

  237. JC IIC_WRITE

  238. MOV A, IICDAT

  239. LCALL IIC_WRITE_BYTE

  240. ;LCALL IIC_WRITE_ACK

  241. LCALL IIC_ACK

  242. JC IIC_WRITE

  243. LCALL IIC_STOP

  244. RET

  245. IIC_READ:
  246. ;LCALL IIC_INIT

  247. LCALL IIC_START

  248. MOV A, IICNUM

  249. LCALL IIC_WRITE_BYTE

  250. ;LCALL IIC_WRITE_ACK

  251. LCALL IIC_ACK

  252. JC IIC_READ

  253. MOV A, IICADD

  254. LCALL IIC_WRITE_BYTE

  255. ;LCALL IIC_WRITE_ACK

  256. LCALL IIC_ACK

  257. JC IIC_READ


  258. ;RESTART

  259. LCALL IIC_START

  260. MOV A, IICNUM

  261. ORL A, #01H

  262. LCALL IIC_WRITE_BYTE

  263. ;LCALL IIC_WRITE_ACK

  264. LCALL IIC_ACK

  265. JC IIC_READ

  266. LCALL IIC_READ_BYTE

  267. ;LCALL IIC_READ_ACK

  268. MOV IICDAT, A

  269. LCALL IIC_STOP

  270. RET


  271. ;IIC_INIT:

  272. ; SETB SDA

  273. ; SETB SCL

  274. ; NOP

  275. ; RET

  276. ;=====================================================

  277. IIC_START:

  278. SETB SDA

  279. NOP

  280. SETB SCL

  281. NOP

  282. NOP

  283. NOP

  284. NOP

  285. NOP

  286. CLR SDA

  287. NOP

  288. NOP

  289. NOP

  290. NOP

  291. NOP

  292. CLR SCL

  293. RET

  294. ;=====================================================

  295. IIC_STOP:

  296. CLR SDA

  297. NOP

  298. SETB SCL

  299. NOP

  300. NOP

  301. NOP

  302. NOP

  303. NOP

  304. SETB SDA

  305. NOP

  306. NOP

  307. NOP

  308. NOP

  309. NOP

  310. RET

  311. ;=====================================================

  312. IIC_WRITE_BYTE:
  313. MOV B, #08H

  314. IIC_WRITE_BYTE0:

  315. RLC A

  316. MOV SDA, C

  317. NOP

  318. SETB SCL

  319. NOP

  320. NOP

  321. NOP

  322. NOP

  323. NOP

  324. CLR SCL

  325. NOP

  326. DJNZ B, IIC_WRITE_BYTE0

  327. RET

  328. ;====================================================

  329. IIC_READ_BYTE:

  330. MOV B, #08H
  331. CLR A

  332. SETB SDA

  333. NOP

  334. IIC_READ_BYTE0:

  335. SETB SCL

  336. NOP

  337. NOP

  338. NOP

  339. NOP

  340. NOP

  341. MOV C, SDA

  342. RLC A

  343. CLR SCL

  344. NOP

  345. NOP

  346. NOP

  347. NOP

  348. NOP

  349. DJNZ B, IIC_READ_BYTE0

  350. RET

  351. ;====================================================

  352. MOV B, #0FFH

  353. IIC_WRITE_ACK:
  354. SETB SDA

  355. SETB SCL

  356. NOP

  357. JB SDA, DEL_ACK

  358. CLR SCL

  359. NOP

  360. RET

  361. ;=============================

  362. DEL_ACK:

  363. DJNZ B, $

  364. CLR SCL

  365. NOP

  366. RET

  367. ;====================================================

  368. IIC_READ_ACK:

  369. CLR SCL

  370. NOP

  371. CLR SDA

  372. NOP

  373. SETB SCL

  374. NOP

  375. RET

  376. ;=====================================================

  377. IIC_ACK: SETB SDA

  378. NOP

  379. NOP

  380. SETB SCL

  381. NOP

  382. NOP

  383. NOP

  384. JB SDA,IIC_ACK0

  385. CLR C

  386. SJMP IIC_ACK_END

  387. IIC_ACK0: SETB C

  388. SJMP IIC_ACK_END

  389. IIC_ACK_END: CLR SCL

  390. RET

  391. ;=====================================================

  392. ;DPTR

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

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

  395. ;=====================================================

  396. SHOW_CHINESE:

  397. MOV A, R6

  398. MOVC A, @A+DPTR

  399. LCALL WRITE_DATA

  400. LCALL DEL0

  401. INC DPTR

  402. DJNZ R7, SHOW_CHINESE

  403. LCALL DEL0

  404. RET

  405. ;=====================================================


  406. WORD_1:

  407. DB "星期"

  408. WORD_2:

  409. DB "一二三四五六日"




  410. END


NE5532 发表于 2012-9-6 22:00 | 显示全部楼层
能研究混合编程的人,这样的问题不应该拿来问。混合编程的重点是弄清C语言形参传递的接口格式,其他觉得不对的地方,可以看List文件或者反汇编文件来解决。
阿南 发表于 2012-9-6 22:00 | 显示全部楼层
楼主在调试环境中,切换到混合模式,查看反汇编的代码可以知道是否有按预期的方式调用。或者在调试状态下单步跟踪。
 楼主| 651927693 发表于 2012-9-7 15:09 | 显示全部楼层
我查看了反汇编的代码,发现其实我写的汇编程序并没有被调用,可是为什么呢
 楼主| 651927693 发表于 2012-9-7 16:22 | 显示全部楼层
本帖最后由 651927693 于 2012-9-7 16:27 编辑


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 651927693 发表于 2012-9-7 16:28 | 显示全部楼层
但是为什么呢
NE5532 发表于 2012-9-7 20:47 | 显示全部楼层
你启动代码都没添加??
 楼主| 651927693 发表于 2012-9-8 07:44 | 显示全部楼层
没有的,但是可以运行啊。
sedatefire 发表于 2012-9-8 13:13 | 显示全部楼层
除了寄存器的传参规则外
在51中,很容易出错的是bank
NOARGES的道理去了解下
 楼主| 651927693 发表于 2012-9-8 19:46 | 显示全部楼层
除了寄存器的传参规则外
在51中,很容易出错的是bank
NOARGES的道理去了解下
sedatefire 发表于 2012-9-8 13:13

说实话,我完全没懂您的意思
 楼主| 651927693 发表于 2012-9-8 19:51 | 显示全部楼层
而且,又出现了新的问题。
之前我将整个汇编程序写成一个函数用C调用,是可以看到运行结果的。
不过现在当我将这个汇编程序在分为几个子程序用C调用时, LCD却没有显示了
eydj2008 发表于 2012-9-8 20:24 | 显示全部楼层
C 里面汇汇函数 都没有 在C里面加入汇编 51 需要加关键字 #program
都没有看到 而且还要设置属性 你也没讲 就直接混合了。。。。
 楼主| 651927693 发表于 2012-9-8 20:50 | 显示全部楼层
C 里面汇汇函数 都没有 在C里面加入汇编 51 需要加关键字 #program
都没有看到 而且还要设置属性 你也没讲 就直接混合了。。。。
eydj2008 发表于 2012-9-8 20:24

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
eydj2008 发表于 2012-9-8 23:35 | 显示全部楼层
对的

你不用弄那么复杂 表达架构就可以了 51 就是这样调用
 楼主| 651927693 发表于 2012-9-9 15:24 | 显示全部楼层
可问题是,LCD上没有显示啊
初入江湖 发表于 2012-10-10 21:06 | 显示全部楼层
sedatefire 发表于 2012-10-10 23:08 | 显示全部楼层
偶滴妈呀,汇编,好懒得看啊
 楼主| 651927693 发表于 2012-10-12 11:28 | 显示全部楼层
汇编对于像我这样的新手还是有好处的
wuzx-61 发表于 2012-12-20 21:51 | 显示全部楼层
俺也学混编,几次也是不成功.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

544

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部