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

#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;
}
}
}
}

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

2
初学matlab,求matlab大神帮我解读下以下代码,希望逐条解答,我按照最高的奖励给,谢谢各位!
3
请大家帮帮萌新 为什么C语言运行中文会乱码?
3
初学C语言,为什么这个x值是全局变量的1,而不是main函数里的5?
1
c++逆向,有没有靠谱的视频教程,求老司机推荐!
1
刚刚初学C# 这几个问题有人能帮我解决一下吗 我想看看代码什么样子的
4
刚刚初学C# 这几个问题有人能帮我解决一下吗
6
Java初学者的一些小问题,求解各位大神
2
用指针方法对10个整数按由小到大顺序排列(冒泡排序法),我的代码哪错了,谢谢,求解答? 初学C语言,谅解
2
需要做一个给予粒子群算法的火电机组负荷优化分配研究大作业,用MATLAB实现,请问有大神吗?
0
为何DOSbox下的debug中 e 命令 无效?
1
用c语言怎么写字符串的反转?
1
python初学安装tensorflow求帮助
1
用一个函数来实现将一行字符串中最长的单词输出?初学者,自己编的程序,求大神看看哪里有问题。c++
1
用一个函数来实现将一行字符串中最长的单词输出?初学者,自己编的程序,求大神看看哪里有问题。c++,不知道为什么头文件在这里显示不出来
2
有人帮看一下吗,为什么这边请求不到数据,是读取的代码不能写在run里面吗,初学者,轻喷,谁能解决,给80个币
3
初学c语言,可以评价一下我写的顺序表吗?
2
初学者js运行不了,各路神仙来帮帮忙
2
R语言中for循环与图片变量的问题
1
C语言链表文件题请大佬帮我看看这个怎么编
1
初学sql数据库,碰到一个问题求帮忙两个SQL语句