/*-----------------------------------------------
名称:基于单片机的语音录放系统
编写:于吉刚
日期:2013.4
修改:无
内容:整个软件的C程序源代码
------------------------------------------------*/
//液晶驱动没加入呢
#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <intrins.h> //汇编函数指令
//#include "ISD4004_drive.h" //ISD4004语音芯片驱动
//#include "LCD_drive.h" //1602液晶驱动
sbit K1 = P3^4; //K1键 模式选择按键
sbit K2 = P3^5; //K2键 录音或放音按键,count增加
sbit K3 = P3^6; //K3键 录音或放音按键,count减少
sbit K4 = P3^7; //K4键 播放键
unsigned int keystate; //模式状态
unsigned char ovflog; //溢出声明
unsigned char disp_buf[8]={0}; //显示缓冲
unsigned char code line3_data[] = {"Recording Voice"}; //定义第一行显示的字符
unsigned char code line4_data[]= {"Num:"};
unsigned char code line5_data[] = {"Welcome yujigang"};
unsigned char code line6_data[] = {"Graduate Design"};
sbit BEEP=P1^0; //定义蜂鸣器
bit K1_FLAG=0; // 定义按键标志位,当按下K1时,该位置1,未按下时,该位为0
//unsigned char disp_buf_time[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //定义显示缓冲单元
unsigned char disp_buf1[2]={0x00,0x00}; //定义显示缓冲单元,并赋值
unsigned char code addh_tab[73]={00,00,01,01,01,01,01,01,01,01,01,01,01,01,01,01,01,
02,02,02,02,02,02,02,02,02,02,02,02,02,02,02,
03,03,03,03,03,03,03,03,03,03,03,03,03,03,03,
04,04,04,04,04,04,04,04,04,04,04,04,04,04,04,
05,05,05,05,05,05,05,05,05,05,05
};//ISD4004高位地址表
unsigned char code addl_tab[73]={00,22,00,07,14,21,28,35,42,49,56,63,70,77,84,91,98,
00,07,14,21,28,35,42,49,56,63,70,77,84,91,98,
00,07,14,21,28,35,42,49,56,63,70,77,84,91,98,
00,07,14,21,28,35,42,49,56,63,70,77,84,91,98,
00,07,14,21,28,35,42,49,56,63,70
};//ISD4004低位地址表
unsigned char count=1; //站计数器,初始值1
/*------------------------------------------------
函数声明
------------------------------------------------*/
void Delay_ms(unsigned int xms);
//void time_char_disp();
/*------------------------------------------------
液晶驱动程序
------------------------------------------------*/
//#include <reg52.h>
//#include <intrins.h>
sbit LCD_RS=P3^2;
sbit LCD_RW=P3^1 ;
sbit LCD_EN=P3^0;
void Delay_ms(unsigned int xms) ;
bit lcd_busy();
void lcd_wcmd(unsigned char cmd);
void lcd_wdat(unsigned char dat) ;
void lcd_clr() ;
void lcd_init() ;
/********LCD判忙函数********/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P2&0x80);
LCD_EN = 0;
return result;
}
/********写指令寄存器IR函数********/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P2 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}
/********写寄存器DR函数********/
void lcd_wdat(unsigned char dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P2 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}
/********LCD清屏函数********/
void lcd_clr()
{
lcd_wcmd(0x01); //清楚LCD显示内容
Delay_ms(5);
}
/********LCD初始化函数********/
void lcd_init()
{
Delay_ms(15); //等待LCD电源稳定
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
Delay_ms(5);
lcd_wcmd(0x38);
Delay_ms(5);
lcd_wcmd(0x38);
Delay_ms(5);
lcd_wcmd(0x0c); //显示开,关光标
Delay_ms(5);
lcd_wcmd(0x06); //移动光标
Delay_ms(5);
lcd_wcmd(0x01); //清楚LCD显示内容
Delay_ms(5);