河南科技大学毕业设计(论文)
附 录
一、主程序代码
#include
#define NOP5 _nop_();_nop_();_nop_();_nop_();_nop_()
#define FOSC 32782266L #define NMS 4
#define T1MS (65536-NMS*FOSC/12/1000)
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
unsigned char code User[8][8]=
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F}, {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F}, {0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F}, {0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F}, {0x00,0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F}, {0x00,0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}, {0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}, {0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F}};
unsigned char code nxd[32]=
{0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30, 1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31};
unsigned char data1[32];
struct complex{float re,im;}; struct complex data2[32];
27
河南科技大学毕业设计(论文)
unsigned char frq1[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; unsigned char frq2[16]=
{16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16}; unsigned char p=0;unsigned char l; unsigned char lcd_flag=0; unsigned char count=10; bit AD_flag=0;
unsigned char point=0; unsigned char temp;
/*********************函数功能:延时1ms*********************/ void delay1ms()
{ unsigned char i,j; for(i=0;i<12;i++) for(j=0;j<30;j++); }
/*******************函数功能:延时若干毫秒********************/ void delay(unsigned int n) { unsigned int i; for(i=0;i /*****************函数功能:判断液晶模块的忙碌状态**************/ bit BusyTest(void) { bit result; RS=0; // RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; //E=1,才允许读写 } NOP5; //空操作 NOP5; NOP5; NOP5; //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0; return result; 28 河南科技大学毕业设计(论文) /****************函数功能:将控制字写入液晶模块****************/ void Write_com (unsigned char dictate) { while(BusyTest()==1); //如果忙就等待 RS=0; // RS和R/W同时为低电平时,可以写入指令 RW=0; E=0; //写指令时,让E从0到1发生正跳变 NOP5; NOP5; //空操作两个机器周期,给硬件反应时间 P0=dictate; //将数据送入P0口,即写入指令或地址 NOP5; NOP5; NOP5; NOP5; E=1; NOP5; NOP5; NOP5; NOP5; E=0; //空操作四个机器周期,给硬件反应时间 //E置高电平 //空操作四个机器周期,给硬件反应时间 //当E由高电平跳变低电平时,液晶开始执行命令 } /****************函数功能:指定字符显示的实际地址***************/ void WriteAddress(unsigned char x) { Write_com(x|0x80); //显示位置的确定方法规定为\地址码x\ } /*********函数功能:将数据(字符的标准ASCII码)写入液晶模块********/ void WriteData(unsigned char y) { while(BusyTest()==1); RS=1; RW=0; E=0; P0=y; NOP5; NOP5; NOP5; NOP5; //RS为高电平,RW为低电平时,可以写入数据 //写指令时,让E从0到1发生正跳变 //将数据送入P0口,即将数据写入液晶模块 //空操作四个机器周期,给硬件反应时间 29 河南科技大学毕业设计(论文) E=1; //E置高电平 NOP5; NOP5; NOP5; NOP5; //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变低电平时,液晶开始执行命令 } /***********函数功能:对LCD的显示模式进行初始化设置*************/ void LcdInt(void) { delay(15); //延时15ms,给LCD一段较长的反应时间 Write_com(0x38); delay(5); Write_com(0x38); delay(5); Write_com(0x38); delay(5); Write_com(0x0C); delay(5); Write_com(0x06); //显示模式:16×2、5×7点阵,8位数据接口 //延时5ms //3次写 设置模式 //显示模式设置:显示开,有光标,光标闪烁 //显示模式设置:光标右移,字符不移 delay(5); Write_com(0x01); //清屏幕指令,将以前的显示内容清除 delay(5); } /****************函数功能:将User的字模写入CGRAM*************/ void CgInt(void) {unsigned char i,j,org; delay(50); for(i=0;i<8;i++) { org=0x40|(i*8); Write_com(org); //设定CGRAM地址 delay(5); for(j=0;j<8;j++) {WriteData(User[i][j]); //写入自定义图形 delay(5); } } } 30 河南科技大学毕业设计(论文) /********函数功能:频谱回落一格(操作全局变量frq1,frq2)**********/ void frqfall(void) { unsigned char i; if(count==0) {for(i=0;i<16;i++) if(frq2[i]!=0) frq2[i]--; count=10;} count--; for(i=0;i<16;i++) if(frq1[i]>16) frq2[i]=16; else if(frq1[i]>frq2[i]) frq2[i]=frq1[i]; } /**************函数功能:在第p位显示高为l的柱子****************/ void disp(void) interrupt 1 { AD_flag=1; //把AD状态转为打断 switch(lcd_flag) //0~3,上地址 上数据 下地址 下数据 {case 0: {frqfall(); if(p==16) p=0; l=frq2[p]; //从frq2中取l,更新p WriteAddress(0x00+p); lcd_flag++; break; } case 1: {if(l>8) WriteData(l-9); else WriteData(0x20); lcd_flag++; break; 31