您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>C/C++语言编程>

自编字型图案及LCD文字显示实验案例

大小:0.1 MB 人气: 2017-09-06 需要积分:0
自编字型图案及LCD文字显示实验案例

1、自编字型图案实验

/*自编字型图案实验(ch13-6-2.c)适用於89S51线上烧录实验板(USB版)*/
#include 
#define LCDP  P0 // 定义LCM 资料汇流排接至P0
sbit RS = P3^2;  // 暂存器选择位元(0:指令,1:资料)
sbit RW = P3^1;  // 设定读写位元 (0:写入,1:读取)
sbit E =  P3^0;  // 致能位元 (0:禁能,1:致能)
sbit BF = P0^7;  // 忙碌检查位元(0:不忙,1:忙碌)
char count=20; // 中断次数计数,20次*50ms=1秒 
char time[10];   // 显示时间阵列(第1行)
/* 声明自定义字型阵列变量 */
char code am[32] = {  // 显示上三角及AM
0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x07, 0xE0,
0x0F, 0xF0, 0x1F, 0xF8, 0x3F, 0xFC, 0x7F, 0xFE,
0x00, 0x00, 0x18, 0x44, 0x24, 0x6C, 0x24, 0x6C,
0x3C, 0x54, 0x24, 0x54, 0x24, 0x44, 0x00, 0x00};
char code pm[32] = { // 显示下三角及PM
0x00, 0x00, 0x7F, 0xFE, 0x3F, 0xFC, 0x1F, 0xF8,
0x0F, 0xF0, 0x07, 0xE0, 0x03, 0xC0, 0x01, 0x80, 
0x00, 0x00, 0x38, 0x44, 0x24, 0x6C, 0x24, 0x6C,
0x38, 0x54, 0x20, 0x54, 0x20, 0x44, 0x00, 0x00};
bit  ampm=1;   // 0:上午(am),1:下午(pm),初值下午 
char  hour=11;   // 声明时,初值为11点 
char  minute=59;  // 声明分,初值为59分 
char  second=50;  // 声明秒,初值为50秒 
void transfer(void); // 转换时分秒至time阵列中 
void write_inst(char);  // 写入指令函数 
void write_char(char);  // 写入字元函数 
void write_pat(void);  // 写入自建字型函数 
void check_BF(void);  // 检查忙碌函数 
void init_LCM(void);  // 声明LCM初始设定函数 
//===========主程式=============================
main()
{ char i;
 init_LCM();    // 初始设定 
 write_pat();    // 写入自建字型 
 IE=0X82;     // Timer 0中断致能 
 TMOD=0x01;     // T0设为MODE1
 TH0=(56636-50000) / 256; // 填入计时量之高位元组 
 TL0=(56636-50000) % 256; // 填入计时量之低位元组 
 TR0=1;      // 启动Timer 0
 while(1)     // 无穷循环 
 { transfer();    // 转换时分秒至time阵列中  
  write_inst(0x80);  // 指定第1列位置 
  for (i=0;i<10;i++)  // 循环 
   write_char(time[i]);// 显示时间     
 }       // while结束 
}        // main() 结束 
//====转换函数===================
void transfer(void)
{ time[0]= hour/10 + 0x30; // 时数之十位数显示资料 
 time[1]= hour%10 + 0x30; // 时数之个位数显示资料 
 time[2]= ':';    // 显示冒号  
 time[3]= minute/10 + 0x30; // 分数之十位数显示资料 
 time[4]= minute%10 + 0x30; // 分数之个位数显示资料 
 time[5]= ':';    // 显示冒号 
 time[6]= second/10 + 0x30; // 秒数之十位数显示资料 
 time[7]= second%10 + 0x30; // 秒数之个位数显示资料 
 time[8]=0x00;    // 自键字型之高位元组 
 if (ampm==0)      // 判定是否为上午 
  time[9]=0x00;   // 表示上午之自键字型 
 else time[9]=0x02;   // 表示下午之自键字型  
}        // transfer()函数结束 
//====写入自建字型函数===================
void write_pat(void)
{ char i;
 write_inst(0x40);   // 设定CGRAM的位置 
 for (i=0;i<32;i++)
  write_char(am[i]);  // 写入上午之自键字型 
 for (i=0;i<32;i++)
  write_char(pm[i]);  // 写入下午之自键字型  
}        // write_pat()函数结束 
//===== Timer 0中断副程式 =======================
void clock(void) interrupt 1 // T0中断副程式 
{ TH0=(56636-50000)/256;  // 填入计时量 
 TL0=(56636-50000)%256;  // 填入计时量 
 if (--count==0)    // 中断次数是否达到20次 
 { count=20;    // 重新计次 
  second++;    // 秒数加1 
  if (second>=60)   // 是否达到60秒 
  { second=0;   // 秒数归零 
   minute++;   // 分数加1 
   if (minute>=60)  // 是否达到60分 
   { minute=0;  // 分数归零 
    hour++;   // 时数加1 
    if (hour == 13) // 是否达到13小时 
     hour=1;  // 时数改为1 
    if (hour == 12) // 是否达到12小时 
     ampm=~ampm; // 切换上下午 
} } } }     // 结束 
//====初始设定函数(8位元传输模式)===================
void init_LCM(void)
{ write_inst(0x30); // 设定功能-8位元-基本指令 
 write_inst(0x30); // 设定功能-8位元-基本指令 
 write_inst(0x30); // 英文LCM相容设定,中交LCM可忽略 
 write_inst(0x38); // 英文LCM设定两列,中交LCM可忽略 
 write_inst(0x08); // 显示功能-关显示幕-无游标-游标不闪 
 write_inst(0x01); // 清除显示幕(填0x20,I/D=1)
 write_inst(0x06); // 输入模式-位址递增-关显示幕   
 write_inst(0x0c); // 显示功能-开显示幕-无游标-游标不闪 
}      // init_LCM()函数结束 
//==== 写入指令函数 ================================
void write_inst(char inst)
{ check_BF();   // 检查是否忙碌 
 LCDP = inst;  // LCM读入MPU指令 
 RS = 0; RW = 0; E = 1; // 写入指令至LCM
 check_BF();      // 检查是否忙碌  
}      // write_inst()函数结束 
//==== 写入字元资料函数 ============================
void write_char(char chardata)
{ check_BF();   // 检查是否忙碌 
 LCDP = chardata; // LCM读入字元 
 RS = 1; RW = 0 ;E = 1; // 写入资料至LCM
 check_BF();   // 检查是否忙碌 
}      // write_char()函数结束 
//====检查忙碌函数================================
void check_BF(void)
{ E=0;    // 禁止读写动作 
 do     // do-while循环开始 
 {  BF=1;   // 设定BF为输入  
    RS = 0; RW = 1;E = 1;  // 读取BF及AC
 }while(BF == 1); // 忙碌继续等 
}      // check_BF()函数结束 
 
 
 

2、LCD文字显示实验

/*LCD文字显示实验(ch13-6-1.c)适用於89S51线上烧录实验板(USB版)*/
#include
#define LCDP  P0 // 定义LCM 资料汇流排接至P0
sbit RS = P3^2; // 暂存器选择位元(0:指令,1:资料)
sbit RW = P3^1; // 设定读写位元 (0:写入,1:读取)
sbit E = P3^0; // 致能位元 (0:禁能,1:致能)
sbit BF = P0^7; // 忙碌检查位元(0:不忙,1:忙碌)
char line1[]="LCM test program";// 第1次显示字串(第1行)
char line2[]="Everything is OK";// 第1次显示字串(第2行)
char line3[]="中文LCM 测试程序";// 第2次显示字串(第1行)
char line4[]="一切正常欢迎使用";// 第2次显示字串(第2行)
void init_LCM(void); // 初始设定函数 
void write_inst(char); // 写入指令函数 
void write_char(char); // 写入字元资料函数 
void check_BF(void); // 检查忙碌函数 
void delay1ms(int);  // 延迟函数  
// ============ 主程序 ===========================
main()
{ char i;       // 声明变量 
 init_LCM();      // 初始设定 
 while(1)      // 无尽循环 
 //=====LCM test program ======
 { write_inst(0x80);   // 指定第一列位置 
  for (i=0;i<16;i++)   // 循环 
   write_char(line1[i]); // 显示16个字 
 //=====Everything is OK ======
  write_inst(0x90);   // 指定第二列位置 
  for (i=0;i<16;i++)   // 循环 
   write_char(line2[i]); // 显示16个字 
  delay1ms(2000);    // 延迟2秒 
  //===== 中文LCM 测试程序 ======
  write_inst(0x80);   // 指定第一列位置 
  for (i=0;i<16;i++)   // 循环 
   write_char(line3[i]); // 显示16个字 
  //===== 一切正常欢迎使用 ======
  write_inst(0x90);   // 指定第二列位置 
  for (i=0;i<16;i++)   // 循环 
   write_char(line4[i]); // 显示16个字 
  delay1ms(2000);    // 延迟2秒 
 }        // while结束 
}         // 主程序main()结束 
//====初始设定函数(8位元传输模式)===================
void init_LCM(void)
{ write_inst(0x30); // 设定功能-8位元-基本指令 
 write_inst(0x30); // 设定功能-8位元-基本指令 
 write_inst(0x30); // 英文LCM相容设定,中交LCM可忽略 
 write_inst(0x38); // 英文LCM设定两列,中交LCM可忽略 
 write_inst(0x08); // 显示功能-关显示幕-无游标-游标不闪 
 write_inst(0x01); // 清除显示幕(填0x20,I/D=1)
 write_inst(0x06); // 输入模式-位址递增-关显示幕 
 write_inst(0x0c); // 显示功能-开显示幕-无游标-游标不闪  
}      // init_LCM()函数结束 
//==== 写入指令函数 ================================
void write_inst(char inst)
{ check_BF();    // 检查是否忙碌 
 LCDP = inst;   // LCM读入MPU指令 
 RS = 0; RW = 0; E = 1; // 写入指令至LCM
 check_BF();    // 检查是否忙碌 
}       // write_inst()函数结束 
//==== 写入字元资料函数 ============================
void write_char(char chardata)
{ check_BF();    // 检查是否忙碌 
 LCDP = chardata;  // LCM读入字元 
 RS = 1; RW = 0 ;E = 1; // 写入资料至LCM
 check_BF();    // 检查是否忙碌 
}       // write_char()函数结束 
//====检查忙碌函数================================
void check_BF(void)
{ E=0;     // 禁止读写动作 
 do      // do-while循环开始 
 {  BF=1;    // 设定BF为输入 
   RS = 0; RW = 1;E = 1; // 读取BF及AC
 }while(BF == 1);  // 忙碌继续等 
}       // check_BF()函数结束 
//==== 延迟函数 ================================
void delay1ms(int x)
{ int i,j;    // 声明变量 
 for (i=1;i   for (j=1;j<120;j++);// 执行120次,延迟1ms
}       // delay1ms()函数结束 
 

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!