注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
张泽龙的个人空间 https://home.eeworld.com.cn/space-uid-126438.html [收藏] [复制] [分享] [RSS]
日志

1602

已有 1118 次阅读2009-11-30 01:05

/*1602显示库函数,硬件接法为:8位数据线接P1口(依次对应),
     LCD的RS接P3_0,LCD的RW接P3_1,LCD的E接P3_2*/
#include<reg51.h>
#include<INTRINS.H> //代码中引用_nop_()函数
/*宏定义 uint 和 uchar 简化代码,提高编绎效率*/
#define uint unsigned int 
#define uchar unsigned char
sbit LCD_RS=P3^0;
sbit LCD_RW=P3^1;
sbit LCD_E=P3^2;
void delay1()//延时5个机器周期
 {
   _nop_();
   _nop_();
   _nop_();
 }
/*uchar lcd_r_start()  读状态函数,返回状态值
   条件: LCD_RW=1;LCD_RS=0; E为一个下降沿
   目的:   最高位D7=0,LCD控制空闲,D7=1,LCD控制忙。
              用作写命令和写数据时查忙*/  
uchar lcd_r_start()   //读状态
 {
    uchar s;
    LCD_RW=1;
    LCD_RS=0;
    //LCD_E=0;
    P1=0XFF;
    _nop_();
    s=P1;
    delay1();
    LCD_E=1;
    LCD_E=0;
    LCD_RW=0;
    s=0;
    return(s);
 }

/* busy{}:查忙函数,用作每次写命令和写数据时查忙调用*/
void busy()
{
  uchar i=0xff;
   do{
       i=lcd_r_start();
       i&=0x80;
       delay1();
      }while(i!=0);
}

/*void lcd_w_cmd(uchar com):写命令字函数,
    条件:  LCD_RW=0; LCD_RS=0; E为一个下降沿
    作用:初始化LCD以及写数据位置*/
void lcd_w_cmd(uchar com)
 {
     busy();
     LCD_RW=0;
   LCD_RS=0;
   //LCD_E=0;
     P1=com;
   delay1();
   LCD_E=1;
   LCD_E=0;
   LCD_RW=1;
   delay1();
 }
/*void lcd_w_dat(uchar dat):写数据函数,
      条件:LCD_RW=0;LCD_RS=1;E为一个下降沿
      作用:写入每次要显示的字符*/
void lcd_w_dat(uchar dat)
 {
               busy();
               LCD_RW=0;
               LCD_RS=1;
               //LCD_E=0;
               P1=dat;
               delay1();
               LCD_E=1;
               LCD_E=0;
               LCD_RW=1;
               delay1();
 }
void delay_1s() //用定时器控制1S延时函数,使用定时器工作方式0(13位)
 {
   uchar i;
  for(i=0;i<200;i++)
       {
      TH1=0X63;//置定定时器初值8192-5000=3192=C78H=0110 0011  1 1000B
    TL1=0X18; //写入是TL1的高3位加零得0110 0011 0001 1000 即63 18
    TR1=1;//开启定时器T1
    while(!TF1);//查询计数器是否溢出,即5ms时间到,TF1=1;
    TF1=0;//软件清零标志位
       }
}
 void int1()  //初始化
  {
     lcd_w_cmd(0x38);/*设置工作方式 ,设置数据位数为8位,2行显示,5*10点阵字符 
                       001 DL N F * *  DL=1:8位,DL=0:4位;N =1:1行,
                        N=0:2行;F=1:5*10,F=0:5*7;*/
   lcd_w_cmd(0x0c);/*显示状态设置,打开LCD显示,光标不显示,光标位字符不闪烁
                      0000 1 D C B  :D=1:开显示;C=0:不显示光标;B=0:光标位字符不闪烁*/
   lcd_w_cmd(0x01);//清屏,将光标设置为第1行第1列
   lcd_w_cmd(0x06);/*输入方式设置,设置光标增量方式右移,显示字符不移动
                      0000  01   I/D  S :I/D=1:增量方式右移,I/D=0:减量方式左移;S=1:整屏移,
                      S=0:整屏不移动*/
     lcd_w_cmd(0x80);/*初始显示位置设置,第一行地址为0X80~0X8F;第二行地址为0XC0~0XCF */ 
    
   delay1();//延时缓冲
 } 
/****字符显示****/
/*void main()
 {
    uchar i=0;
    uchar code tab[]="China";
    TMOD=0x00;   //设置定时计数器工作方式为13位定时器
  
    int1();//初始化
  delay1();
    lcd_w_cmd(0x83);  //设置初始显示位置
   delay1();
  
    while(tab[i]!='\0')    //判断显示字符是否结束
      {
          
          lcd_w_dat(tab[i]);
          delay_1s();i++;
        }
    while(1);
}*/
/****时钟****/
void main()
 {
   uchar HH,MM,SS;
 TMOD=0x00;
   int1();delay_1s();
   lcd_w_cmd(0x86);
   lcd_w_dat(':');
   lcd_w_cmd(0x89);
   lcd_w_dat(':');
   for(HH=0;HH<24;HH++)
   {
      lcd_w_cmd(0x84);
        lcd_w_dat(HH/10+0X30);
      lcd_w_dat(HH%10+0x30);
     for(MM=0;MM<60;MM++)
       {
           lcd_w_cmd(0x87);
            lcd_w_dat(MM/10+0X30);
          lcd_w_dat(MM%10+0x30);
   for(SS=0;SS<60;SS++)
     {
       lcd_w_cmd(0x8a);
         lcd_w_dat(SS/10+0X30);
        lcd_w_dat(SS%10+0x30);
        delay_1s();
      }
       
        }
 
     }
  // while(1) ;
 }
    
发表评论 评论 (2 个评论)
回复 小志 2009-11-30 17:28
呵呵,楼主好性情
回复 张泽龙 2009-12-6 15:26
刚学,刚学写得麻烦点,见惊!

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章