📄 14-1.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 + -