nancy122109 2018-12-21 14:13 采纳率: 0%
浏览 703
已结题

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

#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条回答 默认 最新

  • devmiao 2018-12-21 15:43
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)