📄 lcd.c
字号:
#include <avr/io.h>
#include <avr/eeprom.h>
#include "sd.h"
#include "vs1003.h"
#include "lcd.h"
#include "delay.h"
#include "6x12.h"
unsigned char DispBuff[6][84]; //LCD备份缓冲区
unsigned char LcdFlag;
LCD_DISP lcd[4];
unsigned char D_x=0;
unsigned char D_y=0;
unsigned char InverseLine=0; //反色显示的行(bit0-bit3)
#define MAX_LINE_NUM 84
#define MMC_CS_PIN _BV(0) //PORTB.0
#define MMC_PORT PORTB
extern unsigned char WorkFlag;
extern uchar reading;
void LCD_write_time(TIME *tt)
{
LCD_WriteBigDigit(tt->hour/10,2);
LCD_WriteBigDigit(tt->hour%10,2+16);
LCD_WriteBigDigit(tt->min/10,2+37);
LCD_WriteBigDigit(tt->min%10,2+49);
LCD_WriteTimeDot(31);
D_x=2;D_y=2+66;
LCD_write_char(tt->sec/10+0x30);
LCD_write_char(tt->sec%10+0x30);
TimeFlag|=bLcdUpdate;
}
void LCD_WriteTimeDot(unsigned char offset)
{
unsigned char i;
for(i=0;i<7;i++){
DispBuff[2][offset+i]=pgm_read_byte(&bigdigitColon[i]);
}
for(i=0;i<7;i++){
DispBuff[3][offset+i]=pgm_read_byte(&bigdigitColon[7+i]);
}
}
void LCD_WriteBigDigit(unsigned char num,unsigned char offset)
{
unsigned char i;
for(i=0;i<13;i++){
DispBuff[1][offset+i]&=0x0f;
DispBuff[1][offset+i]|=pgm_read_byte(bigdigitTbl[num]+i);;
}
for(i=0;i<13;i++){
DispBuff[2][offset+i]=pgm_read_byte(bigdigitTbl[num]+13+i);;
}
for(i=0;i<13;i++){
DispBuff[3][offset+i]=pgm_read_byte(bigdigitTbl[num]+26+i);;
}
for(i=0;i<13;i++){
DispBuff[4][offset+i]&=0xf0;
DispBuff[4][offset+i]|=pgm_read_byte(bigdigitTbl[num]+39+i);;
}
}
void LCD_write_char(unsigned char c)
{
unsigned char line;
c-=0x20;
switch(D_x){
case 0: //显示第一行内容
for (line=0; line<6; line++)
DispBuff[0][D_y+line]= pgm_read_byte(font6x12[c]+line);
for(line=0;line<6;line++){
DispBuff[1][D_y+line]&=0xf0;
DispBuff[1][D_y+line]|=pgm_read_byte(font6x12[c]+6+line);
}
break;
case 1: //显示第二行内容
for(line=0;line<6;line++){
DispBuff[1][D_y+line]&=0x0f;
DispBuff[1][D_y+line]|=(pgm_read_byte(font6x12[c]+line)<<4);
}
for(line=0;line<6;line++){
DispBuff[2][D_y+line]=(pgm_read_byte(font6x12[c]+line)>>4)|(pgm_read_byte(font6x12[c]+6+line)<<4);
}
break;
case 2:
for (line=0; line<6; line++)
DispBuff[3][D_y+line]= pgm_read_byte(font6x12[c]+line);
for(line=0;line<6;line++){
DispBuff[4][D_y+line]&=0xf0;
DispBuff[4][D_y+line]|=pgm_read_byte(font6x12[c]+6+line);
}
break;
case 3:
for(line=0;line<6;line++){
DispBuff[4][D_y+line]&=0x0f;
DispBuff[4][D_y+line]|=(pgm_read_byte(font6x12[c]+line)<<4);
}
for(line=0;line<6;line++){
DispBuff[5][D_y+line]=(pgm_read_byte(font6x12[c]+line)>>4)|(pgm_read_byte(font6x12[c]+6+line)<<4);
}
break;
default:
D_x=0;
};
D_y+=6;
}
void LCD_write_icon(unsigned char c)
{
unsigned char line;
switch(D_x){
case 0: //显示第一行内容
for (line=0; line<6; line++)
DispBuff[0][D_y+line]= pgm_read_byte(icon6x12[c]+line);
for(line=0;line<6;line++){
DispBuff[1][D_y+line]&=0xf0;
DispBuff[1][D_y+line]|=pgm_read_byte(icon6x12[c]+6+line);
}
break;
case 1: //显示第二行内容
for(line=0;line<6;line++){
DispBuff[1][D_y+line]&=0x0f;
DispBuff[1][D_y+line]|=(pgm_read_byte(icon6x12[c]+line)<<4);
}
for(line=0;line<6;line++){
DispBuff[2][D_y+line]=(pgm_read_byte(icon6x12[c]+line)>>4)|(pgm_read_byte(icon6x12[c]+6+line)<<4);
}
break;
case 2:
for (line=0; line<6; line++)
DispBuff[3][D_y+line]= pgm_read_byte(icon6x12[c]+line);
for(line=0;line<6;line++){
DispBuff[4][D_y+line]&=0xf0;
DispBuff[4][D_y+line]|=pgm_read_byte(icon6x12[c]+6+line);
}
break;
case 3:
for(line=0;line<6;line++){
DispBuff[4][D_y+line]&=0x0f;
DispBuff[4][D_y+line]|=(pgm_read_byte(icon6x12[c]+line)<<4);
}
for(line=0;line<6;line++){
DispBuff[5][D_y+line]=(pgm_read_byte(icon6x12[c]+line)>>4)|(pgm_read_byte(icon6x12[c]+6+line)<<4);
}
break;
default:
D_x=0;
};
D_y+=6;
}
/*-----------------------------------------------------------------------
LCD_write_byte: 使用SPI接口写数据到LCD
输入参数:data:写入的数据;
command :写数据/命令选择;
-----------------------------------------------------------------------*/
void LCD_write_byte(unsigned char data)
{
SCE_L ; // 使能LCD
SPDR = data; // 传送数据到SPI寄存器
while (!(SPSR & 0x80)) ; // 等待数据传送完毕
SCE_H ; // 关闭LCD
}
void LCD_write_cmd(unsigned char data)
{
SCE_L; // 使能LCD
DC_L; // 传送命令
SPDR = data; // 传送数据到SPI寄存器
while (!(SPSR & 0x80)) ;
SCE_H; // 关闭LCD
DC_H;
}
/*---------------------------------------
LCD_init: 3310LCD初始化
----------------------------*/
void LCD_Init(void)
{
unsigned char i;
LCD_RES_DDR|=LCD_RES_BIT ;
LCD_SCE_DDR|=LCD_SCE_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_cmd(0x21);// 使用扩展命令设置LCD模式
LCD_write_cmd(0xc8);// 设置偏置电压
LCD_write_cmd(0x06);// 温度校正
LCD_write_cmd(0x13);// 1:48
LCD_write_cmd(0x20);// 使用基本命令
LCD_clear(); // 清屏
LCD_write_cmd(0x0c);// 设定显示模式,正常显示
SCE_L ; // 关闭LCD
for(i=0;i<4;i++){
lcd[i].pStr=0;
lcd[i].y=0;
}
LcdFlag=0;
}
/*-----------------------------------------------------------------------
LCD_clear: LCD清屏函数
-----------------------------------------------------------------------*/
void LCD_clear(void)
{
unsigned char x,y;
for(y=0;y<6;y++){
LCD_write_cmd(0x40|y);
LCD_write_cmd(0x80);
for (x=0; x<84; x++){
LCD_write_byte(0);
}
}
}
/*-----------------------------------------------------------------------
LCD_clear: LCD清屏函数
-----------------------------------------------------------------------*/
void ClearLcdBuff(void)
{
unsigned char x,y;
unsigned char *pp;
pp=(uchar*)&DispBuff;
for(y=0;y<6;y++){
for (x=0; x<84; x++)
*pp++=0;
}
}
/*-----------------------------------------------------------------------
LCD_set_XY: 设置LCD坐标函数
输入参数:X:0-83
Y:0-5
-----------------------------------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
LCD_write_cmd(0x40 | Y);// column
LCD_write_cmd(0x80 | X);// row
}
//写入一个12X12的图标
void LCD_writeIcon(unsigned char X,unsigned char Y,unsigned char c)
{
unsigned char i;
unsigned char mat[24];
D_x=X; D_y=Y;
for(i=0;i<24;i++)
mat[i]=pgm_read_byte(icon12x12[c]+i);
LCD_Write_Char2(mat);
TimeFlag|=bLcdUpdate;
}
/*-----------------------------------------------------------------------
LCD_write_String: 在LCD上显示汉字或英文字符
输入参数:X、Y:显示汉字的起始X、Y坐标;
-----------------------------------------------------------------------*/
void LCD_write_String(unsigned char X, unsigned char Y,unsigned char *p)
{
unsigned char i;
unsigned char bHz=0;
unsigned char mat[24]; //保存12X12点陈内容
D_x=X; D_y=Y;
while(*p!=0){
if(!bHz){
if(*p>0x80){
if(D_y>84-12) break;
bHz=1;
}else{
if(D_y>84-6) break;
LCD_write_char(* p);
p++;
}
}else{
bHz=0;
if(WorkFlag&bHzk12){
Get_HzMat(p,mat);
}else{
for(i=0;i<24;i++) mat[i]=0;
}
p+=2;
LCD_Write_Char2(mat);
D_y+=12;
}
} //end while
TimeFlag|=bLcdUpdate;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -