人气不盛,资料不足,各位多来支持啊
来源:互联网 发布:阿里云怎么套网站模板 编辑:程序博客网 时间: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;
}
- 人气不盛,资料不足,各位多来支持啊
- 好久不来,下个东西真难,如此下去,CSDN还有人气吗
- 新手刚来,各位多多帮忙啊
- CSDN下载不来资料的解决办法
- 感谢各位的支持!
- 人气
- 刚来这里还不知道怎么学习请各位大侠多多指教
- 求组救急啊,各位大大来帮忙啊
- 谁来帮帮我????......!!!!我急啊......谢谢各位!
- 请各位高手来帮帮忙!!!!!!!!
- 啊各位
- Eclipse快捷键总结,不足的请各位补上
- 新辰:网站的人气应该从哪里来?
- 我怎么下不下来资料啊
- 分页公用代码分享,只求人气不求利益!!!
- 各位"码农"朋友,多注意休息啊!
- 小女子从今天开始写博客,希望各位前辈多支持哈
- 小站刚刚开张,各位看官多多支持!
- ASP.NET 3.5 Extensions CTP发布
- (windows)python脚本:自动备份并压缩文件,同时删除过期文件
- 数据库实验(六)——转账事务
- PHP打包成EXE
- 防止用户外部提交表单
- 人气不盛,资料不足,各位多来支持啊
- ShowDialog和Show的区别
- [应用交流]Excel鲜为人知的35招秘技
- ASP.NET动态创建控件之绝境求生
- 关于在标题栏不触发WM_NCLBUTTONUP事件的替代方法(C#)
- 怎样制作.Net卸载程序?
- ajax开发详述
- VC的命名管道学习笔记总结
- 无效的 CurrentPageIndex 值。它必须大于等于 0 且小于 PageCount