📄 display.c
字号:
#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 + -