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

📄 lcd.c

📁 用AVR的MP3代码
💻 C
字号:
#include <iom64v.h>
#include <macros.h>
#include "lcd.h"
#include "delay.h"
#include "6x8.h"
#include "chinese.h"

/*-----------------------------------------------------------------------
LCD_write_byte: 使用SPI接口写数据到LCD
输入参数:data:写入的数据;
command :写数据/命令选择;
编写日期:2004-8-10 
最后修改日期:2006-10-23
-----------------------------------------------------------------------*/
void LCD_write_byte(unsigned char data, unsigned char command)
{
  SCE_L ;              // 使能LCD
  if (command == 0)
    DC_L ;             // 传送命令
  else
    DC_H ;             // 传送数据
  SPDR = data;         // 传送数据到SPI寄存器
  while ((SPSR & 0x80) == 0)
    ;                  // 等待数据传送完毕
  SCE_H ;              // 关闭LCD
}

/*---------------------------------------
LCD_init: 3310LCD初始化
编写日期:2004-8-10 
最后修改日期:2006-10-23
----------------------------*/
void LCD_Init(void)
{
  LCD_RES_DDR|=LCD_RES_BIT ;
  LCD_SCE_DDR|=LCD_SCE_BIT ;
  //LCD_SDIN_DDR|=LCD_SDIN_BIT ;
  //LCD_SCLK_DDR|=LCD_SCLK_BIT ;
  LCD_DC_DDR|=LCD_DC_BIT ;

  RES_L;                  // 产生一个让LCD复位的低电平脉冲
  delay_nus(100);
  RES_H ;
  SCE_L ;                 // 关闭LCD
  delay_nus(100);
  SCE_H;                  // 使能LCD
  delay_us();
  LCD_write_byte(0x21, 0);// 使用扩展命令设置LCD模式
  LCD_write_byte(0xc8, 0);// 设置偏置电压
  LCD_write_byte(0x06, 0);// 温度校正
  LCD_write_byte(0x13, 0);// 1:48
  LCD_write_byte(0x20, 0);// 使用基本命令
  LCD_clear();            // 清屏
  LCD_write_byte(0x0c, 0);// 设定显示模式,正常显示
  SCE_L ;                 // 关闭LCD
}

/*-----------------------------------------------------------------------
LCD_clear: LCD清屏函数
编写日期:2004-8-10 
最后修改日期:2006-10-23
-----------------------------------------------------------------------*/
void LCD_clear(void)
{
  unsigned int i;
  LCD_write_byte(0x0c, 0);
  LCD_write_byte(0x80, 0);
  for (i=0; i<504; i++)
    LCD_write_byte(0, 1);
}

/*-----------------------------------------------------------------------
LCD_set_XY: 设置LCD坐标函数
输入参数:X:0-83
Y:0-5
编写日期:2004-8-10 
最后修改日期:2006-10-23
-----------------------------------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
  LCD_write_byte(0x40 | Y, 0);// column
  LCD_write_byte(0x80 | X, 0);// row
}

/*-----------------------------------------------------------------------
LCD_write_char: 显示英文字符
输入参数:c:显示的字符;
编写日期:2004-8-10 
最后修改日期:2006-10-23
-----------------------------------------------------------------------*/
void LCD_write_char(unsigned char c)
{
  unsigned char line;
  c -= 32;
  for (line=0; line<6; line++)
    LCD_write_byte(font6x8[c][line], 1);
}

/*-----------------------------------------------------------------------
LCD_write_char: 英文字符串显示函数
输入参数:*s:英文字符串指针;
X、Y: 显示字符串的位置
编写日期:2004-8-10 
最后修改日期:2006-10-23
-----------------------------------------------------------------------*/
void LCD_write_String(unsigned char X,unsigned char Y,char *s)
{
  LCD_set_XY(X,Y);
  while (*s) 
  {
    LCD_write_char(*s);
    s++;
  }
}

/*-----------------------------------------------------------------------

LCD_write_chi: 在LCD上显示汉字
输入参数:X、Y:显示汉字的起始X、Y坐标;
ch_with :汉字点阵的宽度
num:显示汉字的个数;
line:汉字点阵数组中的起始行数
row:汉字显示的行间距
编写日期:2004-8-11 
最后修改日期:2006-10-23
-----------------------------------------------------------------------*/
void LCD_write_chi(unsigned char X, unsigned char Y, 
unsigned char ch_with,unsigned char num,
unsigned char line,unsigned char row)
{
  unsigned char i,n;
  LCD_set_XY(X,Y);//设置初始位置
  for (i=0;i<num;)
  {
    for (n=0; n<ch_with*2; n++)//写一个汉字
    { 
      if (n==ch_with)//写汉字的下半部分
        {
         if (i==0) 
		   LCD_set_XY(X,Y+1);
         else
           LCD_set_XY((X+(ch_with+row)*i),Y+1);
        }
      LCD_write_byte(china_char[line+i][n],1);
    }
    i++;
    LCD_set_XY((X+(ch_with+row)*i),Y);
  }
}

/*-----------------------------------------------------------------------
LCD_write_chi: 汉字移动
输入参数:X、Y:显示汉字的起始X、Y坐标;
T:移动速度;
编写日期:2004-8-13 
最后修改日期:2006-10-23
-----------------------------------------------------------------------*/
void LCD_move_chi(unsigned char X, unsigned char Y, unsigned char T)
{
  unsigned char i,n,j=0;
  unsigned char buffer_h[84]={0};
  unsigned char buffer_l[84]={0};
  for (i=0; i<144; i++)
  {
    buffer_h[83] = china_char[i/12][j];
    buffer_l[83] = china_char[i/12][j+12];
    j++;
    if (j==12) 
	  j=0;
    for (n=0; n<83; n++)
    { 
      buffer_h[n]=buffer_h[n+1];
      buffer_l[n]=buffer_l[n+1];
    } 
    LCD_set_XY(X,Y);
    for (n=0; n<83; n++)
    { 
      LCD_write_byte(buffer_h[n],1);
    } 
    LCD_set_XY(X,Y+1); 
    for (n=0; n<83; n++)
    { 
      LCD_write_byte(buffer_l[n],1);
    } 
    delay_nms(T);
  }
}

/*-----------------------------------------------------------------------
LCD_draw_map: 位图绘制函数
输入参数:X、Y:位图绘制的起始X、Y坐标;
*map:位图点阵数据;
Pix_x:位图像素(长)
Pix_y:位图像素(宽)
编写日期:2004-8-13
最后修改日期:2006-10-23 
-----------------------------------------------------------------------*/
void LCD_draw_map(unsigned char X,unsigned char Y,unsigned char *map,
unsigned char Pix_x,unsigned char Pix_y)
{
  unsigned int i,n;
  unsigned char row;
  if (Pix_y%8==0) 
    row=Pix_y/8;//计算位图所占行数
  else
    row=Pix_y/8+1;
  for (n=0;n<row;n++)
  {
    LCD_set_XY(X,Y);
    for(i=0; i<Pix_x; i++)
    {
      LCD_write_byte(map[i+n*Pix_x], 1);
    }
    Y++;//换行
  }
}

⌨️ 快捷键说明

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