⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 14-1.c

📁 《单片机C语言编程与实例》的代码,这里面包含有很多常用的实例程序
💻 C
字号:
#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;
}

/*--------------------------------LCD驱动部分----------------------------*/
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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -