📄 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 + -