单片机——LCD1602驱动

来源:互联网 发布:js 创建style标签 编辑:程序博客网 时间:2024/05/09 17:22
该程序的功能是用LCD1602来显示时钟,同时显示一个正在充电的电池图标,其中的lcd_char_sel()函数就是自己设计的电池图标
#include <reg52.h>
#include "./delay/delay.h"
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;
#define LCDPORT  P0
#define LCD_WRITE_DATA 1
#define LCD_WRITE_COM 0
unsigned char h = 10;
unsigned char s = 0;
unsigned char m = 0;
void timer0_init()
{
   EA = 1;
   TH0 = (65536 - 20000)/256;
   TL0 = (65536 - 20000)%256;
   TMOD |= 0x01;
   ET0 = 1;
   TR0 = 1;
}
void timer0_isr() interrupt 1
{
   static unsigned char i = 0; 
 
   TH0 = (65536 - 20000)/256;
   TL0 = (65536 - 20000)%256;
 
   i++;
   if(50 == i)
  {
     i = 0;
     s++;
     if(60 == s)
    {
       s = 0;
       m++;
       if(60 == m)
      {
         m = 0;
         h++;
         if(24 == h)
        {
           h = 0;
        }
      }
    }
    }
}
void lcd_write(unsigned char byte, unsigned char flag)
{
   if(flag)
  {
     RS = LCD_WRITE_DATA;
  }
  else
  {
     RS = LCD_WRITE_COM;
  }
  RW = 0;
  E = 1;
  LCDPORT = byte;
  delay_us(7);
  E = 0;
}
void lcd_init()
{
   delay_ms(5);
   lcd_write(0x38,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x38,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x38,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x08,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x01,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x06,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x0C,LCD_WRITE_COM);
}
void lcd_display(unsigned char x,unsigned char y,unsigned byte)
{
   if(y == 1)
  {
       lcd_write(0x80 + (unsigned int)x*0x01,LCD_WRITE_COM);
       lcd_write(byte,LCD_WRITE_DATA);
  }
  else
  {
     lcd_write(0x80 + 0x40 + (unsigned int)x*0x01,LCD_WRITE_COM);
       lcd_write(byte,LCD_WRITE_DATA);
  }
}
void lcd_str_display(unsigned char x,unsigned char y,unsigned *s)
{
   while(*s != '\0')
  {
     lcd_write_str(x,y++,*s);
     s++;
  }
}
void lcd_write_str(unsigned char *s)
{
   unsigned char i = 0;
  
   for(i =0 ; *s; i++)
  {
     lcd_write(0x80 + i,LCD_WRITE_COM);
     lcd_write(*s ,LCD_WRITE_DATA);
     s++;
  }
}
void lcd_dis_time()
{
   lcd_write(0x80 + 4, LCD_WRITE_COM);
 
   lcd_write((h/10) + 0x30, LCD_WRITE_DATA);
   lcd_write((h%10) + 0x30, LCD_WRITE_DATA);
   lcd_write(':', LCD_WRITE_DATA);
   lcd_write((m/10) + 0x30, LCD_WRITE_DATA);
   lcd_write((m%10) + 0x30, LCD_WRITE_DATA);
   lcd_write(':', LCD_WRITE_DATA);
   lcd_write((s/10) + 0x30, LCD_WRITE_DATA);
   lcd_write((s%10) + 0x30, LCD_WRITE_DATA);
}
void lcd_char_sel()
{
   static unsigned char i = 1;
 
   lcd_write(0x40, LCD_WRITE_COM);
   lcd_write(0x0,LCD_WRITE_DATA);
   lcd_write(0x0,LCD_WRITE_DATA);
   lcd_write(0x0a,LCD_WRITE_DATA);
   lcd_write(0x0,LCD_WRITE_DATA);
   lcd_write(0x0,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x0e,LCD_WRITE_DATA);
   lcd_write(0x0,LCD_WRITE_DATA);
 
   lcd_write(0x80 + 0x40, LCD_WRITE_COM);
   lcd_write(0x0,LCD_WRITE_DATA);
 
   lcd_write(0x40 + 8, LCD_WRITE_COM);
   lcd_write(0x04,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
  
  
  lcd_write(0x80 + 0x40 + 1, LCD_WRITE_COM);
   //lcd_write(0x1,LCD_WRITE_DATA);
  
  //delay_s(1);
  
  lcd_write(0x40 + 16, LCD_WRITE_COM);
   lcd_write(0x04,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
  
  lcd_write(0x80 + 0x40 + 1, LCD_WRITE_COM);
   //lcd_write(0x2,LCD_WRITE_DATA);
  
  //delay_s(1);
  
  lcd_write(0x40 + 24, LCD_WRITE_COM);
   lcd_write(0x04,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
  
  lcd_write(0x80 + 0x40 + 1, LCD_WRITE_COM);
   //lcd_write(0x3,LCD_WRITE_DATA);
  
  //delay_s(1);
  
  lcd_write(0x40 + 32, LCD_WRITE_COM);
   lcd_write(0x04,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
  
  lcd_write(0x80 + 0x40 + 1, LCD_WRITE_COM);
   //lcd_write(0x4,LCD_WRITE_DATA);
  
  //delay_s(1);
  
  lcd_write(0x40 + 40, LCD_WRITE_COM);
   lcd_write(0x04,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
  
  lcd_write(0x80 + 0x40 + 1, LCD_WRITE_COM);
   //lcd_write(0x5,LCD_WRITE_DATA);
  
  //delay_s(1);
     
     lcd_write(i,LCD_WRITE_DATA);
    i++;
     if(6 == i)
    {
       i = 1;
    }
  
}
void main()
{
   lcd_init();
  
   timer0_init();
   //lcd_display(5,1,'a');
 
   //lcd_write_str("aabbc");
 
   while(1)
  {
     lcd_dis_time();
     lcd_char_sel();
     delay_s(1);
  }
}
0 0