📄 显示.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 + -