📄 main.lst
字号:
+1 633 ; if ( c == '-' )
009E BE2D02 +1 634 CJNE R6, #'-', DispChar_elseif
+1 635 ; {
+1 636 ; DispBuf[x] = 0x40;
+1 637 ; }
00A1 8019 +1 638 SJMP DispChar_endif
+1 639 ; else if ( ( c >= '0' ) && ( c <= '9' ) )
00A3 +1 640 DispChar_elseif:
+1 641 BLO R6, #'0', DispChar_endif ;宏BLO的定义见Branch.INC
+1 646 BHI R6, #'9', DispChar_endif ;宏BHI的定义见Branch.INC
+1 651 ; {
+1 652 ; DispBuf[x] = Tab[c-'0'];
00AF 7430 +1 653 MOV A, #DispBuf
00B1 2F +1 654 ADD A, R7
00B2 F8 +1 655 MOV R0, A
00B3 EE +1 656 MOV A, R6
00B4 C3 +1 657 CLR C
00B5 9430 +1 658 SUBB A, #'0'
00B7 9000BD +1 659 MOV DPTR, #DispChar_Tab
A51 MACRO ASSEMBLER MAIN 06/23/2006 11:55:35 PAGE 11
00BA 93 +1 660 MOVC A, @A+DPTR
00BB F6 +1 661 MOV @R0, A
+1 662 ; }
00BC +1 663 DispChar_endif:
+1 664 ;}
00BC 22 +1 665 RET
00BD +1 666 DispChar_Tab:
+1 667 ; 0123456789的数码管字型数据
00BD 3F065B4F +1 668 DB 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
00C1 666D7D07
00C5 7F6F
+1 669
+1 670
+1 671 ;*************************************************************************
+1 672 ;函数:DispStr()
+1 673 ;功能:在数码管上显示字符串
+1 674 ;参数:
+1 675 ; x:数码管的坐标位置(0~7)
+1 676 ; *s:要显示的字符串(字符仅限十进制数字和减号)
+1 677 ;*************************************************************************
+1 678 ;void DispStr(unsigned char x, unsigned char *s)
+1 679 ;x = R7
+1 680 ;*s = (0x08,0x09,0x0A)
00C7 +1 681 DispStr:
+1 682 ;{
00C7 C002 +1 683 PUSH 0x02
00C9 C003 +1 684 PUSH 0x03
00CB C006 +1 685 PUSH 0x06
+1 686 ; unsigned char c;
+1 687 ; 指定:c = R3
00CD EF +1 688 MOV A, R7
00CE FA +1 689 MOV R2, A
+1 690 ; for (;;)
00CF +1 691 DispStr_for:
+1 692 ; {
+1 693 ; c = *s;
00CF A908 +1 694 MOV R1, 0x08
00D1 850983 +1 695 MOV DPH, 0x09
00D4 850A82 +1 696 MOV DPL, 0x0A
00D7 12001E +1 697 LCALL BytePtrLD
00DA FB +1 698 MOV R3, A
+1 699 ; if ( c == '\0' ) break;
00DB 6012 +1 700 JZ DispStr_endfor
+1 701 ; s++;
+1 702 INC_W 0x09, 0x0A
+1 708 ; DispChar(x,c);
00E5 EB +1 709 MOV A, R3
00E6 FE +1 710 MOV R6, A
00E7 EA +1 711 MOV A, R2
00E8 FF +1 712 MOV R7, A
00E9 120097 +1 713 LCALL DispChar
+1 714 ; x++;
00EC 0A +1 715 INC R2
+1 716 ; }
00ED 80E0 +1 717 SJMP DispStr_for
00EF +1 718 DispStr_endfor:
00EF D006 +1 719 POP 0x06
00F1 D003 +1 720 POP 0x03
00F3 D002 +1 721 POP 0x02
+1 722 ;}
00F5 22 +1 723 RET
+1 724
+1 725
+1 726 ;*************************************************************************
+1 727 ;函数:DispDotOn()
+1 728 ;功能:显示指定位的小数点
A51 MACRO ASSEMBLER MAIN 06/23/2006 11:55:35 PAGE 12
+1 729 ;参数:x为数码管坐标
+1 730 ;*************************************************************************
+1 731 ;void DispDotOn(unsigned char x)
+1 732 ;x = R7
00F6 +1 733 DispDotOn:
+1 734 ;{
+1 735 ; DispBuf[7-x] |= 0x80;
00F6 7407 +1 736 MOV A, #7
00F8 C3 +1 737 CLR C
00F9 9F +1 738 SUBB A, R7
00FA 2430 +1 739 ADD A, #DispBuf
00FC F8 +1 740 MOV R0, A
00FD E6 +1 741 MOV A, @R0
00FE 4480 +1 742 ORL A, #0x80
0100 F6 +1 743 MOV @R0, A
+1 744 ;}
0101 22 +1 745 RET
+1 746
+1 747
+1 748 ;*************************************************************************
+1 749 ;函数:DispInit()
+1 750 ;功能:数码管扫描显示初始化
+1 751 ;*************************************************************************
+1 752 ;void DispInit()
0102 +1 753 DispInit:
+1 754 ;{
+1 755 ; DispClear();
0102 12008D +1 756 LCALL DispClear
+1 757 ; EA = 0;
+1 758 ; TMOD &= 0x0F;
+1 759 ; TMOD |= 0x10;
+1 760 ; TH1 = 0xFC;
+1 761 ; TL1 = 0x66;
+1 762 ; TR1 = 1;
+1 763 ; ET1 = 1;
+1 764 ; EA = 1;
0105 C2AF +1 765 CLR EA
0107 53890F +1 766 ANL TMOD, #0x0F
010A 438910 +1 767 ORL TMOD, #0x10
010D 758DFC +1 768 MOV TH1, #0xFC
0110 758B66 +1 769 MOV TL1, #0x66
0113 D28E +1 770 SETB TR1
0115 D2AB +1 771 SETB ET1
0117 D2AF +1 772 SETB EA
+1 773 ;}
0119 22 +1 774 RET
+1 775
776 ;$include (I2C.INC) ;I2C总线驱动程序
+1 777 ;*************************************************************************
+1 778 ; I2C.INC
+1 779 ; 标准80C51单片机模拟I2C总线的主机程序头文件
+1 780 ; Copyright (c) 2006,广州周立功单片机发展有限公司
+1 781 ; All rights reserved.
+1 782 ; 本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的
+1 783 ;*************************************************************************
+1 784
+1 785
+1 786 ;*************************************************************************
+1 787 ;模拟I2C总线的引脚定义
+1 788 ;*************************************************************************
00B4 +1 789 I2C_SCL BIT P3.4
00B5 +1 790 I2C_SDA BIT P3.5
+1 791
+1 792
+1 793 ;*************************************************************************
+1 794 ;定义I2C总线时钟的延时值,要根据实际情况修改,取值1~255
A51 MACRO ASSEMBLER MAIN 06/23/2006 11:55:35 PAGE 13
+1 795 ;SCL信号周期约为(I2C_DELAY_VALUE*4+12)个机器周期
+1 796 ;*************************************************************************
0005 +1 797 I2C_DELAY_VALUE EQU 5
+1 798
+1 799
+1 800 ;*************************************************************************
+1 801 ;定义I2C总线停止后在下一次开始之前的等待时间,取值1~65535
+1 802 ;等待时间约为(I2C_STOP_WAIT_VALUE*8)个机器周期
+1 803 ;对于多数器件取值为1即可;但对于某些器件来说,较长的延时是必须的
+1 804 ;*************************************************************************
0001 +1 805 I2C_STOP_WAIT_VALUE EQU 1
+1 806
+1 807
+1 808 ;*************************************************************************
+1 809 ;定义延时变量,用于宏I2C_Delay()
+1 810 ;*************************************************************************
+1 811 ;unsigned char data I2C_Delay_t;
0039 +1 812 I2C_Delay_t DATA GLOBAL_IRAM ;在主文件里要用SET定义GLOBAL_IRAM的初值
003A +1 813 GLOBAL_IRAM SET GLOBAL_IRAM+1
+1 814
+1 815
+1 816 ;*************************************************************************
+1 817 ;宏定义:I2C_Delay
+1 818 ;功能:延时,模拟I2C总线专用
+1 819 ;*************************************************************************
+1 820 I2C_Delay MACRO
+1 821 MOV I2C_Delay_t, #I2C_DELAY_VALUE
+1 822 DJNZ I2C_Delay_t, $
+1 823 ENDM
+1 824
+1 825
+1 826 ;*************************************************************************
+1 827 ;函数:I2C_Init()
+1 828 ;功能:I2C总线初始化,使总线处于空闲状态
+1 829 ;说明:在main()函数的开始处,通常应当要执行一次本函数
+1 830 ;*************************************************************************
+1 831 ;void I2C_Init()
011A +1 832 I2C_Init:
+1 833 ;{
+1 834 ; I2C_SCL = 1;
+1 835 ; I2C_Delay();
+1 836 ; I2C_SDA = 1;
+1 837 ; I2C_Delay();
011A D2B4 +1 838 SETB I2C_SCL
+1 839 I2C_Delay
0122 D2B5 +1 842 SETB I2C_SDA
+1 843 I2C_Delay
+1 846 ;}
012A 22 +1 847 RET
+1 848
+1 849
+1 850 ;*************************************************************************
+1 851 ;函数:I2C_Start()
+1 852 ;功能:产生I2C总线的起始状态
+1 853 ;说明:
+1 854 ; SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
+1 855 ; 不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态
+1 856 ; 本函数也可以用来产生重复起始状态
+1 857 ; 本函数执行后,I2C总线处于忙状态
+1 858 ;*************************************************************************
+1 859 ;void I2C_Start()
+1 860 ;{
012B +1 861 I2C_Start:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -