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

📄 430_contest.c

📁 1024fft用MSP430设计的音频信号分析仪
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <msp430x14x.h>
#include <math.h>
#ifndef __FFT_N
#define __FFT_N

#define  FFT_N   128  //FFT序列总取样点数
#define  FFT_M   7   //使2^FFT_M = FFT_N
#define  HARM_M  64   //最高谐波次数
#endif

typedef         unsigned char   uchar ;
float wave_data[128];
//float temp[128];
#define		LCD_EN		BIT5

#define		LCD_RW		BIT4
#define		LCD_RS		BIT3
#define		LCD_CS1		BIT2
#define		LCD_CS2		BIT1
#define		LCD_RST		BIT0
#define Am  1.67 
float Bm = 1.5 ;

float fjgz=0;//方均根值
float ave=0;//平均值

unsigned char key_pressed , key_value , key_flag ;
int state ;
int p ;
int step ;
int x1 , x2 , y1 , y2 , dx , dy ;
int px1 , px2 , py1 , py2 ;
int qx1 , qx2 , qy1 , qy2 ;

__no_init float fft_r[FFT_N];   //保存变换后的频域实部
__no_init float fft_i[FFT_N];   //保存变换后的频域虚部
__no_init unsigned int harm[HARM_M+1]; //各次谐波幅值
float SD;   // 正弦失真度
float vmax ;  // AD采集最大值

//**********设置键盘逻辑键值与程序计算键值的映射*
unsigned char key_map[16] ={    
                           0,4,8,12,1,
                           5,9,13,2,6,
                           10,14,3,7,11,
                           15
                           };
//***********************************************

//供完成倒位序排列使用的位定义
const unsigned int FFT_BIT[11]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x0100,0x0200,0x0400};


//正弦函数表
const float Sinf[FFT_N]={
    0 ,0.0491, 0.0980,    0.1467 ,   0.1951,    0.2430,    0.2903,    0.3369  ,  0.3827   , 0.4276 ,   0.4714,    0.5141,
    0.5556 ,   0.5957,    0.6344,    0.6716,    0.7071,    0.7410,    0.7730,    0.8032  ,  0.8315 ,   0.8577  ,  0.8819 ,   0.9040,
    0.9239,    0.9415 ,   0.9569,    0.9700,    0.9808,    0.9892 ,   0.9952,    0.9988 ,   1.0000  ,  0.9988 ,   0.9952,    0.9892,
    0.9808,    0.9700 ,   0.9569  ,  0.9415  ,  0.9239,    0.9040 ,   0.8819  ,  0.8577 ,   0.8315 ,   0.8032,    0.7730  ,  0.7410, 
    0.7071 ,   0.6716,    0.6344 ,   0.5957  ,  0.5556  ,  0.5141   , 0.4714  ,  0.4276 ,   0.3827,    0.3369  ,  0.2903  ,  0.2430,
    0.1951 ,   0.1467  ,  0.0980  ,  0.0491  ,  0.0000 ,  -0.0491,   -0.0980  , -0.1467 ,  -0.1951  , -0.2430 ,  -0.2903,   -0.3369,
   -0.3827 ,  -0.4276  , -0.4714   ,-0.5141   ,-0.5556  , -0.5957 ,  -0.6344  , -0.6716   ,-0.7071   ,-0.7410 ,  -0.7730 ,  -0.8032,
   -0.8315,   -0.8577,   -0.8819 ,  -0.9040 ,  -0.9239 ,  -0.9415 ,  -0.9569  , -0.9700  , -0.9808  , -0.9892  , -0.9952   ,-0.9988,
   -1.0000 ,  -0.9988 ,  -0.9952 ,  -0.9892  , -0.9808 ,  -0.9700  , -0.9569   ,-0.9415   ,-0.9239,   -0.9040,   -0.8819 ,  -0.8577,
   -0.8315 ,  -0.8032,   -0.7730 ,  -0.7410 ,  -0.7071,   -0.6716 ,  -0.6344 ,  -0.5957 ,  -0.5556  , -0.5141  , -0.4714  , -0.4276,
   -0.3827 ,  -0.3369,   -0.2903,   -0.2430 ,  -0.1951  , -0.1467,   -0.0980 ,  -0.0491 
};

//**********点阵字库*****************************
const uchar feng[]={/* 点阵:16x16
   提取点阵方向:横向(先上->下, 再左->右)
   字节掉转:否
   字节方式:C语言 */
0x00,0xF0,0x00,0xFF,0x00,0xF0,0x90,0x88,    // 峰
0x4F,0x54,0xA4,0x54,0x4C,0xC4,0x40,0x00,
0x00,0x1F,0x10,0x0F,0x08,0x1F,0x00,0x14,
0x15,0x15,0xFF,0x15,0x15,0x14,0x00,0x00,
};

const uchar zhi[]={
0x80,0x40,0x20,0xF8,0x07,0x04,0xE4,0xA4,    // 值
0xA4,0xBF,0xA4,0xA4,0xF6,0x24,0x00,0x00,
0x00,0x00,0x00,0xFF,0x40,0x40,0x7F,0x4A,
0x4A,0x4A,0x4A,0x4A,0x7F,0x40,0x40,0x00,
};

const uchar fang[]={0x10,0x10,0x10,0x10,0x10,0xF1,0x92,0x96,    // 方
0x90,0x90,0x90,0xD0,0x90,0x18,0x10,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00,
};

const uchar jun[]={0x20,0x20,0x20,0xFF,0x20,0x20,0x40,0x30,    // 均
0x4F,0x88,0x08,0x08,0x08,0xFC,0x08,0x00,
0x10,0x30,0x10,0x1F,0x08,0x08,0x00,0x08,
0x18,0x04,0x42,0x81,0x40,0x3F,0x00,0x00,

};

const uchar gen[]={0x10,0x10,0xD0,0xFF,0x50,0x90,0x00,0xFE,    // 根
0x92,0x92,0x92,0x92,0xFF,0x02,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x01,0x00,0xFF,
0x40,0x23,0x0C,0x14,0x22,0x61,0x20,0x00,

};
const uchar yin[]={/*--  文字:  */
0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,    // 时
0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,
0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00,
} ;
const uchar pin[]={/*--  文字:   --*/
0x10,0x10,0xFF,0x10,0x10,0xC8,0x48,0x48,    // 域
0xE8,0x48,0xFF,0x08,0x0A,0x8C,0x08,0x00,
0x08,0x18,0x0F,0x04,0x24,0x27,0x14,0x94,
0x57,0x20,0x13,0x0C,0x32,0x41,0x70,0x00,
} ;
const uchar xin[]={/*--  文字:    --*/
0x40,0x7C,0x40,0xFF,0x48,0x6C,0x4A,0xF2,    // 频
0x12,0x1A,0xD6,0x12,0x12,0xFB,0x12,0x00,
0x08,0x87,0x40,0x2F,0x10,0x0F,0x80,0x8F,
0x40,0x20,0x1F,0x20,0x40,0xCF,0x00,0x00,
} ;
const uchar hao[]={/*--  文字:  号  --*/
0x40,0x40,0x40,0x5F,0xD1,0x51,0x51,0x51,0x51,0x51,0x51,0x5F,0x40,0x40,0x40,0x00,
0x00,0x00,0x00,0x02,0x07,0x02,0x02,0x22,0x42,0x82,0x42,0x3E,0x00,0x00,0x00,0x00
} ;
const uchar fen[]={/*--  文字:  分  --*/
0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,
0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00
} ;
const uchar xi[]={/*--  文字:  析  --*/
0x08,0x88,0x68,0xFF,0x48,0x88,0x00,0xFC,0x24,0x24,0x22,0xE2,0x22,0x22,0x20,0x00,
0x02,0x01,0x00,0xFF,0x00,0x41,0x30,0x0F,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00
} ;
const uchar yi[]={/*--  文字:  仪  --*/
0x40,0x20,0xF0,0x0C,0x03,0x00,0x38,0xC0,0x01,0x0E,0x04,0xE0,0x1C,0x00,0x00,0x00,
0x00,0x00,0xFF,0x00,0x40,0x40,0x20,0x10,0x0B,0x04,0x0B,0x10,0x20,0x60,0x20,0x00
} ;
const uchar nan[]={/*--  文字:  南  --*/
0x04,0x04,0xE4,0x24,0x24,0x64,0xB4,0x2F,0x24,0xA4,0x64,0x24,0x24,0xE6,0x04,0x00,
0x00,0x00,0x7F,0x04,0x05,0x05,0x05,0x7F,0x05,0x05,0x05,0x25,0x44,0x3F,0x00,0x00
} ;
const uchar jing[]={/*--  文字:  京  --*/
0x00,0x04,0x04,0xE4,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0xE4,0x06,0x04,0x00,0x00,
0x00,0x20,0x10,0x19,0x0D,0x41,0x81,0x7F,0x01,0x01,0x05,0x0D,0x38,0x10,0x00,0x00
} ;
const uchar hang[]={/*--  文字:  航  --*/
0x80,0x80,0xFC,0x96,0xA5,0xFC,0x00,0x08,0xE8,0x29,0x2A,0xE8,0x08,0x08,0x00,0x00,
0x80,0x60,0x1F,0x42,0x84,0x7F,0x80,0x60,0x1F,0x00,0x00,0x3F,0x40,0x40,0x70,0x00
} ;
const uchar kong[]={/*--  文字:  空  --*/
0x10,0x0C,0x84,0x44,0x24,0x14,0x05,0x06,0x04,0x14,0x24,0x44,0x84,0x14,0x0C,0x00,
0x00,0x40,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,0x00
} ;
const uchar tian[]={/*--  文字:  天  --*/
0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00,
0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00
} ;
const uchar da[]={/*--  文字:  大  --*/
0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00
} ;
const uchar xue[]={/*--  文字:  学  --*/
0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,
0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00
} ; 
const uchar num[10][16]={/*--  数字0~9  --*/
/*--  文字:  0  --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*--  文字:  1  --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*--  文字:  2  --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*--  文字:  3  --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  4  --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*--  文字:  5  --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  6  --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*--  文字:  7  --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*--  文字:  8  --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*--  文字:  9  --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00
} ;
const uchar point[]={/*--  文字:  .  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00
} ;
const uchar pu[]={/*--  文字:  谱  --*/
0x40,0x42,0xDC,0x08,0x44,0x54,0x65,0x7E,0x44,0x44,0x44,0x7E,0x65,0x54,0x44,0x00,
0x00,0x00,0x7F,0x20,0x10,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00
} ;
const uchar gong[]={/*--  文字:  功  --*/
0x00,0x04,0x04,0x04,0xFC,0x04,0x14,0x14,0x10,0x90,0x7F,0x10,0x10,0xF0,0x00,0x00,
0x04,0x0C,0x04,0x04,0x03,0x42,0x22,0x11,0x0C,0x23,0x20,0x60,0x20,0x1F,0x00,0x00
} ;
const uchar lv[]={/*--  文字:  率  --*/
0x00,0x0C,0x14,0xA4,0x04,0x64,0x35,0xAE,0x64,0x24,0x14,0xA4,0x14,0x04,0x04,0x00,
0x08,0x0A,0x09,0x08,0x08,0x0A,0x0B,0xFE,0x0A,0x0B,0x0C,0x08,0x09,0x0A,0x08,0x00
} ;
const uchar ce[]={/*--  文字:  测  --*/
0x08,0x31,0x86,0x60,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0x00,0xFF,0x00,
0x04,0xFC,0x03,0x00,0x80,0x47,0x30,0x0F,0x10,0x67,0x00,0x07,0x40,0x80,0x7F,0x00
} ;
const uchar liang[]={/*--  文字:  量  --*/
0x40,0x40,0x40,0xDF,0x55,0x55,0x55,0xD5,0x55,0x55,0x55,0xDF,0x40,0x40,0x40,0x00,
0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7F,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x00
} ;
const uchar zhou[]={/*--  文字:  周  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0xFE,0x02,0x42,0x4A,0x4A,0x7E,0x4A,0x4A,0x42,0x02,0xFE,0x00,0x00,
0x80,0x40,0x30,0x0F,0x00,0x00,0x1F,0x09,0x09,0x09,0x1F,0x40,0x80,0x7F,0x00,0x00
} ;
const uchar qi[]={/*--  文字:  期  --*/
0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00
} ;
const uchar shi[]={/*--  文字:  失  --*/
0x00,0x40,0x20,0x18,0x16,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,
0x00,0x01,0x81,0x41,0x21,0x11,0x0D,0x03,0x05,0x09,0x31,0x61,0xC1,0x41,0x01,0x00
} ;
const uchar zhen[]={/*--  文字:  真  --*/
0x00,0x04,0x04,0x04,0xF4,0x54,0x5C,0x57,0x54,0x54,0x54,0xF4,0x04,0x06,0x04,0x00,
0x10,0x90,0x90,0x50,0x5F,0x35,0x15,0x15,0x15,0x35,0x55,0x5F,0x90,0x90,0x10,0x00
} ;
const uchar du[]={/*--  文字:  度  --*/
0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,
0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00
} ;
const uchar fu[]={/*--  文字:  幅  --*/
0xF8,0x08,0xFF,0x08,0xF8,0x00,0x02,0x7A,0x4A,0x4A,0x4A,0x4A,0x4A,0x7A,0x02,0x00,
0x0F,0x00,0xFF,0x08,0x0F,0x00,0x7F,0x25,0x25,0x25,0x3F,0x25,0x25,0x25,0x7F,0x00
} ;
const uchar H[]={/*--  文字:  H  --*/
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20
};
const uchar z[]={/*--  文字:  z  --*/
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00
} ;
const uchar W[]={/*--  文字:  W  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00
} ;
const uchar line[]={/*--  文字:  /  --*/
0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00
} ;
const uchar x[]={0x00,0x42,0x66,0x18,0x18,0x66,0x42,0x00} ; // x , 8*8
const uchar y[]={0x00,0x00,0x02,0x86,0xF8,0x86,0x02,0x00} ; // y , 8*8
const uchar num_half[10][8]={//数字 0~9 , 8*8
0x00,0x3C,0x42,0x81,0x81,0x42,0x3C,0x00,  // 0
0x00,0x82,0x82,0xFF,0x80,0x80,0x00,0x00,  // 1
0x00,0xC6,0xA1,0x91,0x89,0xC6,0x00,0x00,  // 2
0x00,0x42,0x81,0x81,0x99,0x66,0x00,0x00,  // 3
0x18,0x14,0x12,0x10,0xFF,0x10,0x10,0x00,  // 4
0x00,0x00,0x8F,0x89,0x89,0x89,0x71,0x00,  // 5
0x00,0x00,0x7E,0x89,0x89,0x89,0x70,0x00,  // 6
0x00,0x01,0x01,0xF1,0x09,0x05,0x03,0x00,  // 7
0x00,0x60,0x96,0x89,0x89,0x96,0x60,0x00,  // 8
0x00,0x00,0x46,0x89,0x89,0x7E,0x00,0x00   // 9
} ;
const uchar col[]={0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00} ; // 冒号 8*8
const uchar delta[]={0x00,0x30,0x28,0x24,0x24,0x28,0x30,0x00} ; // delta 8*8
const uchar cls[]={0} ;
//***********************************************

void delay(int v)
{
  while(v!=0)v--;
}

void fft(void)
{
    unsigned int  i,j,k,L;
    unsigned int b,c,p,n;
    unsigned int  x,xc;
    float  Gr,Gi,Wr,Wi;

    /* 倒位序排列输入序列 */
    for(i=0;i<FFT_N;i++)
    {
        x =i;
        xc=0;
        for(j=0;j<FFT_M;j++)
        {
            if((x&0x01)!=0)
            {
                xc|=FFT_BIT[(FFT_M-1)-j];
            }
            x>>=1;
        }
        fft_i[xc]=fft_r[i];
    }
    for(i=0;i<FFT_N;i++)
    {
        fft_r[i]=fft_i[i];
        fft_i[i]=0;
    }

    /* FFT变换 */
    for(L=1;L<=FFT_M;L++)
    {
        b=1;
        p=FFT_N>>1;
        for(i=0;i<L-1;i++)
        {
            b<<=1; //b=2^(L-1)
            p>>=1; //p=N/(2^L)
        }
        c=b<<1;    //c=b*2
        for(j=0;j<b;j++)
        {
            n=p*j;
            for(k=j;k<FFT_N;k+=c)
            {
                Gr = fft_r[k];
                Gi = fft_i[k];
                Wr = ((Sinf[n+FFT_N/4]*fft_r[k+b])) + ((Sinf[n]*fft_i[k+b]));
                Wi = ((Sinf[n+FFT_N/4]*fft_i[k+b])) - ((Sinf[n]*fft_r[k+b]));
                fft_r[k] = Gr + Wr;
                fft_i[k] = Gi + Wi;
                fft_r[k+b] = Gr - Wr;
                fft_i[k+b] = Gi - Wi;
            }
        }
    }
}

void Harmonic(void)
{
    unsigned int i;
    float Fnr,Fni,F_nr,F_ni,temp;
    
    for(i=1;i<=HARM_M;i++)  //各次谐波分量
    {
        Fnr  = fft_r[i]/128;
        Fni  = fft_i[i]/128;
        F_nr = fft_r[FFT_N-i]/128;
        F_ni = fft_i[FFT_N-i]/128;
        temp = sqrt(Fnr*Fnr+Fni*Fni) + sqrt(F_nr*F_nr+F_ni*F_ni);
        harm[i] = temp;
    }
    harm[0] = fft_r[0]/128; //直流分量,因实数序列变换后F(0)的虚部=0
}

float SinDistortion(void)
{
    unsigned int i;
    float   sd;
    float  tmp;
    
    tmp=0;
    for(i=2;i<=HARM_M;i++)
    {
      tmp += harm[i]*harm[i];
    }
    sd = sqrt(tmp)*10000u/harm[1];
    return sd;
}

//**********延时函数*****************************
void delay_ms(unsigned int k )
{ 
  unsigned int i,j;
  
  for(i=0;i<k;i++)
  { 
    for(j=0;j<200;j++);
  }
}
//***********************************************

//**********初始化键盘设备***********************
void Init_Keyboard(void)
{
	P2DIR &= 0x01 ;
	P2DIR |= 0x0F ;
	P2OUT |= 0 ;
    	key_flag = 0 ;
	key_pressed = 0 ;
}
//***********************************************

//**********检查按键,确认键值*******************
 void Check_Key ( void ) 
{
  unsigned char row , col , tmp1 , tmp2 ;

  tmp1 = 0x08 ;
  for ( row = 0 ; row < 4 ; row++ )
  {
    P2OUT |= 0x0F;
    P2OUT -= tmp1 ;
    tmp1 = tmp1/2 ;
    if ( ( P2IN & 0xf0 )< 0xf0 )
    {
      tmp2 = 0x80 ;
      for ( col = 0 ; col < 0x04 ; col++ )
      {
        if ( ( P2IN & tmp2 ) == 0x00 )
        {
	  key_value = key_map [ row*4 + col ] ;
          key_pressed=1;
	  return ;
	}
	tmp2 /= 2 ;
      }
    }
  }
}
//***********************************************

//**********检测键盘是否有键按下,如果有获取键值*
void Key_Event(void)
{
  unsigned char tmp ;

  P2OUT = 0  ;
  tmp = P2IN ;
  if ( (key_pressed == 0x00 ) &&(( tmp & 0xf0 ) < 0xf0 )) 
  {
    key_pressed = 1 ;
    Check_Key() ;
  }
 /* else if ( ( key_pressed == 1 ) && ( ( tmp & 0xf0 ) == 0xf0 ) )
  {
    key_pressed = 0 ;
    key_flag = 1 ;
  }*/
}	
//***********************************************

//**********液晶复位*****************************
void lcd_reset()
{        
  P1OUT &= ~LCD_RST ;
  P1OUT |= LCD_RST ;
}
//***********************************************

//***********************************************
void check()
{
  uchar tmp;  
  P5DIR=0x00;  
  P1OUT |= LCD_RW ;
  P1OUT &= ~LCD_RS ; 
  do
  {
    P1OUT |= LCD_EN ;
    tmp=P5IN ;
    P1OUT &= ~LCD_EN ;
  }
  while(tmp&BIT7) ;
}
//***********************************************

//**********写命令*******************************
void lcd_write_command(uchar command)
{    
  check();  
  P5DIR = 0xff;  
  P1OUT &= ~LCD_RS ;
  P1OUT &=~ LCD_RW ; 
  P5OUT = command ;
  P1OUT |= LCD_EN ;
  P1OUT &=~ LCD_EN ;
}
//***********************************************

//**********打开液晶*****************************
void lcd_on()
{
        P1OUT |= LCD_CS1 ;
        P1OUT &=~LCD_CS2 ;
        lcd_write_command(0x3f) ;
        P1OUT |= LCD_CS2 ;
        P1OUT &=~ LCD_CS1 ;
        lcd_write_command(0x3f) ;
}
//***********************************************

//**********关闭液晶*****************************
void lcd_off()
{
  P1OUT |= LCD_CS1 ;
  P1OUT &=~LCD_CS2 ;
  lcd_write_command(0x3e) ;
  P1OUT |=LCD_CS2 ;
  P1OUT &=~ LCD_CS1 ;
  lcd_write_command(0x3e) ;
}
//***********************************************

//**********初始化液晶***************************
void lcd_initial()
{ 
  P5DIR=0xff ;
  P1DIR=0x3f ;  
  P1OUT=0 ;  
  lcd_reset() ;
  lcd_on() ;
  P1OUT |= LCD_CS1 ;
  P1OUT &= ~LCD_CS2 ;
  lcd_write_command(0xc0) ;
  P1OUT &= ~LCD_CS1 ;
  P1OUT |= LCD_CS2 ;
  lcd_write_command(0xc0) ;
}
//***********************************************

//**********写数据*******************************   
void lcd_write_data(uchar data_buffer)
{    
  check();
  P5DIR = 0XFF ;
  P1OUT &= ~LCD_RW ;
  P1OUT |= LCD_RS ;
  P1OUT |= LCD_EN ;
  P5OUT = data_buffer ; 
  P1OUT &= ~LCD_EN ;
}
//***********************************************

//**********写单个串*****************************
void lcd_write_byte(uchar xpos,uchar ypos,uchar *byte)
{
  if(xpos<=63)
  {
    P1OUT |= LCD_CS1 ;
    P1OUT &=~ LCD_CS2 ;
    lcd_write_command(xpos+0x40) ;
    lcd_write_command(ypos+0xb8) ;
    lcd_write_data(*byte) ;
  }
  else

⌨️ 快捷键说明

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