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

📄 ex5-7.c

📁 < 嵌入式C语言程序设计>>一书的源代码
💻 C
字号:
/*
标题:范例 5-7
版本:1.0
Target:89S51
程序描述:这个程序利用89X51连接绘图型LCD,然后显示出:
现在时间是:
12:30:00
/05/09/01 */
/* ***************************************************** */
#include <REGX51.H>

/* 绘图型LCD 指令 */
#define  GLCD_OFF               62 //关闭绘图型LCD
#define  GLCD_ON                63 //打开绘图型LCD
#define  GLCD_START_LINE_0     192 //设定绘图型LCD左半边的起始行
#define  SET_PAGE              184 //设定绘图型LCD的页数
#define  SET_Y_ADDRESS_0        64 //设定绘图型LCD的y轴位置
#define  CLEAR                   0  //清除绘图型LCD
/* 绘图型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
typedef  struct {
         char    hour;
         char    minute;
         char    second;
} time;
typedef  struct {
         char    year;
         char    month;
         char    day;
} date;
time now;
date today;
unsigned char gx,gy;
static unsigned timer0_tick;
char code int2char[]="0123456789";
char code monthday[]={31,28,31,30,31,30,31,31,30,31,30,31};
char code weekday[7][4]={"MON","TUE","WED","THU","FRI","SAT",
                         "SUN"};
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 yearp[4][8]=
{
{0X08,0X00,0X08,0X08,0X0F,0XFC,0X11,0X00},
{0X21,0X10,0X5F,0XF8,0X11,0X00,0X11,0X00},
{0X11,0X04,0XFF,0XFE,0X01,0X00,0X01,0X00},
{0X01,0X00,0X01,0X00,0X00,0X00,0X00,0X00}};
//星
unsigned char code weekp[2][4][8]=
{{
{0X3F,0XF8,0X20,0X08,0X3F,0XF8,0X20,0X08},
{0X3F,0XF8,0X01,0X00,0X21,0X08,0X3F,0XFC},
{0X21,0X00,0X41,0X10,0XBF,0XF8,0X01,0X00},
{0X01,0X04,0XFF,0XFE,0X00,0X00,0X00,0X00}},
//期
{
{0X22,0X04,0X22,0X7E,0X7F,0X44,0X22,0X44},
{0X3E,0X7C,0X22,0X44,0X3E,0X44,0X22,0X44},
{0X22,0X7C,0XFF,0XC4,0X24,0X44,0X22,0X84},
{0X41,0X14,0X82,0X08,0X00,0X00,0X00,0X00}}};
unsigned char code weekdayp[7][4][8]=
{{
//一
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X04,0XFF,0XFE},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00}},
//二
{
{0X00,0X00,0X00,0X00,0X00,0X10,0X3F,0XF8},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X04},
{0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00}},
//三
{
{0X00,0X00,0X00,0X08,0X7F,0XFC,0X00,0X00},
{0X00,0X00,0X00,0X00,0X00,0X10,0X3F,0XF8},
{0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X04},
{0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00}},
//四
{
{0X00,0X00,0X00,0X04,0XFF,0XFE,0X44,0X44},
{0X44,0X44,0X44,0X44,0X44,0X44,0X44,0X44},
{0X48,0X3C,0X50,0X04,0X40,0X04,0X7F,0XFC},
{0X40,0X04,0X00,0X00,0X00,0X00,0X00,0X00}},
//五
{
{0X00,0X08,0X7F,0XFC,0X02,0X00,0X02,0X00},
{0X02,0X00,0X02,0X10,0X3F,0XF8,0X04,0X10},
{0X04,0X10,0X04,0X10,0X08,0X10,0X08,0X10},
{0X08,0X10,0XFF,0XFE,0X00,0X00,0X00,0X00}},
//六
{
{0X04,0X00,0X02,0X00,0X03,0X00,0X01,0X04},
{0XFF,0XFE,0X00,0X00,0X00,0X00,0X04,0X40},
{0X0C,0X20,0X08,0X10,0X10,0X18,0X10,0X0C},
{0X20,0X0C,0X40,0X04,0X00,0X00,0X00,0X00}},
//日
{
{0X00,0X10,0X3F,0XF8,0X20,0X10,0X20,0X10},
{0X20,0X10,0X20,0X10,0X3F,0XF0,0X20,0X10},
{0X20,0X10,0X20,0X10,0X20,0X10,0X20,0X10},
{0X3F,0XF0,0X20,0X10,0X00,0X00,0X00,0X00}}};
//月
unsigned char code monthp[4][8]=
{
{0X00,0X10,0X1F,0XF8,0X10,0X10,0X10,0X10},
{0X1F,0XF0,0X10,0X10,0X10,0X10,0X1F,0XF0},
{0X10,0X10,0X10,0X10,0X10,0X10,0X10,0X10},
{0X20,0X50,0X40,0X20,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 delay(void)  {                  
  unsigned char i,j;                
     for (i=0;i<255;i++)
          for(j=0;j<255;j++)
          ;
}
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;       // P2_6 = 0
     GLCD_D_I=COMMAND;     // P2_5 = 0
     GLCD_ENABLE=ENABLE;   // P2_7=1
     P0=command;           // 从 P0 送出 command
     GLCD_ENABLE=DISABLE;  // P2_7=0
     GLCD_D_I=1;           // P2_5 = 1
     GLCD_R_W=1;           // P2_6 = 1
// 检查忙碌标记,直到绘图型LCD不忙碌时就返回
     check_GLCD_busyflag();
}
void write_GLCD_data(unsigned GLCDdata)
{
     GLCD_R_W=WRITE;       // P2_6 = 0
     GLCD_D_I=DATA;        // P2_5 = 1
     GLCD_ENABLE=ENABLE;   // P2_7=1
     P0=GLCDdata;          // 从 P0 送出 数据
     GLCD_ENABLE=DISABLE;  // P2_7= 0
     GLCD_D_I=0;           // P2_5 = 0
     GLCD_R_W=1;           // P2_6 = 1
// 检查忙碌标记,直到绘图型LCD不忙碌时就返回
     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 clear_pattern(unsigned char page,unsigned char y,
                   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(CLEAR);
}
unsigned char read_GLCD_data(void)
{
     unsigned char x;
     GLCD_D_I=DATA;
     GLCD_R_W=READ;
     GLCD_ENABLE=ENABLE;
     P0=255;
     x=P0;
     GLCD_ENABLE=DISABLE;
     GLCD_D_I=0;
     check_GLCD_busyflag();
     GLCD_D_I=DATA;
     GLCD_ENABLE=ENABLE;
     x=P0;
     GLCD_ENABLE=DISABLE;
     check_GLCD_busyflag();
     return x;
}
void putpixel(unsigned char x,unsigned char y)
{
     unsigned char i=1,temp,page_no;
     if(x<64) {
          GLCD_CS1=0;
          GLCD_CS2=1;
     } else
     {
          GLCD_CS1=1;
          GLCD_CS2=0;
          x=x-64;
     }
     write_GLCD_command(SET_Y_ADDRESS_0+y);
     page_no=SET_PAGE+x/8;
     write_GLCD_command(page_no);
     temp=x%8;
     while(temp) {
          i=i*2;
          temp--;
     }
     temp=read_GLCD_data();
     i=i | temp;
     write_GLCD_command(page_no);
     write_GLCD_data(i);
}       
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 main (void)
{
     unsigned char i=0;
     clear_GLCD();
     gotoxy(0,0);
     display_GLCD_string(token,7);    //显示 现在时间是:
     now.hour=12;
     now.minute=30;
     now.second=0;
     gotoxy(0,4);
     display_GLCD_number(now.hour);   // 显示 12:00:00
     display_GLCD_data(comma);
     display_GLCD_number(now.minute);
     display_GLCD_data(comma);
     display_GLCD_number(now.second);
     today.year=5;
     today.month=9;
     today.day=1;
     gotoxy(0,6);
     display_GLCD_number(today.year);  // 显示 05/09/01
     display_GLCD_data(slash);
     display_GLCD_number(today.month);
     display_GLCD_data(slash);
     display_GLCD_number(today.day);
     while(1);                         /* 无穷循环 */
}

⌨️ 快捷键说明

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