微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > c语言汇编混合编程中遇到的问题

c语言汇编混合编程中遇到的问题

时间:10-02 整理:3721RD 点击:
想做一个万年历,底层的关于硬件的程序用汇编写好了,想用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.        
  32. MAIN:                                                        ;初始化时间,30-37H分别存放着时间的数据
  33.         MOV 30H, #00H                ;1/100s
  34.         MOV 31H, #00H                ;s
  35.         MOV 32H, #54H                ;min
  36.         MOV 33H, #08H                ;h
  37.         MOV 34H, #07H                ;day of week
  38.         MOV 35H, #08H                ;date
  39.         MOV 36H, #07H                ;month
  40.         MOV 37H, #12H                ;year
  41.        
  42.         ;CLR 7FH             //小时:分钟:秒 中的冒号显示与否的标志
  43.         ;============================================
  44.                                                 ;DS1388's initialization
  45.         SETB SCL
  46.         SETB SDA
  47.         CLR RST
  48.         NOP
  49.         SETB RST
  50.         NOP
  51.        
  52.         MOV IICNUM,#11010000B        //DS1388's address
  53.         MOV R0, #30H
  54.         MOV R1, #00H
  55.         MOV R2, #08H
  56. TIME_INIT:
  57.         MOV IICADD, R1
  58.         MOV IICDAT, @R0
  59.         LCALL IIC_WRITE
  60.         LCALL DEL0
  61.         INC R0
  62.         INC R1
  63.         DJNZ R2, TIME_INIT
  64.                  
  65. LCD_INIT:        CLR RES
  66.                 LCALL DEL0
  67.                 SETB RES
  68.                 LCALL DEL0
  69.                 SETB PSB
  70.                 LCALL DEL0
  71.                 MOV A,#30H
  72.                 LCALL WRITE_COM
  73.                 LCALL DEL0
  74.                 MOV A,#30H
  75.                 LCALL WRITE_COM
  76.                 LCALL DEL0
  77.                 MOV A,#0CH
  78.                 LCALL WRITE_COM
  79.                 LCALL DEL0
  80.                 MOV A,#01H
  81.                 LCALL WRITE_COM
  82.                 LCALL DEL0
  83.                 MOV A,#06H
  84.                 LCALL WRITE_COM
  85.                 LCALL DEL0
  86.                 ;LCD_INIT FINISHED
  87.                
  88.                

  89.        
  90.        
  91. SHOW:
  92. MOV R5, #0FFFFH
  93.         MOV R0, #30H                        //读出DS1388的时间
  94.         MOV R1, #00H
  95.         MOV R2, #08H       
  96. READTIME:
  97.         MOV IICADD, R1
  98.         LCALL IIC_READ
  99.         MOV @R0, IICDAT
  100.         INC R0
  101.         INC R1
  102.         DJNZ R2, READTIME
  103.         MOV A, #80H
  104.         LCALL WRITE_COM
  105.         LCALL DEL0
  106.         MOV A, 37H                                        //年份+"/"
  107.         LCALL NUMSHOW
  108.         MOV A, #2FH
  109.         LCALL WRITE_DATA
  110.         LCALL DEL0
  111.        
  112.         MOV A, 36H                                        //月份+"/"
  113.         LCALL NUMSHOW
  114.         MOV A, #2FH
  115.         LCALL WRITE_DATA
  116.         LCALL DEL0
  117.        
  118.         MOV A, 35H                                        //日期+"/"
  119.         LCALL NUMSHOW
  120.        
  121.         MOV A, #85H
  122.         LCALL WRITE_COM
  123.         LCALL DEL0
  124.        
  125.         MOV DPTR,#WORD_1
  126.         MOV R7, #4
  127.         MOV R6, #0
  128.         LCALL SHOW_CHINESE
  129.        
  130.         MOV DPTR, #WORD_2
  131.         MOV R7, #2
  132.         MOV R6,34H                                        //日期的数据传给R6
  133.         DEC R6                                                //减一是因为要从0开始数
  134.         MOV A, R6                                        //乘以2,因为每个汉字占两位
  135.         ADD A, R6
  136.         MOV R6, A
  137.         LCALL SHOW_CHINESE
  138.        
  139.         MOV A, #91H                                        //小时+":"
  140.         LCALL WRITE_COM
  141.         LCALL DEL0
  142.         MOV A, 33H
  143.         LCALL NUMSHOW
  144.         MOV A, #3AH
  145.         LCALL WRITE_DATA
  146.        
  147.         MOV A, 32H                                        //分钟+":"
  148.         LCALL NUMSHOW
  149.         MOV A, #3AH
  150.         LCALL WRITE_DATA
  151.        
  152.         MOV A, 31H                                        //秒
  153.         LCALL NUMSHOW
  154.        
  155.         DJNZ R5, SHOW
  156.        
  157.         RET
  158.        
  159. NUMSHOW:        MOV        B,A                                //十六进制数据转换为LCD可显示的ASCII码数据
  160.                 ANL        A,#0F0H
  161.                 SWAP        A
  162.                 ADD        A,#30H
  163.                 LCALL        WRITE_DATA
  164.                 LCALL        DEL0
  165.                 MOV        A,B
  166.                 ANL        A,#0FH
  167.                 ADD        A,#30H
  168.                 LCALL        WRITE_DATA
  169.                 LCALL        DEL0
  170.                 RET
  171. WRITE_COM:
  172.                 CLR RS
  173.                 LCALL DEL0
  174.                 CLR RW
  175.                 LCALL DEL0
  176.                 SETB EEE
  177.                 RLC A
  178.                 MOV 00H,C
  179.                 RLC A
  180.                 MOV 01H,C
  181.                 RLC A
  182.                 MOV 02H,C
  183.                 RLC A
  184.                 MOV 03H,C
  185.                 RLC A
  186.                 MOV 04H,C
  187.                 RLC A
  188.                 MOV 05H,C
  189.                 RLC A
  190.                 MOV 06H,C
  191.                 RLC A
  192.                 MOV 07H,C
  193.                 MOV A,20H
  194.                 MOV P0,A
  195.                 LCALL DEL0
  196.                 CLR EEE
  197.                 LCALL DEL0
  198.                 RET
  199. WRITE_DATA:
  200.                 SETB RS
  201.                 LCALL DEL0
  202.                 CLR RW
  203.                 LCALL DEL0
  204.                 SETB EEE
  205.                 RLC A
  206.                 MOV 00H,C
  207.                 RLC A
  208.                 MOV 01H,C
  209.                 RLC A
  210.                 MOV 02H,C
  211.                 RLC A
  212.                 MOV 03H,C
  213.                 RLC A
  214.                 MOV 04H,C
  215.                 RLC A
  216.                 MOV 05H,C
  217.                 RLC A
  218.                 MOV 06H,C
  219.                 RLC A
  220.                 MOV 07H,C
  221.                 MOV A,20H
  222.                 MOV P0,A
  223.                 LCALL DEL0
  224.                 CLR EEE
  225.                 LCALL DEL0
  226.                 RET
  227. ;;;;;;;;;;;延时程序;;;;;;;;;;;;;
  228. DEL0:MOV 20H,#2
  229. DEL1:MOV 21H,#2
  230. DEL2:MOV 22H,#25
  231.         DJNZ 22H,$
  232.         DJNZ 21H,DEL2
  233.         DJNZ 20H,DEL1
  234.         RET
  235. ;--------------------------------------------
  236. ;IIC总线(读,写操作)
  237. ;IIC_WRITE:
  238. ;IICNUM中存放要写入的元件的地址,IICADD中存放要写入的地址, IICDAT中存放要写入的数据
  239. ;IIC_READ:
  240. ;IICNUM中存放要读取的元件的地址,IICADD中存放要写入的地址, IICDAT中存放读取的数据                               
  241. ;Made by 651927693
  242. ;2012/08/08
  243. ;--------------------------------------------

  244. IIC_WRITE:                                               
  245.         ;LCALL IIC_INIT
  246.         LCALL IIC_START
  247.         MOV A, IICNUM
  248.         LCALL IIC_WRITE_BYTE
  249.         ;LCALL IIC_WRITE_ACK
  250.         LCALL IIC_ACK
  251.         JC IIC_WRITE
  252.         MOV A, IICADD
  253.         LCALL IIC_WRITE_BYTE
  254.         ;LCALL IIC_WRITE_ACK
  255.         LCALL IIC_ACK
  256.         JC IIC_WRITE
  257.         MOV A, IICDAT
  258.         LCALL IIC_WRITE_BYTE
  259.         ;LCALL IIC_WRITE_ACK
  260.         LCALL IIC_ACK
  261.         JC IIC_WRITE
  262.         LCALL IIC_STOP
  263.         RET
  264. IIC_READ:                                               
  265.         ;LCALL IIC_INIT
  266.         LCALL IIC_START
  267.         MOV A, IICNUM
  268.         LCALL IIC_WRITE_BYTE
  269.         ;LCALL IIC_WRITE_ACK
  270.         LCALL IIC_ACK
  271.         JC IIC_READ
  272.         MOV A, IICADD
  273.         LCALL IIC_WRITE_BYTE
  274.         ;LCALL IIC_WRITE_ACK
  275.         LCALL IIC_ACK
  276.         JC IIC_READ
  277.        
  278.                         ;RESTART
  279.         LCALL IIC_START
  280.         MOV A, IICNUM
  281.         ORL A, #01H
  282.         LCALL IIC_WRITE_BYTE
  283.         ;LCALL IIC_WRITE_ACK
  284.         LCALL IIC_ACK
  285.         JC IIC_READ
  286.         LCALL IIC_READ_BYTE
  287.         ;LCALL IIC_READ_ACK
  288.         MOV IICDAT, A
  289.         LCALL IIC_STOP
  290.         RET
  291.        
  292. ;IIC_INIT:
  293. ;        SETB SDA
  294. ;        SETB SCL
  295. ;        NOP
  296. ;        RET
  297. ;=====================================================
  298. IIC_START:
  299.         SETB SDA
  300.         NOP
  301.         SETB SCL
  302.         NOP
  303.         NOP
  304.         NOP
  305.         NOP
  306.         NOP
  307.         CLR SDA
  308.         NOP
  309.         NOP
  310.         NOP
  311.         NOP
  312.         NOP
  313.         CLR SCL
  314.         RET
  315. ;=====================================================
  316. IIC_STOP:
  317.         CLR SDA
  318.         NOP
  319.         SETB SCL
  320.         NOP
  321.         NOP
  322.         NOP
  323.         NOP
  324.         NOP
  325.         SETB SDA
  326.         NOP
  327.         NOP
  328.         NOP
  329.         NOP
  330.         NOP
  331.         RET
  332. ;=====================================================
  333. IIC_WRITE_BYTE:       
  334.         MOV B, #08H
  335.         IIC_WRITE_BYTE0:
  336.         RLC A
  337.         MOV SDA, C
  338.         NOP
  339.         SETB SCL
  340.         NOP
  341.         NOP
  342.         NOP
  343.         NOP
  344.         NOP
  345.         CLR SCL
  346.         NOP
  347.         DJNZ B, IIC_WRITE_BYTE0
  348.         RET
  349. ;====================================================
  350. IIC_READ_BYTE:
  351.         MOV B, #08H       
  352.         CLR A
  353.         SETB SDA
  354.         NOP
  355.         IIC_READ_BYTE0:
  356.         SETB SCL
  357.         NOP
  358.         NOP
  359.         NOP
  360.         NOP
  361.         NOP
  362.         MOV C, SDA
  363.         RLC A
  364.         CLR SCL
  365.         NOP
  366.         NOP
  367.         NOP
  368.         NOP
  369.         NOP
  370.         DJNZ B, IIC_READ_BYTE0
  371.         RET
  372. ;====================================================
  373.         MOV B, #0FFH
  374. IIC_WRITE_ACK:       
  375.         SETB SDA
  376.         SETB SCL
  377.         NOP
  378.         JB SDA, DEL_ACK
  379.         CLR SCL
  380.         NOP
  381.         RET
  382. ;=============================
  383. DEL_ACK:
  384.         DJNZ B, $
  385.         CLR SCL
  386.         NOP
  387.         RET
  388. ;====================================================
  389. IIC_READ_ACK:
  390.         CLR SCL
  391.         NOP
  392.         CLR SDA
  393.         NOP
  394.         SETB SCL
  395.         NOP
  396.         RET
  397. ;=====================================================
  398. IIC_ACK:        SETB        SDA
  399.                 NOP
  400.                 NOP
  401.                 SETB        SCL
  402.                 NOP
  403.                 NOP
  404.                 NOP
  405.                 JB        SDA,IIC_ACK0
  406.                 CLR        C
  407.                 SJMP        IIC_ACK_END
  408. IIC_ACK0:        SETB        C
  409.                 SJMP        IIC_ACK_END
  410. IIC_ACK_END:        CLR        SCL
  411.                 RET
  412. ;=====================================================
  413. ;DPTR
  414. ;R7表示要显示的汉字个数*2
  415. ;A表示从第几个汉字开始显示
  416. ;=====================================================
  417. SHOW_CHINESE:
  418.         MOV A, R6
  419.         MOVC A,  @A+DPTR
  420.         LCALL WRITE_DATA
  421.         LCALL DEL0
  422.         INC DPTR
  423.         DJNZ R7, SHOW_CHINESE
  424.         LCALL DEL0
  425.         RET
  426. ;=====================================================

  427. WORD_1:
  428.         DB "星期"
  429. WORD_2:
  430.         DB "一二三四五六日"
  431.        
  432.        
  433.        
  434.         END
  435.        
  436.        

复制代码

自己先顶一下

不用这么麻烦,直接用C语言都可以做了

主要是想用一下汇编。再说了,如果一开始就用C也就罢了,关键是现在用混合编程遇到麻烦了,所以就很想搞清楚嘛

再顶一下,大家帮帮忙啊

眼睛看花了。

不是,不用看我的全部程序。我写的时钟程序是正确的。只有上边的几行是有关混合编程的,可就是这几行,让我的程序无法运行,为什么呀

我查看了反汇编的结果,我之前写的汇编程序并没有被加到C程序中,怎么会这样呢

问题解决了,只是因为多添加了一个文件“Standard 8051 Code”,
有图有真相:


但还是没有搞清楚是为什么

大家帮忙分析一下呗

好吧,我失望了

问题还是没有解决,最后直接用汇编写完了整个程序

nice!~like it!nice!~like it!nice!~like it!nice!~like it!nice!~like it!nice!~like it!

你的伪指令错了,格式是?程序段?函数名?此模块的存盘文件名

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top