📄 ex6-5.c
字号:
/* ex6-5.C - 绘图型 LCD 数字时钟 */
#include <REGX51.H>
#define TIMER0_COUNT 0xDC11 /* 10000h-((11,059,200/
(12*FREQ))-
17 */
/*绘图型 LCD 指令 */
#define GLCD_OFF 62
#define GLCD_ON 63
#define GLCD_START_LINE_0 192
#define SET_PAGE 184
#define SET_Y_ADDRESS_0 64
#define CLEAR 0
/*绘图型 LCD 控制线 */
#define ENABLE 1
#define DISABLE 0
#define READ 1
#define WRITE 0
#define COMMAND 0
#define DATA 1
#define GLCD_RESET P2_2
#define GLCD_CS2 P2_3
#define GLCD_CS1 P2_4
#define GLCD_D_I P2_5
#define GLCD_R_W P2_6
#define GLCD_ENABLE P2_7
//
#define mode_button P2_0
#define up_button P2_1
typedef struct {
char hour;
char minute;
char second;
} time;
typedef struct {
char year;
char month;
char day;
} date;
time now={23,59,0},display;
date today={5,9,1},tmpday;
unsigned char gx,gy,mode;
static unsigned timer0_tick;
char code int2char[]="0123456789";
char code dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char code digit[10][4][8]=
//0
{{
{0X00,0X00,0X00,0XFC,0XFE,0X03,0X01,0X81},
{0XC1,0X61,0X31,0X1B,0XFE,0XFC,0X00,0X00},
{0X00,0X00,0X00,0X0F,0X1F,0X36,0X23,0X21},
{0X20,0X20,0X20,0X30,0X1F,0X0F,0X00,0X00}},
//1
{
{0X00,0X00,0X00,0X00,0X00,0X04,0X06,0XFF},
{0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X20,0X20,0X20,0X3F},
{0X3F,0X20,0X20,0X20,0X00,0X00,0X00,0X00}},
//2
{
{0X00,0X00,0X00,0X1C,0X1E,0X03,0X01,0X81},
{0XC1,0X41,0X61,0X33,0X3E,0X1C,0X00,0X00},
{0X00,0X00,0X00,0X3C,0X3E,0X33,0X31,0X31},
{0X30,0X30,0X30,0X30,0X30,0X3C,0X00,0X00}},
//3
{
{0X00,0X00,0X00,0X0C,0X0E,0X02,0X01,0X41},
{0X41,0XE1,0XE1,0XB2,0X1E,0X0C,0X00,0X00},
{0X00,0X00,0X00,0X0C,0X1C,0X10,0X20,0X20},
{0X20,0X20,0X20,0X11,0X1F,0X0E,0X00,0X00}},
//4
{
{0X00,0X00,0X80,0XC0,0X60,0X30,0X18,0X0C},
{0X06,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00},
{0X00,0X07,0X07,0X04,0X04,0X04,0X04,0X24},
{0X24,0X3F,0X3F,0X24,0X24,0X04,0X00,0X00}},
//5
{
{0X00,0X00,0X00,0XFF,0XFF,0X43,0X23,0X23},
{0X23,0X23,0X23,0X43,0XC3,0X80,0X00,0X00},
{0X00,0X00,0X00,0X0C,0X1C,0X10,0X20,0X20},
{0X20,0X20,0X20,0X10,0X1F,0X0F,0X00,0X00},},
//6
{
{0X00,0X00,0X00,0XFC,0XFE,0X82,0X41,0X41},
{0X41,0X41,0X41,0XC7,0X86,0X00,0X00,0X00},
{0X00,0X00,0X00,0X0F,0X1F,0X30,0X20,0X20},
{0X20,0X20,0X20,0X10,0X1F,0X0F,0X00,0X00}},
//7
{
{0X00,0X00,0X00,0X0F,0X03,0X03,0X03,0X03},
{0X83,0XC3,0X63,0X33,0X1F,0X0F,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F},
{0X3F,0X00,0X00,0X00,0X00,0X00,0X00,0X00}},
//8
{
{0X00,0X00,0X00,0X1C,0XBE,0XE2,0X41,0X41},
{0X41,0X41,0XE2,0XBE,0X1C,0X00,0X00,0X00},
{0X00,0X00,0X0E,0X1F,0X11,0X20,0X20,0X20},
{0X20,0X20,0X20,0X11,0X1F,0X0E,0X00,0X00}},
//9
{
{0X00,0X00,0X00,0X7C,0XFE,0X82,0X01,0X01},
{0X01,0X01,0X82,0XC6,0XFC,0XF8,0X00,0X00},
{0X00,0X00,0X00,0X0C,0X1C,0X18,0X21,0X21},
{0X21,0X21,0X10,0X1C,0X0F,0X03,0X00,0X00}}};
unsigned char code slash[4][8]=
///
{
{0X00,0X00,0X00,0X00,0X00,0X80,0XC0,0X60},
{0X30,0X18,0X0C,0X06,0X03,0X01,0X00,0X00},
{0X30,0X18,0X0C,0X06,0X03,0X01,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00}};
//:
unsigned char code comma[4][8]=
{
{0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X38},
{0X38,0X10,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X07},
{0X07,0X02,0X00,0X00,0X00,0X00,0X00,0X00}};
unsigned char code space[4][8]=
{
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00}};
unsigned char code token[7][4][8]=
{
{
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00}},
//现
{
{0X42,0X42,0XFE,0X43,0X42,0X00,0X00,0XFE},
{0X49,0X49,0X49,0X49,0XFF,0X00,0X00,0X00},
{0X08,0X18,0X0F,0X04,0X22,0X20,0X20,0X13},
{0X0E,0X01,0X01,0X3E,0X23,0X20,0X30,0X00}},
//在
{
{0X02,0X02,0X02,0X84,0X64,0X1C,0X87,0X84},
{0X84,0XF4,0X84,0X84,0XC4,0X86,0x04,0X00},
{0X04,0X02,0X01,0X3F,0X00,0X10,0X10,0X10},
{0X10,0X1F,0X10,0X10,0X10,0X18,0X10,0X00}},
//时
{
{0XFC,0X44,0X44,0XFC,0X80,0X92,0X92,0X52},
{0X52,0X5F,0X52,0XF2,0X9A,0XD2,0X80,0X00},
{0X0F,0X04,0X04,0X0F,0X00,0X00,0X02,0X04},
{0X80,0X00,0X40,0X1F,0X00,0X00,0X00,0X00}},
//间
{
{0X00,0XFF,0X15,0X15,0X15,0X95,0X9F,0X10},
{0X10,0X9F,0X95,0X15,0X15,0X15,0XFF,0X00},
{0X00,0X3F,0X00,0X00,0X00,0X0F,0X0A,0X0A},
{0X0A,0X0A,0X0F,0X00,0X20,0X20,0X1F,0X00}},
//是
{
{0X40,0X40,0X40,0X5F,0X55,0X55,0X55,0XD5},
{0X55,0X55,0X55,0X5F,0X40,0X60,0X40,0X00},
{0X20,0X10,0X08,0X07,0X08,0X10,0X20,0X3F},
{0X22,0X22,0X22,0X23,0X22,0X20,0X20,0X00}},
//:
{
{0X00,0X00,0X00,0X00,0X00,0X00,0X10,0X38},
{0X38,0X10,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X02,0X07},
{0X07,0X02,0X00,0X00,0X00,0X00,0X00,0X00}}};
void check_GLCD_busyflag(void)
{
unsigned char x;
GLCD_R_W=READ;
GLCD_D_I=COMMAND;
GLCD_ENABLE=ENABLE;
P0=255;
do {
x=P0 && 128;
} while(x);
GLCD_ENABLE=DISABLE;
GLCD_D_I=1;
GLCD_R_W=1;
}
void write_GLCD_command(unsigned command)
{
GLCD_R_W=WRITE;
GLCD_D_I=COMMAND;
GLCD_ENABLE=ENABLE;
P0=command;
GLCD_ENABLE=DISABLE;
GLCD_D_I=1;
GLCD_R_W=1;
check_GLCD_busyflag();
}
void write_GLCD_data(unsigned GLCDdata)
{
GLCD_R_W=WRITE;
GLCD_D_I=DATA;
GLCD_ENABLE=ENABLE;
P0=GLCDdata;
GLCD_ENABLE=DISABLE;
GLCD_D_I=0;
GLCD_R_W=1;
check_GLCD_busyflag();
}
void clear_GLCD()
{
int i,j;
GLCD_RESET=0;
for(i=0;i<2;i++);
GLCD_RESET=1;
GLCD_CS1=1;
GLCD_CS2=1;
write_GLCD_command(GLCD_ON);
write_GLCD_command(GLCD_START_LINE_0);
for(i=0;i<8;i++)
{
write_GLCD_command(SET_PAGE+i);
write_GLCD_command(SET_Y_ADDRESS_0);
for(j=0;j<64;j++)
write_GLCD_data(0);
}
}
void show_pattern(unsigned char page,unsigned char y,
unsigned char *pattern,unsigned char len)
{
int i;
write_GLCD_command(SET_PAGE+page);
write_GLCD_command(SET_Y_ADDRESS_0+y);
for(i=0;i<len;i++)
{
write_GLCD_data(*pattern);
pattern++;
}
}
void display_GLCD_data(unsigned char *p)
{
if (gx<64) {
GLCD_CS1=1;
GLCD_CS2=0;
show_pattern(gy,gx,p,8);
show_pattern(gy,gx+8,p+8,8);
show_pattern(gy+1,gx,p+16,8);
show_pattern(gy+1,gx+8,p+24,8);
} else
{
GLCD_CS1=0;
GLCD_CS2=1;
show_pattern(gy,gx-64,p,8);
show_pattern(gy,gx-58,p+8,8);
show_pattern(gy+1,gx-64,p+16,8);
show_pattern(gy+1,gx-58,p+24,8);
}
gx=gx+16;
}
void display_GLCD_string(unsigned char *p,int len)
{
int i;
for(i=0;i<len;i++)
display_GLCD_data((p+32*i));
}
void display_GLCD_number(char number)
{
int x,y;
x=number/10;
y=number%10;
display_GLCD_data(digit[x]);
display_GLCD_data(digit[y]);
}
void gotoxy(unsigned x,unsigned y)
{
gy=y;
gx=x;
}
void display_time(time dispaly_time)
{
gotoxy(0,2);
display_GLCD_number(dispaly_time.hour);
display_GLCD_data(comma);
display_GLCD_number(dispaly_time.minute);
display_GLCD_data(comma);
display_GLCD_number(dispaly_time.second);
}
void display_date(date tmp_date)
{
gotoxy(0,4);
display_GLCD_number(tmp_date.year);
display_GLCD_data(slash);
display_GLCD_number(tmp_date.month);
display_GLCD_data(slash);
display_GLCD_number(tmp_date.day);
}
char monthday(char year,char month)
{
if(month==2 && year%4==0) //润年的2月有29天
return(29);
else
return(dayofmonth[month-1]); //非闰年时的该月份天数
}
static void timer0_isr(void) interrupt 1 using 1
{
TR0=0;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
TR0=1;
timer0_tick++;
if (timer0_tick==100) {
timer0_tick=0;
now.second++;
if (now.second==60) {
now.second=0;
now.minute++;
if (now.minute==60) {
now.minute=0;
now.hour++;
if (now.hour==24) {
now.hour=0;
today.day++;
if (today.day>monthday(today.year,today.mont
h)) {
today.day=0;
today.month++;
if(today.month==13) {
today.month=1;
today.year++;
}
}
if(mode!=0) return;
display_date(today);
}
}
}
if(mode!=0) return;
display_time(now);
}
}
static void timer0_initialize(void)
{
EA=0;
timer0_tick=0;
TR0=0;
TMOD &= 0XF0;
TMOD |=0x01;
TL0=(TIMER0_COUNT & 0x00FF);
TH0=(TIMER0_COUNT >> 8);
PT0=0;
ET0=1;
TR0=1;
EA=1;
}
void delay(void)
{
unsigned char i,j;
for(i=0;i<125;i++)
for(j=0;j<255;j++)
;
}
char gotkey() {
if (mode_button==0) {
delay();
if (mode_button==0) return(0);
}
if (up_button==0) {
delay();
if (up_button==0) return(1);
}
return(15);
}
void main (void)
{
unsigned char keys,i=0;
clear_GLCD();
gotoxy(0,0);
display_GLCD_string(token,7);
display_time(now);
display_date(today);
timer0_initialize();
mode=0;
do {
switch(keys) {
case 0 :
mode++;
if(mode==6) {
mode=0;
now=display;
today=tmpday;
break;
}
if(mode==1) {
display=now;
tmpday=today;
break;
}
break;
case 1 :
if(mode==0) break;
switch(mode) {
case 1 : display.hour++;
if(display.hour>=24) display.hour=0;
display_time(display);
break;
case 2 : display.minute++;
if(display.minute>=60) display.minut
e=0;
display_time(display);
break;
case 3 : tmpday.year++;
if(tmpday.year>=100) tmpday.year=0;
display_date(tmpday);
break;
case 4 : tmpday.month++;
if(tmpday.month>12) tmpday.month=1;
display_date(tmpday);
break;
case 5 : tmpday.day++;
if(tmpday.day>monthday
(tmpday.year,tmpday.month))
tmpday.day=1;
display_date(tmpday);
break;
}
break;
}
} while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -