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

📄 display.c

📁 89C54构成MC4511锁相环稳定性扫描测试仪器
💻 C
📖 第 1 页 / 共 2 页
字号:
#define  uchar unsigned char
#define  uint  unsigned int 
#include <AT89x51.H>
#include <stdio.h>
#include <intrins.h>
#include <ctype.h> 
#include <string.h>

//给出显示闪烁初值
#define  DB_val       100 

//定义
#define  reload_high  0x4c
#define  reload_low   0xb0
#define  reload_high1 0xfe
#define  reload_low1  0x16

sfr   dispdata=0x80;           //定义显示口
sfr   keybord_row=0xA0;        //定义键盘的行和列地址
sfr   keybord_col=0xB0;
sfr   dataout=0x90;

sbit  FLASH=dataout^0;
sbit  F=keybord_row^5;
sbit  RF=dataout^7;
sbit  pulse_control=dataout^6;
sbit  D5=dataout^5;
sbit  D4=dataout^4;
sbit  D3=dataout^3;
sbit  D2=dataout^2;
sbit  D1=dataout^1;
sbit  D0=dataout^0;
uchar RFOUT;
uchar led_buf[4];            //显示缓冲区  
uchar bdata flag;
sbit  time_init=flag^0;
sbit  auto_flush=flag^1;
sbit  message_disp=flag^3;
sbit  message_flag=flag^2;   //需刷新显示置位
sbit  auto_scanl=flag^4;
sbit  auto_scanh=flag^5;
uint  message_time;
bit   fre_init=0;    

typedef struct {
uchar tho,hun,dec,num;       //定义千,百,十,个;
}fredispstruct;
fredispstruct curfre,        //存当前频显
    freholder;               //存显示频点

char code bcdmap[42][4]={
  "F999","1000","1001","1004","1005","1006","1009","1010",  
  "1011","1029","1030","1031","1049","1050","1051","1054",
  "1055","1056","1059","1060","1061","1064","1065","1066",
  "1069","1070","1071","1089","1090","1091","1109","1110",
  "1111","1114","1115","1116","1119","1120","1121","1059",
  "1060","1061"
};

//函数声明
void  init_sys(void);                     //初始化系统
uchar get_ch(uchar);                      //键盘输入函数
uchar * get_str(uchar *,uint );
void  delay(int);                         //延迟时间函数
bit   kb_hit(void);                       //判断是否有键按下
void  put_0ff_leds(void);                 //关显示
void  monitor(void);
void  switch_power(void);                 //put off switch_power
void  disp_data(void);
void  set_led_buf(uchar,uchar,uchar);
void  led_buf_auto_flush(void) reentrant;
void  error_message(void);
void  set_fre_disp(void);
void  scan_fre_bufL(void);
void  scan_fre_bufH(void);
void  fre_outl(void);
void  fre_outm(void);
void  fre_outh(void);
void  pulse_switch(void);
void  fre_up(void);
void  fre_down(void);
bit   compare_fre_disp(void);

/*********************************************************************
函数原型:void put_off_leds(void)
功    能:关闭LED显示器
*********************************************************************/
void put_off_leds(void)
{
  dispdata=0x0f;
  message_disp=!message_disp;
}

//延时程序
void delay(int delayValue)
{
 int i;
 for(i=0;i<delayValue;i++)
  {};
}

/*********************************************************************
函数原型:void init_sys(void)
功    能:初始化系统
*********************************************************************/
void init_sys(void)
{
  uint b,j;
  for(b=0;b<5;b++)
  {
    for(j=0;j<=DB_val;j++)                //系统初始化,开显示并显示8888
     {
	  delay(25);
      dispdata=0xe8;
      delay(25);
      dispdata=0xd8;
      delay(25);
      dispdata=0xb8;
      delay(25);
      dispdata=0x78;
     };
    for(j=0;j<=DB_val;j++)                //系统初始化,关显示         
     {
	  delay(100);
	  dispdata=0xf8;
     };
   }
}

/*********************************************************************
函数原型:void get_ch(void)
功    能:读出按键值
*********************************************************************/
uchar get_ch(void)
{
  uchar row=0,col=0;
  uchar mask;
  uchar rmask;
  uchar pic;
  keybord_row=0xff;
  keybord_col=0xff;
  mask=keybord_row&0xfe;    //使第1列线为0
  rmask=keybord_row&0xdf;
  if(!kb_hit()) return(0);  //无键按下,输入不成功,返回0。
  //分析按键所在的列号。
  keybord_row=mask;         //使第1列线为0
    while(((keybord_col&0x1f)==0x1f)&&(mask>rmask))
      {
         ++col;
         mask=_crol_(mask,1);
         keybord_row=mask;
      }
  //分析按键所在的行号
  pic=keybord_col&0x1f; 
  mask=0x01;
    while(pic&mask)
      {
        ++row;
        mask=_crol_(mask,1);	
      }
  //等待按键释放。
  while((keybord_col&0x1f)!=0x1f);
  //delay(20);
  keybord_row=keybord_row|0x1f;
  //计算按键编码值并以ASCII码值返回
  pic=(row*5)+col;
  if(pic<10) pic+='0';
  else  pic+='A'-10;
 switch(pic)
  {
   case '0':pic='9';break;
   case '1':pic='8';break;
   case '2':pic='7';break;
   case '5':pic='6';break;
   case '6':pic='5';break;
   case '7':pic='4';break;
   case 'A':pic='3';break;
   case 'B':pic='2';break;
   case 'C':pic='1';break;
   case 'F':pic='0';break;
   case '3':pic='A';break;
   case '4':pic='B';break;
   case '8':pic='C';break;
   case '9':pic='D';break;
   case 'D':pic='E';break;
   case 'E':pic='F';break;
   default:break;
  }
 return(pic);
}

/*********************************************************************
函数原型:* get_str(uchar * str, uchar len);
功    能:从矩阵键盘输入长度为len的字符串,并将其储在由指针str所指向的空间,
并返回该指针。
*********************************************************************/
uchar * get_str(uchar * str, uint len)
{
//uchar data i;
uchar data ch;
uchar data keybord_buf[4];                //键盘缓冲区
uchar data ledbuf_pos=0,keybuf_pos=0;     //消除显示缓冲区 
set_led_buf(0x0f,0,4);                    //关显示 
while(keybuf_pos<len)
 {
  disp_data();
  ch=get_ch();
/*如果成功,将显示缓冲区原字符向左滚动一位*/
/*并将新字符放在显示缓冲区末尾,并送键盘缓冲区*/
 if(isdigit(ch))
  {
   if(ledbuf_pos>3) ledbuf_pos=3;
    led_buf[ledbuf_pos++]=ch;
   keybord_buf[keybuf_pos++]=ch;
  }
 }
//for(i=0;i<100;i++) 
disp_data();                //短时显示最后输入的字符
memcpy(str,keybord_buf,len);
return(str);
}

/*********************************************************************
函数原型:bit kb_hit(void);
功    能:按键
*********************************************************************/
bit kb_hit(void)
{
  uchar kb_row;
  uchar kb_col;
  keybord_row=0x0ff;                    
  keybord_col=0x0ff;
  kb_row=keybord_row&0xe0;                   //往矩正列线送0
  keybord_row=kb_row;  
  kb_col=keybord_col;                        //读出行线状态
  if((keybord_col&0x1f)==0x1f)               //输入并见检查行线
   return((bit) 0);                          //行线为1则还回0
   delay(100);
  if((keybord_col&0x1f)==0x1f)
  return((bit) 0);
 return((bit) 1);                       
}

/*********************************************************************
函数原型:void monitor(void)
功    能:
*********************************************************************/
void monitor(void)
{
  uchar ccommand;
  while(1)
  {
    if(message_disp)                                 //判断显示
    disp_data();
    if(message_time==0)
	{
	 message_flag=0;
	 auto_flush=1;
	}
	if((ccommand=get_ch()))
	{
	 message_flag=0;
	 message_time=0;
	}
	switch(ccommand)
	{
	 //case 'M':if(!compare_fre_disp())
	      //     error_message(); break;
	 case 'F':set_fre_disp();   break;
	 case 'A':switch_power();   break;
     case 'C':put_off_leds();   break;                 
	 case 'B':scan_fre_bufL();  break;                 //扫描频率缓冲区中的值
	 case 'D':scan_fre_bufH();  break; 
	 case 'I':fre_outl();       break;
	 case 'H':fre_outm();       break;
	 case 'G':fre_outh();       break;
     case 'E':pulse_switch();   break;
	 case 'O':fre_up();         break;
	 case 'N':fre_down();       break;
	 default:break;
	 }
  }
}

/*********************************************************************
函数原型:void disp_data(void)
功    能:将当前显示缓冲区的字符输出到LED显示
*********************************************************************/
void disp_data(void)
{
   uchar dmask=0xef;
   uchar pos;
   for(pos=0;pos<4;pos++)
     {
       dispdata=(led_buf[pos]&0x0f)|(dmask&0xf0);
       delay(200);  
	   dispdata=0xff;
	   delay(10);
	   dmask=_crol_(dmask,1);
	 auto_flush=0;
	 };
}

/*********************************************************************
函数原型:void timer0(void)
功    能:中断服务程序
*********************************************************************/
void timer0(void) interrupt 1 using 2
{
  static uchar click;           //中断次数变量
  static uchar scanl;
  static uchar scanh;
  static uchar out;
  TH0=reload_high;
  TL0=reload_low;
  if(auto_flush) led_buf_auto_flush();
  //if(!fre_init) return;           //如果设置不成功,则返回
  ++click;
  if(click>=10)
   { 
    click=0;
	//根据消息标志决定是否将消息显示时间减少一秒。
	if(message_flag&&message_time)  --message_time;
   if(auto_flush) led_buf_auto_flush();
   }
  ++scanl;
  if(scanl>=60)
   {
    scanl=0;
    if(!auto_scanl)
    {
	 dataout=(out&0x3f)|(dataout&0xc0);
     freholder.tho=bcdmap[out][0];

⌨️ 快捷键说明

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