nancy122109
nancy122109
2018-12-21 14:13

初学单片机,C语言与汇编语言混编希望大神能帮我详细的分析一下这个程序,尤其是XTYPE[DAC+1]=i?

20
  • c语言

#include
#include
#define uchar unsigned char //定义新的变量类型
#define uint unsigned int
#define DAC 0xCFB0 //宏定义
uchar code sin[]={0x7f,0x89,0x94,0x9f,0xaa,0xb4,0xbe,0xc8,0xd1,
0xd9,0xe0,0xe7,0xed,0xf2,0xf7,0xfa,0xfc,0xfe,0xff};
uchar code SEG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

uchar a;
void Init() //8279初始化
{
XBYTE[0xCFE9]=0x00; //设置8279工作方式,左边输入双键锁定

XBYTE[0xCFE9]=0xD1; //8279命令字,显示RAM及FIF0 RAM全部清除
while (XBYTE[0xCFE9]&0x80);//判断是否清除完,清除完while里面为0,执行下一条语句
XBYTE[0xCFE8]=0x34; }

uchar ReadKey() //键盘读值
{
if(XBYTE[0xCFE9]&0x07) //指导书p92页状态字读出地址与命令口地址相同,0x07是取命令字后三位,即数据个数
//键盘扫描 判断是否按下

{
XBYTE[0xCFE9]=0x40; //读键值
a=XBYTE[0xCFE8]; //将键值赋给a
}
return 0;
}

void display(uchar y) //显示
{
XBYTE[0xCFE9]=0x80; //七段数码管的第一个LED点亮
XBYTE[0xCFE8]=SEG[y]; //在七段数码管的第一个LED上输出按键所对应的键值
}
void delay() //延时
{
uchar i;
for(i=0;i<0xa0;i++);

}

void sanjiaobo() //三角波
{
uchar i=0;
XBYTE[DAC]=i;

XBYTE[DAC+1]=I;

do
{
XBYTE[DAC]=i;
XBYTE[DAC+1]=i;
i++;
}while(i do
{
XBYTE[DAC]=i;
XBYTE[DAC+1]=i;
i--;
}while(i>0x0); //当i>0的时候,输出三角波的下降沿

}

void juchibo() //锯齿波
{
uchar i=0;
while(a==4)

{
    XBYTE[DAC]=i++;
     XBYTE[DAC+1]=i++;//输出i的累加值,当i累加到ff时自动跳为0
     ReadKey();                 //读取键值
}

}

void fangbo() //方波
{
XBYTE[DAC]=0x00;
XBYTE[DAC+1]=0x00; //先持续输出低电平
delay(); //延迟之后
XBYTE[DAC]=0xff;
XBYTE[DAC+1]=0xff; //再持续输出低电平
delay();

}

void sinbo() //正弦波
{
uchar i;
for(i=0;i {
XBYTE[DAC]=sin [i];
XBYTE[DAC+1]=sin [i];//i }
for(i=18;i>0;i--)
{
XBYTE[DAC]=sin [i];
XBYTE[DAC+1]=sin [i];//0 }
for(i=0;i {
XBYTE[DAC]=~sin [i];
XBYTE[DAC+1]=~sin [i];//i }
for(i=18;i>0;i--)
{
XBYTE[DAC]=~sin [i];
XBYTE[DAC+1]=~sin [i];//0<i<18时,输出sin负半轴的上升沿
}
}

void main()
{
Init(); //8279初始化
display(0); //显示数字0
EX0=1; //允许外部中断0
IT0=1; //设置INT0程控为跳沿触发方式
EA=1; //允许总中断0
while(1)
{
if(XBYTE[0xCFE9]&0x07)
{
ReadKey(); //读取行列值
a=a-192;

display(a);
delay();

switch (a)
{
case 1: while(!(XBYTE[0xCFE9]&0x07)) sinbo();

break;
case 2: while (!(XBYTE[0xCFE9]&0x07)) sanjiaobo();
//键盘扫描 判断是否按下,如果此时按下为2,判断是否又有按键按下,若没有,循环输//出三角波,若有,跳出while循环,跳出switch
break;
case 3: while(!(XBYTE[0xCFE9]&0x07)) fangbo();
break;
case 4: while(!(XBYTE[0xCFE9]&0x07)) juchibo();
break;
}
}
}
}

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

2条回答