?? display.c
字號:
#include "global.h"
#define __DECL_DISPLAY__
//根據不同的顯示屏定義不同的引用
#if defined(LCD_353)
#define __DECL_LCD353__
#elif defined(LCD_393)
#define __DECL_LCD393__
#elif defined(LCD_392)
#define __DECL_LCD392__
#elif defined(LCD_316)
#define __DECL_LCD316__
#elif defined(LCD_888)
#define __DECL_LCD888__
#elif defined(LCD_393)
#define __DECL_LCD393__
#elif defined(LCD_381)
#define __DECL_LCD381__
#elif defined(LCD_1501)
#define __DECL_LCD1501__
#else
#error
#endif
#include "system.h"
//#include <stdarg.h>
extern char *ptyName[];
extern BYTE cur_pty;
extern BYTE currentTrack;
extern BYTE currentTrack100;
//for TFT display, parameter is:
//(BYTE *disp_buff,char* src_buff,char start,char len,char x, char y, char fontsize)
//#define READMEMBYTE(a,char_ptr) ((a)?(pgm_read_byte(char_ptr)):(*char_ptr))
/*
//從eeprom讀取string并顯示
*/
void disp_string_E(BYTE *thisBuff, char *eepAddress,char start,char len)
{
char tmpBuff[9];
strcpy_E(tmpBuff,eepAddress);
disp_string(thisBuff,tmpBuff,start,len);
}
void disp_string(BYTE *thisBuff,char *str,char start,char len)
{
BYTE i=start;
while(i<=DISP_MAX_CHAR && (*str!=0))
{
disp_char(thisBuff,i,*str++);
i++;
}
while(i<(start+len))
{
disp_char(thisBuff,i,' ');
i++;
}
}
//void disp_string_E(BYTE *thisBuff,char *str,char start,char len)
//{
// BYTE i=start;
// char c;
// do{
// eeprom_busy_wait();
// c = eeprom_read_byte(str++);
// i++;
// }while((i<DISP_MAX_CHAR) && c);
//
//// while(i<DISP_MAX_CHAR && (*str!=0))
//// {
//// disp_char(thisBuff,i,*str++);
//// i++;
//// }
// while(i<(start+len))
// {
// disp_char(thisBuff,i,' ');
// i++;
// }
//}
void disp_bool(UINT16 flag)
{
if(flag)
//disp_string(tmpDispBuff,"ON ",6,3);
disp_string_E(tmpDispBuff,strOn,6,3);
else
//disp_string(tmpDispBuff,"OFF",6,3);
disp_string_E(tmpDispBuff,strOff,6,3);
}
/*LCD顯示函數,調用以后將全局變量數組BUFF[]里面的數據放到LCD里面去顯示*/
#ifdef PT6524
#include "pt6524.c"
#elif defined(PT6523)
#include "pt6523.c"
#elif defined(PT6578)
#include "pt6578.c"
#endif
//將thisBuff的第data個bit置位
#if defined(LCD_353)
void disp_char(BYTE *thisBuff,BYTE pos,BYTE asc)
{
BYTE first_byte;
UINT32 viewLittle = 0x3FFB;
if(asc>='a' && asc<='z') //小寫轉換成大寫
asc -= 0x20;
if((asc>='A') && (asc<='Z'))
{
asc -= ASCII_CHR;
}else{
if((asc>='0') && (asc<='9'))
{
asc -= ASCII_NUM;
}else{
switch(asc)
{
case '*':
asc = LED_STAR;
break;
case '+':
asc = LED_POSITIVE;
break;
case '-':
asc = LED_MINUS;
break;
default:
if(pos<9)
asc = LED_CLR;
else
asc = LED_CLR_S;
break;
}
}
}
if ( (pos<=8) && (pos>0) ) {
first_byte=(15*pos-9)/8;
UINT32 * viewAddr =(UINT32 *)(thisBuff+first_byte);
*viewAddr &= ~(viewLittle<<(7-pos%8));
viewLittle &= pgm_read_word(font+asc);
*viewAddr |= (viewLittle<<(7-pos%8));//for test
}else if (pos==9) {
thisBuff[15] &= 0x3F; //'0011 1111'
thisBuff[16] &= 0xC1; //'1100 0001'
thisBuff[15] |= (pgm_read_byte(font2+asc)<<6);
thisBuff[16] |= (pgm_read_byte(font2+asc)>>2);
}else if (pos==10) {
thisBuff[16] &= 0x7F; //'0111 1111'
thisBuff[17] &= 0x82; //'1000 0010'
thisBuff[16] |= (pgm_read_byte(font2+asc)<<7);
thisBuff[17] |= (pgm_read_byte(font2+asc)>>1);
}
}
#elif defined(LCD_393)
//x:寫入位置,從0開始計,最左邊為0,共12字符,最右邊為11
void disp_char(BYTE *buff,BYTE pos,BYTE asc)
{
BYTE i;
BYTE fontIndex;
char fontData;
if(asc>'z' || asc<' ')
asc = ' ';
asc = asc - ' ';
for(i=0;i<FONT_COLS;i++)//將字庫數據拷貝到發送緩沖區
{
fontIndex = pgm_read_byte(fontPos[0] + (pos-1)*FONT_COLS + i);//獲取字庫下標
fontData = pgm_read_byte(font5x7[0] + asc*FONT_COLS + i);//讀取字庫點陣
buff[fontIndex] &= 0x80;
buff[fontIndex] |= fontData;
}
}
#elif defined(LCD_392)
void disp_char(BYTE *thisBuff,BYTE pos,BYTE asc)
{
BYTE first_byte;
unsigned char i;
UINT32 viewLittle = 0x3FFB;
if(asc>='a' && asc<='z') //小寫轉換成大寫
asc -= 0x20;
if((asc>='A') && (asc<='Z'))
{
asc -= ASCII_CHR;
}else{
if((asc>='0') && (asc<='9'))
{
asc -= ASCII_NUM;
}else{
switch(asc)
{
case '*':
asc = LED_STAR;
break;
case '+':
asc = LED_POSITIVE;
break;
case '-':
asc = LED_MINUS;
break;
case ' ':
if(pos<9)
asc = LED_CLR;
else
asc = LED_CLR_S;
break;
default:
asc = 0;
}
}
}
BYTE littleMap[7] = {
LCD_BIT_9A,
LCD_BIT_9B,
LCD_BIT_9C,
LCD_BIT_9D,
LCD_BIT_9E,
LCD_BIT_9F,
LCD_BIT_9G,
};
if ( (pos<9) && (pos>0) ) {
first_byte=(15*pos-9)/8;
UINT32 * viewAddr =(UINT32 *)(thisBuff+first_byte);
*viewAddr &= ~(viewLittle<<(10-pos%8));
viewLittle &= pgm_read_word(font+asc);//font[asc];
*viewAddr |= (viewLittle<<(10-pos%8));//for test
}else if (pos==9) {
for(i=0;i<7;i++) {
disp_set_bit(thisBuff,littleMap[i],(pgm_read_byte(font2+asc) & (1<<i)));
}
}
}
#elif defined(LCD_888)
/************************************************************************/
/* 這個字符生成的算法只能在888的屏幕上使用 */
/* 基本的工作方法就是將LED所占的位清除,然后將字庫數據或上去 */
/************************************************************************/
void disp_char(BYTE *thisBuff,BYTE pos,BYTE asc)
{
BYTE temp; //臨時變量,用來保存正在操作的thisBuff的下標
UINT16 charMap;
if(asc>='a' && asc<='z') //小寫轉換成大寫
asc -= 0x20;
if((asc>='A') && (asc<='Z'))
{
asc -= ASCII_CHR;
}else{
if((asc>='0') && (asc<='9'))
{
asc -= ASCII_NUM;
}else{
switch(asc)
{
case '*':
asc = LED_STAR;
break;
case '+':
asc = LED_POSITIVE;
break;
case '-':
asc = LED_MINUS;
break;
case ' ':
if(pos<11)
asc = LED_CLR;
else
asc = LED_CLR_S;
break;
default:
asc = 0;
}
}
}
temp = pgm_read_byte(ledBeginChar+pos-1);
switch(pos)
{
case 1:
case 7:
charMap = pgm_read_word(font1+asc); //獲得字庫數據
thisBuff[temp] &= ~0x60; //清除對應LED位置的所有數據
thisBuff[temp] |= ((charMap<<4) & 0x60); //將字庫或上去
temp++;
thisBuff[temp] = charMap>>4; //因為此8位數據全部是LED的數據,所以直接賦值
temp++;
thisBuff[temp] &= ~0x07; //清除對應LED位置的所有數據
thisBuff[temp] |= ((charMap>>12) & 0x07); //將字庫或上去
break;
case 4:
case 6:
case 10:
charMap = pgm_read_word(font2+asc);
thisBuff[temp] &= ~0xF0;
thisBuff[temp] |= ((charMap<<4) & 0xF0);
temp++;
thisBuff[temp] &= ~0xF7;
thisBuff[temp] |= ((charMap>>4) & 0xF7);
temp++;
thisBuff[temp] &= ~0x09;
thisBuff[temp] |= ((charMap>>12) & 0x09);
break;
case 5 :
charMap = pgm_read_word(font1+asc);
thisBuff[25] &= ~0x06;
thisBuff[25] |= (charMap& 0x06);
thisBuff[0] = charMap>>4;
thisBuff[1] &= ~0x07;
thisBuff[1] |= ((charMap>>12) & 0x07);
break;
case 3 :
case 9 :
charMap = pgm_read_word(font1+asc);
thisBuff[temp] &= ~0xF6;
thisBuff[temp] |= (charMap & 0xF6);
thisBuff[temp+1] &= ~0x7F;
thisBuff[temp+1] |= ((charMap>>8)&0x7F);
break;
case 2 :
case 8 :
charMap = pgm_read_word(font2+asc);
thisBuff[temp] &= ~0x7F;
thisBuff[temp] |= (charMap & 0x7F);
thisBuff[temp+1] &= ~0x9F;
thisBuff[temp+1] |= ((charMap>>8)&0x9F);
break;
case 11 :
charMap = pgm_read_byte(font3+asc);
thisBuff[15] &= ~0xF0;
thisBuff[15] |= charMap<<4;
thisBuff[16] &= ~0x07;
thisBuff[16] |= (charMap>>4)&0x07;
break;
default:
break;
}
}
#elif defined(LCD_381)
void disp_char(unsigned char *buff ,unsigned char font,unsigned char addr)
{
unsigned char i;
unsigned char bitMap;//用來記錄從fontMap中讀取出來的數據
unsigned int fontValue;//用來保存獲得的字庫數據
fontValue = pgm_read_word(view2+font);//獲得字庫
for (i=0;i<14;i++) {
bitMap = pgm_read_byte(fontMap[addr]+i);
if (bitMap) { //如果這個筆畫需要寫入
if (fontValue&(0x0001<<i)) {//如果需要寫入1
disp_set_bit(buff,bitMap,1);
}else{
disp_set_bit(buff,bitMap,0);
}
}
}
}
#elif defined(LCD_316)
void disp_char(unsigned char *buff ,unsigned char pos,unsigned char asc)
{
unsigned char i;
unsigned char bitMap;//用來記錄從fontMap中讀取出來的數據
unsigned int fontValue;//用來保存獲得的字庫數據
pos--;
//BYTE first_byte;
//UINT32 viewLittle = 0x3FFB;
if(asc>='a' && asc<='z') //小寫轉換成大寫
asc -= 0x20;
if((asc>='A') && (asc<='Z'))
{
asc -= ASCII_CHR;
}else{
if((asc>='0') && (asc<='9'))
{
asc -= ASCII_NUM;
}else{
switch(asc)
{
case '*':
asc = LED_STAR;
break;
case '+':
asc = LED_POSITIVE;
break;
case '-':
asc = LED_MINUS;
break;
case ' ':
if(pos<12)
asc = LED_CLR;
else
asc = LED_CLR_S;
break;
default:
asc = 0;
}
}
}
fontValue = pgm_read_word(font1+asc);//獲得字庫
for (i=0;i<14;i++) {
bitMap = pgm_read_byte(fontMap[pos]+i);
if (bitMap) { //如果這個筆畫需要寫入
if (fontValue&(0x0001<<i)) {//如果需要寫入1
disp_set_bit(buff,bitMap,1);
}else{
disp_set_bit(buff,bitMap,0);
}
}
}
}
#elif defined(LCD_1501)
void disp_char(unsigned char *buff ,unsigned char addr,unsigned char font)
{
unsigned char i;
unsigned char bitMap;//用來記錄從fontMap中讀取出來的數據
unsigned int fontValue;//用來保存獲得的字庫數據
fontValue = pgm_read_word(font1+font);//獲得字庫
for (i=0;i<14;i++)
{
bitMap = pgm_read_byte(fontMap[addr]+i);
if (fontValue&(0x0001<<i))
{//如果需要寫入1
showSignal(buff,bitMap,1);
}else{
showSignal(buff,bitMap,0);
}
}
}
#endif
void disp_clr_led(BYTE *thisBuff)
// clean out signal in LEDs,and clean signals like “.”among LEDs
{
BYTE i;
for(i=1;i<=LCD_CHAR_COUNTS;i++)
{
disp_char(thisBuff,i,' '); //將所有數碼管里面的數據清除
}
#if defined(PT6523) || defined(PT6524)
disp_set_bit(thisBuff,LCD_BIT_DOT,OFF);
#endif
#ifdef LCD_BIT_COL1
disp_set_bit(thisBuff,LCD_BIT_COL1,OFF);
#endif
#ifdef LCD_BIT_COL2
disp_set_bit(thisBuff,LCD_BIT_COL2,OFF);
#endif
#ifdef LCD_BIT_DP1
disp_set_bit(thisBuff,LCD_BIT_DP1,OFF);
#endif
#ifdef LCD_BIT_DP2
disp_set_bit(thisBuff,LCD_BIT_DP2,OFF);
#endif
}
#if defined(DISP_DISC_RUN_LOGO)
void disp_disc_run(void)
{
if(halfSecond&0x01)
{
disp_set_bit(dispBuff,LCD_BIT_RUN1,ON);
disp_set_bit(dispBuff,LCD_BIT_RUN2,OFF);
disp_set_bit(dispBuff,LCD_BIT_RUN3,OFF);
disp_set_bit(dispBuff,LCD_BIT_RUN4,ON);
}else{
disp_set_bit(dispBuff,LCD_BIT_RUN1,OFF);
disp_set_bit(dispBuff,LCD_BIT_RUN2,ON);
disp_set_bit(dispBuff,LCD_BIT_RUN3,ON);
disp_set_bit(dispBuff,LCD_BIT_RUN4,OFF);
}
}
#endif
/**** 顯示FM的頻率數據在數碼管的第FM_TEXT_H到FM_TEXT_001位 ****/
void disp_FM_data(BYTE *thisBuff,UINT16 freq)
{
BYTE i=0;
BYTE dispData=0;
//傳入的freq單位為K赫茲,顯示的單位為M赫茲,精確到小數點后兩位0.05
if(freq>=10000)
{
disp_char(thisBuff,DISP_FM_VALUE,ASCII_NUM+1); //寫百位數,等于0則不寫
freq-=10000;
}
#if defined(PT6523) || defined(PT6524)
for(i=4;i>0;i--) //must be 8750~9999
{
dispData = (freq%10);
disp_char(thisBuff,DISP_FM_VALUE+i,ASCII_NUM+dispData); //其他位
freq = freq/10;
}
#ifdef DISP_RADIO_UNIT
disp_string(dispBuff,"MHZ",DISP_RADIO_UNIT,3);
#endif
#elif defined(PT6578)
for(i=5;i>0;i--) //must be 8750~9999
{
if(i!=3)
{
dispData = (freq%10);
disp_char(thisBuff,DISP_FM_VALUE+i,ASCII_NUM+dispData); //其他位
freq = freq/10;
}else{
disp_char(thisBuff,DISP_FM_VALUE+i,'.'); //'.'
}
}
#else
#error
#endif
}
/*******************************dispAMData**********************************************/
/**** 顯示AM的頻率數據在數碼管的第AM_TEXT_S到AM_TEXT_G位 ****/
void disp_AM_data(BYTE *thisBuff,UINT16 freq)
{
BYTE i,dispData;
if(freq>=1000)
{
disp_char(thisBuff,DISP_AM_VALUE,ASCII_NUM+1); //寫千位數
freq-=1000;
}
for(i=3;i>0;i--) //must be 8750~9999
{
dispData = (freq%10);
disp_char(thisBuff,DISP_AM_VALUE+i,ASCII_NUM+dispData); //其他
freq = freq/10;
}
#ifdef DISP_RADIO_UNIT
disp_string(dispBuff,"KHZ",DISP_RADIO_UNIT,3);
//disp_string_E(dispBuff,strKHZ,DISP_RADIO_UNIT,3);
#endif
}
/*******************************dispTime**************************************************/
/*顯示時間:將時間顯示在第5,6:7,8四個數碼管里面 */
/* */
//顯示當前時間在傳入的數組里面
//參數colonFlag=0時顯示冒號,為1時不顯示冒號()
//參數dspFlag=0時顯示所有數據,=1(HOUR_CHANGE)時將不顯示小時
//=2(MINUTE)時將不顯示分鐘
void disp_time(BYTE *thisBuff,BYTE *time,BYTE colonFlag)
{
BYTE dispData[4];
BYTE tmpTime;
if((regionIndex==REGION_USA) || (regionIndex==REGION_LATIN) || (regionIndex==REGION_JAPAN))
{
if(*time>12)
tmpTime = *time-12;
else
tmpTime = *time;
if(tmpTime==0)
tmpTime=12;
}else{//other
tmpTime = *time;
}
dispData[0] = tmpTime/10; //小時的十位;
dispData[1] = tmpTime%10; //小時的個位
dispData[2] = (*(time+1))/10; //分鐘的十位
dispData[3] = (*(time+1))%10; //分鐘的個位
if((regionIndex==REGION_USA) || (regionIndex==REGION_LATIN) || (regionIndex==REGION_JAPAN))
{
if(*time<12)
//disp_string(thisBuff,"AM",DISP_AMPM,2);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -