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

📄 lcd.c

📁 这是一个AVR的单片机程式。能实现对一个中断端口进行计数、显示。有比较全面的按键功能。
💻 C
📖 第 1 页 / 共 2 页
字号:
char read_status()//判断"忙"子程序
{
 	char rb;
	PORTB=0xff;
    DDRB=0x0;   //端口B设为输入方式
    E_L;
    RS_L;
    RW_H;
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    E_H;
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    rb=PINB;
    rb=rb&0x80;
    E_L;
    DDRB=0xff;  //端口B设为输出方式
    return rb;
}

void init_prog(void)//初始化
{
 //REST_L;
 //REST_H;
 //delay_1ms();
 com = 0xc0;//第'0'行开始
 wr_command1();
 wr_command2();
 com = 0x3f;//第'0'列开始
 wr_command1();
 wr_command2();
}

void clear_prog(void)
{
 unsigned int i;
 unsigned int j;
 for(i=0;i<8;i++)
 {
  com = (0xb8 + i);//页面地址设置
  wr_command1();
  wr_command2();
  com = 0x40;//起始列地址设置
  wr_command1();
  wr_command2();
  for(j=0;j<64;j++)
  {
   dat = 0;//RAM清零
   wr_data1();
   wr_data2();
  }
 }
}
void clear_area(unsigned char X0,unsigned char Y0,unsigned char len)
{
    unsigned char i;
    unsigned char temp;

    for(temp = 0; temp < len; temp++)
    {
        Lcd_set_XY(X0,Y0);
        if(flag2 == 0)//显示在左半屏
        {

           for(i=0;i<8;i++)//字符上半部分
           {
            dat = 0;
            wr_data1();
           }
           com = (0xb8 + page +1);//下半个字符页面地址设置
           wr_command1();
           com = (0x40 + column);//起始列地址设置
           wr_command1();
           for(i=8;i<16;i++)//字符下半部分
           {
            dat = 0;
            wr_data1();
           }
          }
          else//显示在右半屏
          {
               for(i=0;i<8;i++)//字符上半部分
               {
                dat = 0;
                wr_data2();
               }
               com = (0xb8 + page +1);//下半个字符页面地址设置
               wr_command2();
               com = (0x40 + column );//起始列地址设置
               wr_command2();
               for(i=8;i<16;i++)//字符下半部分
               {
                dat = 0;
                wr_data2();
               }
          }
         Y0 += 1;
         if(Y0>15)//换行
         {
          X0 +=1;
          Y0 -=16;
         }
    }
}


void display_prog()//显示程序
{
 unsigned int m;
 unsigned int n;
 for(page=0;page<8;page++)
 {
  com = (0xb8 + page);//页面地址设置
  wr_command1();
  wr_command2();
  com = 0x40;//起始列地址设置
  wr_command1();
  wr_command2();
  for(m=0;m<64;m++)
  {
   dat = Bmp052[128*page + m];//(1-64列)取数据
   wr_data1();
  }
  for(n=64;n<128;n++)
  {
   dat = Bmp052[128*page + n];//(65-128列)取数据
   wr_data2();
  }
 }
}

void wr_command1(void)//写命令(1-64列)子程序
{
 CS1_H;
 CS2_L;
 while(read_status() != 0);
 //read_status();
 RS_L;
 RW_L;
 PORTB = com;
 E_H;
 //delay_1ms();
 E_L;
}

void wr_command2(void)//写命令(65-128列)子程序
{
 CS1_L;
 CS2_H;
 while(read_status() != 0);
 //read_status();
 RS_L;
 RW_L;
 PORTB = com;
  asm("NOP");
E_H;
 //delay_1ms();
 E_L;
}

void wr_data1()//写数据(1-64列)子程序
{
 CS1_H;
 CS2_L;
 while(read_status() != 0 );
 RS_H;
 RW_L;
 PORTB = dat;
 E_H;
 asm("NOP");
 E_L;
}
void wr_data2(void)//写数据(65-128列)子程序
{
 CS1_L;
 CS2_H;
 while(read_status() != 0);
 RS_H;
 RW_L;
 PORTB = dat;
 E_H;
 asm("NOP");
 E_L;
}

//设置LCD坐标.8页分为4行显示,X(行):0-3;Y(列):0-15,0-7为左半屏,8-15为右半屏
void Lcd_set_XY(unsigned char X0,unsigned char Y0)
{
 if(Y0<=7)//左半屏
 {
  com = (0xb8 + X0 * 2);//页面地址设置
  page = X0 * 2;
  wr_command1();
  com = (0x40 + Y0 * 8);//起始列地址设置
  column = Y0 * 8;
  wr_command1();
  flag2 = 0;
 }
 else//右半屏
 {
  com = (0xb8 + X0 * 2);//页面地址设置
  page = X0 * 2;
  wr_command2();
  com = (0x40 + ((Y0-8) * 8));//起始列地址设置
  column = (Y0 -8)* 8;
  wr_command2();
  flag2 = 1;
 }
  X1 = X0;
  Y1 = Y0;
}

void Lcd_write_char(unsigned char wb)
{	
 unsigned char i;
 Lcd_set_XY(X1,Y1);
 //wb -= 48;
 if(wb >= 0x20)
   wb -= 0x20;
 else
   wb = 0x20;
 if(wb<=96)//0,1,2,3,4,5,6,7,8,9
 {
  if(flag2 == 0)//显示在左半屏
  {
   for(i=0;i<8;i++)//字符上半部分
   {
    dat = ASC_MSK[wb][i];
    wr_data1();
   }
   com = (0xb8 + page +1);//下半个字符页面地址设置
   wr_command1();
   com = (0x40 + column);//起始列地址设置
   wr_command1();
   for(i=8;i<16;i++)//字符下半部分
   {
    dat = ASC_MSK[wb][i];
    wr_data1();
   }
  }//end if flag2==0
  else//显示在右半屏
  {
   for(i=0;i<8;i++)//字符上半部分
   {
    dat = ASC_MSK[wb][i];
    wr_data2();
   }
   com = (0xb8 + page +1);//下半个字符页面地址设置
   wr_command2();
   com = (0x40 + column );//起始列地址设置
   wr_command2();
   for(i=8;i<16;i++)//字符下半部分
   {
    dat = ASC_MSK[wb][i];
    wr_data2();
   }
  }//end else
 }//end if 0-9
 Y1 += 1;
 if(Y1>15)//换行
 {
  X1 +=1;
  Y1 -=16;
 }
}


//写ASCII字符串函数.X(行):0-3;Y(列):0-15,0-7为左半屏,8-15为右半屏
void Lcd_write_string(unsigned char X0,unsigned char Y0,unsigned char *s)
{
 while((*s)!=0)
  {
    delay();
    delay();
    Lcd_set_XY(X0,Y0);
	Lcd_write_char(*s);
	Y0++;
	s++;
	if(Y0>15)//换行
	{
	 X0 +=1;
	 Y0 -=16;
	}
  }
 // add
 Y1 += 1;
 if(Y1>15)//换行
 {
  X1 +=1;
  Y1 -=16;
 }
}

void Lcd_write_hanzi_GH(unsigned char wb)
{	
 unsigned char i;

  if(flag2 == 0)//显示在左半屏
  {
   for(i=0;i<16;i++)//字符上半部分
   {
    dat = hanzi[wb][i];
    wr_data1();
   }
   com = (0xb8 + page +1);//下半个汉字页面地址设置
   wr_command1();
   com = (0x40 + column);//起始列地址设置
   wr_command1();
   for(i=16;i<32;i++)//汉字下半部分
   {
    dat = hanzi[wb][i];
    wr_data1();
   }
  }
  else//显示在右半屏
  {
   for(i=0;i<16;i++)//汉字上半部分
   {
    dat = hanzi[wb][i];
    wr_data2();
   }
   com = (0xb8 + page +1);//下半个汉字页面地址设置
   wr_command2();
   com = (0x40 + column );//起始列地址设置
   wr_command2();
   for(i=16;i<32;i++)//汉字下半部分
   {
    dat = hanzi[wb][i];
    wr_data2();
   }
  }
}

void Lcd_write_hanzi_string_GH(unsigned char X0,unsigned char Y0,unsigned char *s)
{

   char c1,c2;
   unsigned int i;

   while((*s)!=0)
   {
       c1 = *s;
       c2 = *(s + 1);
       for(i = 0; i < sizeof(hanzi_Tab)/3; i ++)
       {
         if((c1 == (char)hanzi_Tab[i][0]) && (c2 == (char)hanzi_Tab[i][1]))
         {
           Lcd_set_XY(X0,Y0);
           Lcd_write_hanzi_GH((unsigned char)i);
           Y0 += 2;
           break;
         }
       }
       s++;
       if(Y0>15)//换行
       {
            X0 +=1;
            Y0 -=16;
        }
    }
    X1 = X0;
    Y1 = Y0+1;
}

⌨️ 快捷键说明

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