浅谈单片机中C语言与汇编语言的转换

做了一单片机设计,要用C语言与汇编语言同时实现,现将这次设计的感受和收获,还有遇到的问题写下,欢迎感兴趣的朋友交流想法,提出建议。

单片机设计:基于51单片机的99码表设计

软件环境:Proteus8.0 + Keil4

要求:1,开关按一下,数码管开始计时。2,按两下,数码管显示静止。3,按三下,数码管数值清零。

C语言程序如下:

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,aa,keycount=0,temp;
sbit anjian=P1^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void display(shi,ge);
void key ();
void init();
void delay(uint z);
/*-----主程序-----*/
void main()
{
    init();        //初始化
    while(1)
    {   
        key ();
        if(keycount==1)
        TR0=1;        //开中断
          if(keycount==2)
          TR0=0;
        if(keycount==3)
        {   
            temp=0;
            keycount=0;
        }
        if(aa==10){aa=0;
        if(temp<=99)
            {               
                temp++;display(shi,ge);
            }
            else
            temp=0;}
    }
}


/*------初始化程序-------*/
void init()
{   
    keycount=0;
    temp=0;
    TMOD=0x01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    EA=1;
    ET0=1;
    //TR0=0;       
}
/*-----定时器中断-----*/
void timer0() interrupt 1
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    aa++;   
}
/*-----显示子程序-----*/
void display(shi,ge)
{   
    shi=temp/10;
    ge=temp%10;
    P0=table[shi];;delay(70);
    P2=table[ge]; ;delay(70);
}
/*-----按键检测子程序-----*/
void key ()
{
    if(anjian==0)
    {
        delay(5);        //消抖
        if(anjian==0)
        keycount++;
    }
    //while(anjian==0);   
    //display(shi,ge);        //等待按键弹起
}
/*-----延时子程序-----*/
void delay(uint z)        //延时约1ms
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=100;y>0;y--);
}

电路仿真结果如下:

浅谈单片机中C语言与汇编语言的转换

好了,那么接下来我们就开始C语言——>汇编语言之旅^_^

(1)C语言1-10行改为

ORG        0000H      //汇编起始伪指令,功能是规定程序存储器中源程序或数据块存放的起始地址
ajmp        STAR    //ajmp无条件跳转指令
ORG        000bh
ajmp      timer0               
anjian        equ        P1.7    //位定义
keycount    equ      40h
shi            equ        41h
gewei        equ        42h
aa            equ        43h
temp        equ        44h
tab:        db          3fh,6h,5bh,4fh,66h      //建表
            db          6dh,7dh,7h,7fh,6fh

(2)C语言中的初始化函数 12-14行和39-49行改为

1 STAR: 2 acall init //子程序近程调用指令,功能是主程序调用子程序,调用子程序的范围为2kb

init:
    mov keycount,#0  //keycount=0
    mov temp,#0      //temp=1
    mov tmod,#01h      //TMOD=0x01
    mov TH0,#60
    mov TL0,#176
    setb EA  //位置位指令,对操作数所指出的位进行置1操作
    setb ET0
    setb TR0
    ret

acall为子程序近程调用指令,返回用ret。

(3)C语言中15-35行是个while循环,逻辑比较繁琐,注意了!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4d44d39645c5d497d2e6a8c672900322.html