人气不盛,资料不足,各位多来支持啊

来源:互联网 发布:阿里云怎么套网站模板 编辑:程序博客网 时间:2024/04/27 18:02

#include <reg51.H>
#include <absacc.H>
#include <stdio.h>

#define LCD_COMMAND 0x9000
#define LCD_DATA_R  0x9C00
#define LCD_DATA_W  0x9400
#define DA_ADDRESS  0xC000
#define AD_ADDRESS  0xA000
/*-------------------------LCD  驱动部分函数声明----------------------------*/
void DelayL();
void DelayS();
void WriteCommand(unsigned char c);
void WriteData(unsigned char c);
unsigned char ReadData();
void ShowChar(unsigned char pos,unsigned char c);
void ShowString(unsigned char line,char *ptr);
void InitLcd();
void InitInterupt();
/*----------------------------全局变量--------------------------------------*/
static unsigned char flag1;           //启动功能标志
static unsigned char flag2;           //功能号标志
static unsigned int  address;         //RAM地址
static unsigned char chip;            //RAM片选
static unsigned char intflag;          //中断标志
static unsigned int  count;           //串行数据计数

void main (void) {
char code str1[] =" Designed by HGR                ";
char code str2[] ="   2002-8-26                    ";     
char code Menu[] ="    Menu Item   ";
char code Item[] ="1 Sample voice  2  Play sound   3 Download data 4  Upload data  ";   
char data str3[] ="                ";
  unsigned char i,j;
    
     SP=0x50;       //堆栈指针
     DelayL();
  InitLcd();                //初始化LCD
  DelayL();
     ShowString(0,str1);       //显示启动屏幕
  ShowString(1,str2);
  DelayL();
     DelayL();
  DelayL();
  DelayL();
     for(i=0;i<17;i++)         //字幕滚动
  {
    ShowString(0,str1+i);
    ShowString(1,str2+i);
    for(j=0;j<120;j++)
       DelayS();
  }
     InitInterupt();            //初始化中断设置

  flag1=0;                   //功能启动标志置0
  flag2=0;                   //功能号置0
  chip=0;                    //RAM片选置0
  address=0;                 //RAM地址置0
  intflag=0;                 //中断标志置0
     count  =0;                 //下载计数置0
  P1=chip;                   //写RAM片选
enter:
     if(flag1==0)               //未启动任何功能
     {
    ShowString(0,Menu);            //第一行显示Menu头
    ShowString(1,Item+flag2*16);   //第二行显示功能项
  }
     else                       //已经启动功能
  {
    ShowString(0,Item+flag2*16);   //第一行显示功能项
       switch(flag2)                  //第二行显示对应操作界面
       {
        case 0:       //功能0,显示正在采样
          sprintf(str3,"Now sampling..  ");
    break;
     case 1:
    sprintf(str3,"Now playing..   "); //功能1,显示正在播放
    break;
        case 2:       //功能2,显示下载计数
          sprintf(str3,"down %d bytes   ",count);
          break;
        case 3:       //功能3,上传RAM数据
          while(1)
          {
          SBUF=XBYTE[address++];   //读取RAM数据发送,地址自加
          while(!TI);
          TI=0;
          count++;
      if(address==0x8000)    //到了RAM片内最大地址
    {
        address=0;     //片内地址复0
            chip=chip+1;     //片选加1
      P1=chip;     //选通RAM
      if(chip==32)    //到达RAM最大容量
            {
              chip=0;     //片选复0
              flag1=0;         //功能关闭
              goto enter;     //返回显示上级菜单
            }
    } 
          sprintf(str3,"up %d bytes     ",count);
          }
          break;
        default:
          break;
    }
    ShowString(1,str3);
  }
  while(!intflag);      //等待中断触发
  intflag=0;       //中断标志复0
  goto enter;      //返回修改菜单显示
}

/*-----------------------------中断处理-------------------------------------*/
Int0_process() interrupt 0 using 0    //外部中断0,对应1键
{
  EA=0;
  DelayL();

  if(flag1==0)                //若功能未启动,则功能号加1
  {
     flag2++;
  flag2=flag2%4;      //达到最大,则功能号复0
  }
  else                       //功能已启动则该键为关闭功能
  {
     flag1=0;
     TR0=0;       //关闭定时、复位RAM地址
  chip=0;
  address=0;
  count=0;    
  }
 
  EA=1;
  intflag=1;
}

Int1_process() interrupt 2 using 0    //外部中断1,对应2键
{
  char code blank[]="                ";
  EA=0;
  DelayL();

  if(flag1==0)       //若功能未启动,则2键启动该功能
  {
    flag1=1;
    ShowString(1,blank);
    if(flag2==0||flag2==1)     //功能号为0、1,则开启定时
      TR0=1;
  }

  EA=1;
  intflag=1;
}

Timer0_process() interrupt 1 using 0   //定时中断,开启功能0、1时启动
{
  unsigned char c;
  EA=0;
  TR0=0;        //先关闭定时
  TL0=0x80;       //重新设置定时参数
  TH0=0xFB; 

  if(flag2==0)       //如果为功能0,则采样存入RAM
  {
    XBYTE[AD_ADDRESS]=0;    //启动AD转换
    while(P1&0x80);      //等待转换完成
    c=XBYTE[AD_ADDRESS];    //读取采样数据
    XBYTE[address++]=c;     //存入RAM
  }
  else        //否则为播放声音
  {
    c=XBYTE[address++];     //读取RAM数据
    XBYTE[DA_ADDRESS]=c;    //写DA
  }

  if(address==0x8000)      //RAM地址处理
  {
    address=0;
    chip=chip+1;
    P1=chip;
  } 
  if(chip==32)       //若到达RAM最大地址,则结束功能
  {
     chip=0;
     flag1=0;
  }
  else         //否则,重新开始定时
     TR0=1;

  EA=1;
  intflag=1;
}

Rs232() interrupt 4 using 0     //串行接受中断
{
 unsigned char c; 
 EA=0;
 c=SBUF;
 RI=0;

 if(flag1==1)                //若功能已经开启
 {
   if(flag2==2)       //若功能号为2(下载)
   {
     XBYTE[address++]=c;    //写入RAM
     count++;       //计数加1
   }   
   if(address==0x8000)     //RAM地址处理
   {
     chip=chip+1;
     address=0;
     P1=chip;
     if(chip==32)
     {
       chip=0;
       flag1=0;
     }
   } 
 }
 EA=1;
 intflag=1;
}

void InitInterupt()
{
  TMOD=0x21;            //初始化串口和定时器设置
  TL1=0xFD;       
  TH1=0xFD;
  EA=1;   
  ES=1;
  PCON=0;   
  TR1=1;
  SCON=0x50;

  EX0=1;                //外部中断0初始化
  IT0=1;
  EX1=1;                //外部中断0初始化
  IT1=1;

  TL0=0x80;             //定时125us
  TH0=0xFB; 

  ET0=1;
}

/*--------------------------------
void DelayL()                    
{unsigned char i,j;
 i=0xA0;
 j=0xFF;
 while(i--)
  while(j--);
}

void DelayS()              
{unsigned char i;
 i=0x1F;
 while(i--);
}

void WriteCommand(unsigned char c)     
{
 DelayS();
 XBYTE[LCD_COMMAND]=c; 
}

void WriteData(unsigned char c)        
{
  DelayS();
  XBYTE[LCD_DATA_W]=c; 
}

void ShowChar(unsigned char pos,unsigned char c)
{
 unsigned char p;
 if(pos>=0x10)
    p=pos+0xB0;
 else
    p=pos+0x80;
 WriteCommand(p);
 WriteData(c);
}

void ShowString(unsigned char line,char *ptr)
{
 unsigned char l,i;
 l=line<<4;
 for(i=0;i<16;i++)
   ShowChar(l++,*(ptr+i));
}    

void InitLcd()
{
 DelayL();
 WriteCommand(0x38);
 WriteCommand(0x38);
 WriteCommand(0x06);
 WriteCommand(0x0C);
 WriteCommand(0x01);
 WriteCommand(0x80);
}    

unsigned char ReadData()    
{
 unsigned char i;
 DelayS();    
 P0=0xFF;
 i=XBYTE[LCD_DATA_R];
 return i;
}

原创粉丝点击