📄 lcd1621.c
字号:
//----------------LCD_HT1621------------------//
//-----------------no RD pin------------------//
#include "lcd1621.h"
#include "tda7313.h"
#include "si4700.h"
#include "sys_timer.h"
//--------------------------------------------//
uchar lcd1621Ram[9];
uchar lcd1621_redraw_count;
void lcd1621_ini(void);
void lcd1621_cfg(void);
void lcd1621_sleep(void);
void lcd1621_tx_cmd(uchar command);
void lcd1621_tx_ram(uchar ramadd, uchar length);
void lcd1621_redraw(void);
void lcd1621_freq2bcd(void);
void lcd1621_tx_bit(uchar bit);
//--------------------------------------------//
const uchar BCDS_TAB[] PROGMEM =
{
0xBE,//0
0x06,//1
0xDA,//2
0x5E,//3
0x66,//4
0x7C,//5
0xFC,//6
0x16,//7
0xFE,//8
0x7E,//9
0xF6,//A
0xEC,//B
0xB8,//C
0xCE,//D
0xF8,//E
0xF0,//F
0x40 //-
};
const uchar BCD_TAB[] PROGMEM =
{
0xD7,//0
0x06,//1
0xE3,//2
0xA7,//3
0x36,//4
0xB5,//5
0xF5,//6
0x07,//7
0xF7,//8
0xB7,//9
0x77,//A
0xF4,//B
0xD1,//C
0xE6,//D
0xF1,//E
0x71,//F
0x20 //-
};
//--------------------------------------------//
void lcd1621_ini(void)
{
ddrCS |= (1<<bitCS);
ddrWR |= (1<<bitWR);
ddrDATA |= (1<<bitDATA);
ddrBL |= (1<<bitBL);
portCS |= (1<<bitCS); //CS=1 ; WR=x ; DATA=x
portBL |= (1<<bitBL); //for sch v7.2
// portBL &=~(1<<bitBL);
}
//--------------------------------------------//
void lcd1621_cfg(void)
{
//sys_en
lcd1621_tx_cmd(0x01);//0b00000001
//lcd_on
lcd1621_tx_cmd(0x03);//0b00000011
//rc256
lcd1621_tx_cmd(0x18);//0b00011000
//bias1/3;com4
lcd1621_tx_cmd(0x29);//0b00101001
portBL &=~(1<<bitBL); //for sch v7.2
// portBL |= (1<<bitBL);
}
//--------------------------------------------//
void lcd1621_sleep(void)
{
uchar i; //清ram,避免开机先显示off
for(i=0; i<9; i++)
{
lcd1621Ram[i]=0;
}
lcd1621_tx_ram(0,9);
//lcd off
lcd1621_tx_cmd(0b00000010);
//sys_dis
lcd1621_tx_cmd(0b00000000);
portBL |= (1<<bitBL); //for sch v7.2
// portBL &=~(1<<bitBL);
}
//--------------------------------------------//
void lcd1621_tx_cmd(uchar command)
{
clrCS;
lcd1621_tx_bit(1);
lcd1621_tx_bit(0);
lcd1621_tx_bit(0);
uchar i;
for(i=0; i<8; i++)
{
lcd1621_tx_bit(command & (0x80>> i) );
}
lcd1621_tx_bit(0);
setCS;
}
//--------------------------------------------//
void lcd1621_tx_ram(uchar ramadd, uchar length)
{
clrCS;
//ID 101
lcd1621_tx_bit(1);
lcd1621_tx_bit(0);
lcd1621_tx_bit(1);
//ram address
uchar i,j,k;
for(i=0; i<6; i++)
{
lcd1621_tx_bit(ramadd & (0x20>> i) );
}
//ram data
for(j=ramadd; j<(ramadd+length); j++)
{
for(k=0; k<8; k++)
{
lcd1621_tx_bit(lcd1621Ram[j] & (0x80>> k) );
}
}
setCS;
}
//--------------------------------------------//
void lcd1621_tx_bit(uchar bit)
{
clrWR;
if(bit== 0) clrDATA;
else setDATA;
_delay_us(7);
setWR;
_delay_us(8);
}
//--------------------------------------------//
void lcd1621_logoset(uchar logo)
{
lcd1621Ram[logo >> 4] |= 1<<(logo & 0b00001111);
}
//--------------------------------------------//
void lcd1621Ram34Swap(uchar bcd)
{
lcd1621Ram[3] = bcd>>4;
lcd1621Ram[4] = bcd<<4;
}
//--------------------------------------------//
//根据function, 设定显示内容
void lcd1621_redraw(void)
{
lcd1621_redraw_count++;
//清ram
uchar i;
for(i=0; i<9; i++)
{
lcd1621Ram[i]=0;
}
//------------------
switch(function)
{
case 0:
if(vol/10 !=0) lcd1621Ram34Swap(pgm_read_byte(BCD_TAB+(vol/10)));
lcd1621Ram[5] = pgm_read_byte(BCD_TAB+(vol%10));
lcd1621_logoset(LCD_VOL);
break;
case 1:
if(bass> 7)
{
lcd1621Ram[5]= pgm_read_byte(BCD_TAB+(bass-7));
lcd1621_logoset(LCD_POS1);
lcd1621_logoset(LCD_POS2);
lcd1621_logoset(LCD_NEG);
}
else if(bass< 7)
{
lcd1621Ram[5]= pgm_read_byte(BCD_TAB+(7-bass));
lcd1621_logoset(LCD_NEG);
}
else
{
lcd1621Ram[5]= pgm_read_byte(BCD_TAB);
}
lcd1621_logoset(LCD_BASS);
break;
case 2:
if(treble> 7)
{
lcd1621Ram[5]= pgm_read_byte(BCD_TAB+(treble-7));
lcd1621_logoset(LCD_POS1);
lcd1621_logoset(LCD_POS2);
lcd1621_logoset(LCD_NEG);
}
else if(treble< 7)
{
lcd1621Ram[5]= pgm_read_byte(BCD_TAB+(7-treble));
lcd1621_logoset(LCD_NEG);
}
else
{
lcd1621Ram[5]= pgm_read_byte(BCD_TAB);
}
lcd1621_logoset(LCD_TREB);
break;
}
//---------------
switch(input)
{
case FMIN:
lcd1621Ram[0] = pgm_read_byte(BCDS_TAB+(1 + channel/6));
if(seekState== 0)
{
lcd1621_logoset(LCD_BAR);
lcd1621Ram[1] = pgm_read_byte(BCDS_TAB+(1+channel%6));
}
if(timer4s == 0)
{
lcd1621_freq2bcd(); //[103.9]
lcd1621_logoset(LCD_MHZ); //[MHz]
}
if(mute==0 || (lcd1621_redraw_count&(1<<1))!=0) //mute flash
{ lcd1621_logoset(LCD_FM);} //[FM]
lcd1621_logoset(LCD_T5); //[Y||||]
if(rssi > 10) lcd1621_logoset(LCD_T1);
if(rssi > 20) lcd1621_logoset(LCD_T2);
if(rssi > 30) lcd1621_logoset(LCD_T3);
if(rssi > 40) lcd1621_logoset(LCD_T4);
break;
case IPODIN:
if(mute==0 || (lcd1621_redraw_count&(1<<1))!=0) //mute flash
lcd1621_logoset(LCD_IPOD);
break;
case AUXIN:
if(mute==0 || (lcd1621_redraw_count&(1<<1))!=0) //mute flash
lcd1621_logoset(LCD_AUX);
break;
}
//batter logo
if(volatge > VOLATGE_DC) lcd1621_logoset(LCD_PLUG);
else
{
lcd1621_logoset(LCD_B1);
lcd1621_logoset(LCD_B5);
if(volatge > VOLATGE_LOW) lcd1621_logoset(LCD_B4);
if(volatge > VOLATGE_NORMAL) lcd1621_logoset(LCD_B3);
if(volatge > VOLATGE_FULL) lcd1621_logoset(LCD_B2);
}
//if(afcrlState==1) lcd1621_logoset(LCD_SLP); //指示无效电台
//------------------
lcd1621_tx_ram(0,9);
}
//--------------------------------------------//
//关机界面
void lcd1621_disp_off(void)
{
//清ram
uchar i;
for(i=0; i<9; i++)
{
lcd1621Ram[i]=0;
}
// lcd1621Ram[2]=0xe4; //o
lcd1621Ram34Swap(0xe4); //0
lcd1621Ram[5]=pgm_read_byte(BCD_TAB+15); //f
lcd1621Ram[6]=pgm_read_byte(BCD_TAB+15); //f
// lcd1621_logoset(LCD_DOT); //.
lcd1621_tx_ram(0,9);
}
//--------------------------------------------//
void lcd1621_freq2bcd(void)
{
uint freq_float;
uchar freq_1000, freq_0100, freq_0010, freq_0001;
switch(country)
{
case COUNTRY_USA:
freq_float=0x036b+ (frequency<<1);
break;
case COUNTRY_JAP:
freq_float=0x02f8+ frequency;
break;
default:
freq_float=0x036b+ frequency;
break;
}
freq_1000=freq_float/1000;
freq_0100=(freq_float%1000)/100;
freq_0010=(freq_float%100)/10;
freq_0001=freq_float%10;
if(freq_1000!= 0) lcd1621Ram[2]=pgm_read_byte(BCD_TAB+freq_1000);
lcd1621Ram34Swap(pgm_read_byte(BCD_TAB+freq_0100));
lcd1621Ram[5]=pgm_read_byte(BCD_TAB+freq_0010);
lcd1621Ram[6]=pgm_read_byte(BCD_TAB+freq_0001);
lcd1621_logoset(LCD_DOT);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -