?? 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 + -