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

📄 显示.c

📁 89C54构成MC4511锁相环稳定性扫描测试仪器
💻 C
字号:
        #define uchar unsigned char
        #define uint unsigned int 
        #include <AT89X51.H>
		#include <stdio.h>
        //定义定时钟0的重装值
        #define RELOAD_HIGH 0x3C
        #define RELOAD_LOW  0xD2
        //定义按键弹跳时间
        #define DB_VAL      20
        //定义设置模式的最大时间间隔
        #define TIMEOUT     200
        //定义光标位置常数
        #define HOME        0
        #define HOUR        1
        #define MIN         2
        #define SEC         3
        //定义光标状态常数
        #define OFF         0
        #define ON          1
        //定义显示命令常数
        #define DISP_BUSY   0x80
        #define DISP_FUNC   0X38
        #define DISP_ENTRY  0X06
        #define DISP_CNTL   0x08
        #define DISP_ON     0x04
        #define DISP_CURSOR 0x02
        #define DISP_CLEAR  0x01
        #define DISP_HOME   0x02
        #define DISP_POS    0x80
        #define DISP_LINE2  0x40
        sbit SET=P3^4;      //设置按键输入
        sbit SELECT=P3^5;   //选择按键输入
        sbit ENABLE=P3^1;   //显示使能输出
        sbit REGSEL=P3^7;   //显示寄器选择输出
		sbit RDWR=P3^6;     //显示模式输出
		sbit DISPDATA=0x90; //显示8位数据总线
		typedef struct{     //定义
			uchar hour,min,sec;
		}timestruct;
		bit set_mode=0;
		    disp_updata=0;
		uchar set_mode_to=0;
				switch_debounce=0;
				cur_field=HOME;
		timestruct curtime,
				timeholder;
		uchar fieldpos[3]={ //
			DISP_LINE2|0x01,
			DISP_LINE2|0x04,
			DISP_LINE2|0x07,
		};
		#define T_HOURT 16
		#define T_HOUR 17
		#define T_MINT 19
		#define T_MIN 20
		#define T_SECT 22
		#define T_SEC 23
		char code bcdmap[60][2]={
			"00","01","02","03","04","05","06","07","08","09",
			"10","11","12","13","14","15","16","17","18","19",
			"20","21","22","23","24","25","26","27","28","29",
			"30","31","32","33","34","35","36","37","38","39",
			"40","41","42","43","44","45","46","47","48","49",
			"50","51","52","53","54","55","56","57","58","59",
		};
		//函数声明
		void disp_cmd(uchar);
		void disp_init(void);
		uchar disp_read(void);
		void disp_time(void);
		void disp_write(uchar);
		void incr_field(void);
		void second_cursor(bit,uchar);
		/*****************************************************
		功能:disp_cmd
		描述:向LCD驱动器写入命令并等待命令被执行
		参数:命令
		返回:无
		*****************************************************/
 		void disp_cmd(uchar cmd){
			DISPDATA=cmd; //锁住命令
			REGSEL=0; //选择命令寄存器
			RDWR=0; //选择写模式
			ENABLE=1;
			ENABLE=0;
			TH1=0; //定时85ms
			TL1=0;
			TF1=0;
			TR1=1;
			while(!TF1&&disp_read()&DISP_BUSY); //等待命令被执行
			TR1=0;
		}
		/*******************************************************
		功能:disp_init
		描述:初始化显示
		参数:无
		返回:无
		*******************************************************/
		void disp_init(void){
			TH1=0;
			TL1=0;
			TF1=0;
			TR1=1;
			while(!TF1&&disp_read()&DISP_BUSY);
			TR1=0;
			disp_cmd(DISP_FUNC);     //设置显示格式
			disp_cmd(DISP_ENTRY);
			disp_cmd(DISP_CNTL|DISP_ON);
			disp_cmd(DISP_CLEAR);
		}
		/********************************************************
		功能:disp_read
		描述:读显示状态寄器
		参数:无
		返回:从状态寄参器中读回数据
		********************************************************/
		uchar disp_read(void){
			uchar value;
			DISPDATA=0x0FF;
			REGSEL=0;
			RDWR=1;
			ENABLE=1;
			value=DISPDATA;
			ENABLE=0;
			return(value);
		}
		/********************************************************
		功能:disp_time
		描述:取显示数据进行格式化
		参数:无
		返回:无
		********************************************************/
		void disp_time(void){
			static char time_str[32]="TIME OF DAY IS :XX:XX:XX";
			uchar i;
			time_str[T_HOURT]=bcdmap[timeholder.hour][0];
			time_str[T_HOUR]=bcdmap[timeholder.hour][1];
			time_str[T_MINT]=bcdmap[timeholder.min][0];
			time_str[T_MIN]=bcdmap[timeholder.min][1];
			time_str[T_SECT]=bcdmap[timeholder.sec][0];
			time_str[T_SEC]=bcdmap[timeholder.sec][1];
			putchar(0x0FF);
			for(i=0;i<32;i++){
				putchar(time_str[i]);
                }
		disp_updata=0;
		}
		/*********************************************************
		功能:disp_write
		描述:写入一个字节数据
		参数:要写入的字节
		返回:无
		*********************************************************/
		void disp_write(uchar value) {
			DISPDATA=value;
			REGSEL=1;
			RDWR=0;
			ENABLE=1;
			ENABLE=0;
		}
		/***********************************************************
		功能:incr_field
		描述:增加数值
		参数:无
		返回:无
		***********************************************************/
		void incr_field(void){
			if(cur_field==SEC){
				curtime.sec++;
				if(curtime.sec>59){
					curtime.sec=0;
				}
			}
			if(cur_field==MIN){
				curtime.min++;
				if(curtime.min>59){
					curtime.min=0;
				}
			}
			if(cur_field==HOUR){
				curtime.hour++;
				if(curtime.hour>23){
					curtime.hour=0;
				}
			}
		}
		/***********************************************************
		功能:putchar
		描述:替代标准putchar函数,输出字符
		参数:要显示的字符
		返回:刚刚被写入的字符
		***********************************************************/
		char putchar(char c){
			static uchar flag=0;
			if(!flag||c==255){
				disp_cmd(DISP_HOME);
				flag=0;
				if(c==255){
					return c;
				}
			}
			if(flag==20){
				disp_cmd(DISP_POS|DISP_LINE2);
			}
			disp_write(c);
			while(disp_read()&DISP_BUSY)
			flag++;
			if(flag>=40){flag=0;};
			return(c);
		}
		/**********************************************************
		功能:second_tick
		描述:每秒钟执行一次函数功能,时间更新
		参数:无
		返回:无
		**********************************************************/
		void second_tick(void){
			curtime.sec++;
			if(curtime.sec>59){
				curtime.sec=0;
				curtime.min++;
				if(curtime.min>59){
					curtime.min=0;
					curtime.hour++;
					if(curtime.hour>23){
						curtime.hour=0;
					}
				}
			}
			if(!disp_updata){
				timeholder=curtime;
				disp_updata=1;
			}
		}
		/**********************************************************
		功能:set_cursor
		描述:显示或关闭光标,并把光标移到特定的位置
		参数:new_mode位,隐藏光标时置位
		field显示光标的位置
		返回:无
		**********************************************************/
		void set_cursor(bit new_mode,uchar field){
			uchar mask;
			mask=DISP_CNTL|DISP_ON;
			if(new_mode){
				mask|=DISP_CURSOR;
			}
			disp_cmd(mask);
			if(field==HOME){
			mask=DISP_HOME;
			}else{
			mask=DISP_POS|fieldpos[field-1];
			}
			disp_cmd(mask);
		}
		/***********************************************************
		功能:system_tick
		描述:定时器0的中断服务程序,每50ms重装一次定时器
		参数:无
		返回:无
		***********************************************************/
		void system_tick(void) interrupt 1 {
			static uchar second_cnt=20;
			TR0=0;
			TH0=RELOAD_HIGH;
			TL0=RELOAD_LOW;
			TR0=1;
			if(switch_debounce){
				switch_debounce--;
			}
			if(!switch_debounce){
				if(!SET){
					switch_debounce=DB_VAL;
					if(!set_mode&&!disp_updata){
						set_mode=1;
						set_mode_to=TIMEOUT;
						cur_field=HOUR;
						set_cursor(ON,HOUR);
					}else{
						cur_field++;
						if(cur_field>SEC){
							set_mode=0;
							set_mode_to=0;
							set_cursor(OFF,HOME);
						}
					}
				}
				if(set_mode&&!SELECT){
					set_mode_to=TIMEOUT;
					incr_field();
					disp_time();
				}
			}
			if(!set_mode){
				second_cnt--;
				if(!second_cnt){
					second_cnt=20;
					second_tick();
				}
			}
		}
        /*********************************************************
		功能:主函数
		描述:程序入口函数,
		*********************************************************/
		void main(void){
			disp_init();
			TMOD=0x11;
			TCON=0x15;
			IE=0x82;for( ; ; ){
				if(disp_updata){
					disp_time();
					PCON=0x01;
					};
			};
		}

⌨️ 快捷键说明

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