?? 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備份緩沖區(qū)
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: //顯示第一行內(nèi)容
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: //顯示第二行內(nèi)容
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: //顯示第一行內(nèi)容
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: //顯示第二行內(nèi)容
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接口寫數(shù)據(jù)到LCD
輸入?yún)?shù):data:寫入的數(shù)據(jù);
command :寫數(shù)據(jù)/命令選擇;
-----------------------------------------------------------------------*/
void LCD_write_byte(unsigned char data)
{
SCE_L ; // 使能LCD
SPDR = data; // 傳送數(shù)據(jù)到SPI寄存器
while (!(SPSR & 0x80)) ; // 等待數(shù)據(jù)傳送完畢
SCE_H ; // 關(guān)閉LCD
}
void LCD_write_cmd(unsigned char data)
{
SCE_L; // 使能LCD
DC_L; // 傳送命令
SPDR = data; // 傳送數(shù)據(jù)到SPI寄存器
while (!(SPSR & 0x80)) ;
SCE_H; // 關(guān)閉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; // 產(chǎn)生一個讓LCD復(fù)位的低電平脈沖
delay_nus(100);
RES_H ;
SCE_L ; // 關(guān)閉LCD
delay_nus(100);
SCE_H; // 使能LCD
delay_us();
LCD_write_cmd(0x21);// 使用擴(kuò)展命令設(shè)置LCD模式
LCD_write_cmd(0xc8);// 設(shè)置偏置電壓
LCD_write_cmd(0x06);// 溫度校正
LCD_write_cmd(0x13);// 1:48
LCD_write_cmd(0x20);// 使用基本命令
LCD_clear(); // 清屏
LCD_write_cmd(0x0c);// 設(shè)定顯示模式,正常顯示
SCE_L ; // 關(guān)閉LCD
for(i=0;i<4;i++){
lcd[i].pStr=0;
lcd[i].y=0;
}
LcdFlag=0;
}
/*-----------------------------------------------------------------------
LCD_clear: LCD清屏函數(shù)
-----------------------------------------------------------------------*/
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清屏函數(shù)
-----------------------------------------------------------------------*/
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: 設(shè)置LCD坐標(biāo)函數(shù)
輸入?yún)?shù):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的圖標(biāo)
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上顯示漢字或英文字符
輸入?yún)?shù):X、Y:顯示漢字的起始X、Y坐標(biāo);
-----------------------------------------------------------------------*/
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點(diǎn)陳內(nèi)容
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;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -