📄 driver.c
字号:
//有按键释放检查的键盘扫描函数
//******************************************************************
unsigned char KEY_PAD(void)
{
unsigned char temp1,temp2;
temp1=SCAN_KEY();
if(temp1==0x7f)
{
return 0x7f;
}
else
{
do
{
temp2=SCAN_KEY();
}
while(temp1==temp2);
return temp1;
}
}
//******************************************************液晶显示驱动***************************************************************//
//**********************************
//SG19264A-2(驱动器ds_s6b0108、ds_s6b0107)显示驱动程序
//液晶模块初始化、写RAM、写入汉字
//**********************************
//********************************************************
//字符在flash中存储地址计算:
//字符表中的地址=[(区码-0xa1)*0x5e+(位码-0xa1)]*0x20+0x1000;
//在flash中的地址=字符表中的地址/0x100; 除数为页数,(余数*0x10)为字符的页内首地址。
//取出字模存入CHAR_Mode[32]中。
//ASCII在flash中存储地址计算:
//在flash中的地址=ASCII码/0x10; 除数为页数,(余数*0x10)为页内首地址。
//取出字模存入ASCII_Mode[16]中。
//显示顺序:2-3-1-4
// 2 * 1
// ****************
// 3 * 4
//*******************************************************
//**************************************************************
//液晶模块片选
//**************************************************************
void LCD_CS(unsigned char cs)
{
if(cs==1)
{
PORTA&=~CS1_LCD;
PORTA|=CS2_LCD;
PORTA|=CS3_LCD;
}
else if(cs==2)
{
PORTA&=~CS2_LCD;
PORTA|=CS1_LCD;
PORTA|=CS3_LCD;
}
else if(cs==3)
{
PORTA&=~CS3_LCD;
PORTA|=CS1_LCD;
PORTA|=CS2_LCD;
}
}
//**************************************************************
//写数据子程序cs为片选cs1,cs2,cs3
//**************************************************************
void WRITE_DATA(unsigned char data,unsigned char cs)
{
LCD_CS(cs);
// DELAY_TIME(1);
PORTA&=~RW_LCD; //控制读写选择
PORTA|=DI_LCD; //控制数据或指令数据
// DELAY_TIME(1);
PORTA|=E_LCD; //下降延锁存数据
PORTF=data;
// DELAY_TIME(1);
PORTA&=~E_LCD;
// DELAY_TIME(1);
//PORTA|=E_LCD;
}
//*************************************************************
//写指令代码子程序cs为片选cs1,cs2,cs3
//*************************************************************
void WRITE_COMMAND(unsigned char command,unsigned char cs)
{
LCD_CS(cs);
// DELAY_TIME(1);
PORTA&=~RW_LCD; //控制读写选择
PORTA&=~DI_LCD; //控制数据或指令数据
// DELAY_TIME(1);
PORTA|=E_LCD; //下降延锁存数据
PORTF=command;
// DELAY_TIME(1);
PORTA&=~E_LCD;
//PORTA|=E_LCD;
// DELAY_TIME(1);
}
//******************************************************************
//显示屏初始化
//******************************************************************
void LCD_INITIALIZE(void)
{
PORTA|=RST_LCD;
WRITE_COMMAND(0x3e,1);
WRITE_COMMAND(0x3e,2);
WRITE_COMMAND(0x3e,3);
WRITE_COMMAND(0x3f,1);
WRITE_COMMAND(0x3f,2);
WRITE_COMMAND(0x3f,3);
WRITE_COMMAND(0xc0,1);
WRITE_COMMAND(0xc0,2);
WRITE_COMMAND(0xc0,3);
CLEAR_LCD_ALL();
lcd_lamp_time=0; //背光灯亮的时间计时
lcd_lamp_count_flag=1; //开始计时
PORTA&=~LAMP_LCD;
SEND_COM1_AT((const unsigned char *)LCD_INITIALIZE_STRING,sizeof(LCD_INITIALIZE_STRING) );
}
//*************************************************************
//指定写数据的起始地址子程序
//page_address from 0 to 7 ,column_address from 0 to 63,cs - chip select
//*************************************************************
void WRITE_DATA_ADDRESS(unsigned char page_address,unsigned char column_address,unsigned char cs)
{
WRITE_COMMAND((0xb8|page_address),cs); //config x address
WRITE_COMMAND((0x40|column_address),cs); //config y address
}
//***********************************************************
//显示一个byte
//***********************************************************
void DISP_ONE_BYTE(unsigned char page_address,unsigned char column_address,unsigned char cs,unsigned char data)
{
WRITE_DATA_ADDRESS(page_address,column_address,cs);
WRITE_DATA(data,cs);
}
//**********************************************************************
//显示一个8*8的图标,点阵数据放在single8[8]中,注:可全屏显示
//**********************************************************************
void DISP_8X8_PICTURE(unsigned char page_address,unsigned char column_address,unsigned char cs)
{
unsigned char i=0;
if((column_address>56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address,column_address,cs);
for(i=0;i<(64-column_address);i++)
{
WRITE_DATA(single8[i],cs);
}
WRITE_DATA_ADDRESS(page_address,0,cs+1);
for(;i<8;i++)
{
WRITE_DATA(single8[i],cs+1);
}
}
else
{
WRITE_DATA_ADDRESS(page_address,column_address,cs);
for(i=0;i<8;i++)
{
WRITE_DATA(single8[i],cs);
//delay(100);
}
}
}
//**********************************************************************
//反显示一个8*8的图标,点阵数据放在single8[8]中,注:可全屏显示
//**********************************************************************
void DISP_8X8_PICTURE_REVERSE(unsigned char page_address,unsigned char column_address,unsigned char cs)
{
unsigned char i=0;
if((column_address>56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address,column_address,cs);
for(i=0;i<(64-column_address);i++)
{
WRITE_DATA(~single8[i],cs);
}
WRITE_DATA_ADDRESS(page_address,0,cs+1);
for(;i<8;i++)
{
WRITE_DATA(~single8[i],cs+1);
}
}
else
{
WRITE_DATA_ADDRESS(page_address,column_address,cs);
for(i=0;i<8;i++)
{
WRITE_DATA(~single8[i],cs);
//delay(100);
}
}
}
//************************************************************************
//显示一个汉字 注:可全屏显示
//************************************************************************
void DISP_CHARACTER(unsigned char page_address,unsigned char column_address,unsigned long int qu_code,unsigned long int wei_code,unsigned char cs)
{
unsigned int i=0;
unsigned char j;
j=cs+1;
GET_CHAR_MODE(qu_code,wei_code);
if((column_address>56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address,column_address,cs);
for(i=0;i<(64-column_address);i++)
{
WRITE_DATA(char_mode[i],cs);
}
WRITE_DATA_ADDRESS(page_address,0,j);
for(;i<8;i++)
{
WRITE_DATA(char_mode[i],j);
}
}
else
{
WRITE_DATA_ADDRESS(page_address,column_address,cs);
//jdelay(100);
for(i=0;i<8;i++)
{
WRITE_DATA(char_mode[i],cs);
//delay(100);
}
}
if((column_address>56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address+1,column_address,cs);
for(i=8;i<(72-column_address);i++)
{
WRITE_DATA(char_mode[i],cs);
}
WRITE_DATA_ADDRESS(page_address+1,0,j);
for(;i<16;i++)
{
WRITE_DATA(char_mode[i],j);
}
}
else
{
WRITE_DATA_ADDRESS(page_address+1,column_address,cs);
//jdelay(100);
for(i=8;i<16;i++)
{
WRITE_DATA(char_mode[i],cs);
//delay(100);
}
}
if((column_address>48)&&(column_address<56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address,column_address+8,cs);
for(i=16;i<(80-column_address);i++)
{
WRITE_DATA(char_mode[i],cs);
}
WRITE_DATA_ADDRESS(page_address,0,j);
for(;i<24;i++)
{
WRITE_DATA(char_mode[i],j);
}
}
else if((column_address>=56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address,column_address-56,j);
//jdelay(100);
for(i=16;i<24;i++)
{
WRITE_DATA(char_mode[i],j);
//delay(100);
}
}
else
{
WRITE_DATA_ADDRESS(page_address,column_address+8,cs);
//jdelay(100);
for(i=16;i<24;i++)
{
WRITE_DATA(char_mode[i],cs);
//delay(100);
}
}
if((column_address>48)&&(column_address<56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address+1,column_address+8,cs);
for(i=24;i<(88-column_address);i++)
{
WRITE_DATA(char_mode[i],cs);
}
WRITE_DATA_ADDRESS(page_address+1,0,j);
for(;i<32;i++)
{
WRITE_DATA(char_mode[i],j);
}
}
else if((column_address>=56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address+1,column_address-56,j);
//jdelay(100);
for(i=24;i<32;i++)
{
WRITE_DATA(char_mode[i],j);
//delay(100);
}
}
else
{
WRITE_DATA_ADDRESS(page_address+1,column_address+8,cs);
//jdelay(100);
for(i=24;i<32;i++)
{
WRITE_DATA(char_mode[i],cs);
//delay(100);
}
}
}
//************************************************************************
//反显示一个汉字 注:可全屏显示
//************************************************************************
void DISP_CHARACTER_REVERSE(unsigned char page_address,unsigned char column_address,unsigned long int qu_code,unsigned long int wei_code,unsigned char cs)
{
unsigned int i=0;
unsigned char j=0;
j=cs+1;
GET_CHAR_MODE(qu_code,wei_code);
if((column_address>56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address,column_address,cs);
for(i=0;i<(64-column_address);i++)
{
WRITE_DATA(~char_mode[i],cs);
}
WRITE_DATA_ADDRESS(page_address,0,j);
for(;i<8;i++)
{
WRITE_DATA(~char_mode[i],j);
}
}
else
{
WRITE_DATA_ADDRESS(page_address,column_address,cs);
//jdelay(100);
for(i=0;i<8;i++)
{
WRITE_DATA(~char_mode[i],cs);
//delay(100);
}
}
if((column_address>56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address+1,column_address,cs);
for(i=8;i<(72-column_address);i++)
{
WRITE_DATA(~char_mode[i],cs);
}
WRITE_DATA_ADDRESS(page_address+1,0,j);
for(;i<16;i++)
{
WRITE_DATA(~char_mode[i],j);
}
}
else
{
WRITE_DATA_ADDRESS(page_address+1,column_address,cs);
//jdelay(100);
for(i=8;i<16;i++)
{
WRITE_DATA(~char_mode[i],cs);
//delay(100);
}
}
if((column_address>48)&&(column_address<56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address,column_address+8,cs);
for(i=16;i<(80-column_address);i++)
{
WRITE_DATA(~char_mode[i],cs);
}
WRITE_DATA_ADDRESS(page_address,0,j);
for(;i<24;i++)
{
WRITE_DATA(~char_mode[i],j);
}
}
else if((column_address>=56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address,column_address-56,j);
//jdelay(100);
for(i=16;i<24;i++)
{
WRITE_DATA(~char_mode[i],j);
//delay(100);
}
}
else
{
WRITE_DATA_ADDRESS(page_address,column_address+8,cs);
//jdelay(100);
for(i=16;i<24;i++)
{
WRITE_DATA(~char_mode[i],cs);
//delay(100);
}
}
if((column_address>48)&&(column_address<56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address+1,column_address+8,cs);
for(i=24;i<(88-column_address);i++)
{
WRITE_DATA(~char_mode[i],cs);
}
WRITE_DATA_ADDRESS(page_address+1,0,j);
for(;i<32;i++)
{
WRITE_DATA(~char_mode[i],j);
}
}
else if((column_address>=56)&&(cs!=3))
{
WRITE_DATA_ADDRESS(page_address+1,column_address-56,j);
//jdelay(100);
for(i=24;i<32;i++)
{
WRITE_DATA(~char_mode[i],j);
//delay(100);
}
}
else
{
WRITE_DATA_ADDRESS(page_address+1,column_address+8,cs);
//jdelay(100);
for(i=24;i<32;i++)
{
WRITE_DATA(~char_mode[i],cs);
//delay(100);
}
}
}
//*****************************************************
//取字符的字模(32BYTES)16*16
//*****************************************************
void GET_CHAR_MODE(unsigned long int qu_code,unsigned long int wei_code)
{
unsigned char i=0;
unsigned int j=0;
READ_ONE_PAGE_TO_BUFFER1(CALCULATE_PAGE_ADDRESS(qu_code,wei_code));
j=CALCULATE_BUFFER_ADDRESS(qu_code,wei_code);
char_mode[0]=READ_BYTE_FROM_BUFFER1(j);
j++;
for(i=1;i<32;i++)
{
char_mode[i]=READ_BYTE_FROM_BUFFER1(j);
j++;
}
}
//*******************************************************
//计算字符的页地址 iccavr编译器计算数据类型不匹配
//*******************************************************
unsigned int CALCULATE_PAGE_ADDRESS(unsigned long int qu_code,unsigned long int wei_code)
{
unsigned long int table_address;
unsigned int char_page_address;
unsigned long int i,j,k,l,w;
i=0xa1;
j=0x5e;
k=0xa1;
l=0x20;
w=0x1000;
table_address=((qu_code-i)*j+(wei_code-k))*l+w;
char_page_address=table_address/0x100;
return(char_page_address);
}
//******************************************************
//计算字符的页内地址 iccavr编译器计算数据类型不匹配
//******************************************************
unsigned int CALCULATE_BUFFER_ADDRESS(unsigned long int qu_code,unsigned long int wei_code)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -