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