📄 hulandengm16.c
字号:
while(LCM12864_indatabus & LCM12864_STATUS_BUSY);
DDRA=0xff;
}
//*********************************************************************************************
//写指令到LCM12864 LCM12864_WriteCMD()
//
//**********************************************************************************************/
void LCM12864_WriteCMD(unsigned char LCM12864_command) //LCM12864_command 欲写入指令
{
LCM12864_TestBusy();
CBI_RW;
CBI_RS;
LCM12864_databus = LCM12864_command;
LCM12864_E();
}
//*********************************************************************************************
//写数据到LCM12864 LCM12864_WriteData()
//
//**********************************************************************************************/
void LCM12864_WriteData(unsigned char LCM12864_data) //LCM12864_command 欲写入数据
{
LCM12864_databus = LCM12864_data;
CBI_RW;
SBI_RS;
LCM12864_E();
}
//********************************************************************************************
//从LCM12864读数据 LCM12864_ReadData()
//
//*********************************************************************************************/
unsigned char LCM12864_ReadData(void)
{
unsigned char LCM12864_data;
DDRA=0x00;
PORTA=0xff;
SBI_RW;
SBI_RS;
LCM12864_E();
LCM12864_data = LCM12864_indatabus; //读出8位数据
LCM12864_TestBusy(); //读LCM忙
DDRA=0xff;
return LCM12864_data;
}
//********************************************************************************************
//向LCM12864填充数据(全屏) LCM12864_Fill_Screen()
//
//*********************************************************************************************/
void LCM12864_Fill_Screen( unsigned char t, //设置写入速度
unsigned char LCM12864_FillData) //欲写入的数据
{
unsigned char x,y;
CBI_CS1;CBI_CS2; // 选中左半屏及右半屏
LCM12864_WriteCMD(LCM12864_START_ROW+0); // 设置显示起始行为0
for(x=0;x<8;x++)
{
Delay(t); // 写入延时
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+x); // 设置页地址
LCM12864_WriteCMD(LCM12864_COL_START_ADDR);// // 设置列地址
for(y=0;y<64;y++)
{
LCM12864_WriteData(LCM12864_FillData);
}
}
SBI_CS1; // 不选中右半屏
SBI_CS2; // 不选中右半屏
}
//********************************************************************************************
//LCM12864清屏 LCM12864_Clear_Screen()
//
//********************************************************************************************/
void LCM12864_Clear_Screen(void)
{
LCM12864_Fill_Screen(10,0x00); //写入0到每个显示区
}
//********************************************************************************************
//在LCM12864的指定点显示16*16点阵汉字 LCM12864_Disp_Chinese_16_16()
//
//*********************************************************************************************/
void LCM12864_Disp_Char_x_16(unsigned char t, //设置写入速度(为1直接显示)
unsigned char b, //输入8:8*16字符,16:16*16字符
unsigned char LCM12864_page, //LCM12864的页地址(0~7)
unsigned char LCM12864_col, //LCM12864的列地址(0~128)注意:右半屏起始是64
unsigned char x) //16*16点阵汉字字模(纵向取模,字节倒序)
{
unsigned char j=0,i=0,data;
if(LCM12864_col < 64 )
{
CBI_CS1;
SBI_CS2; //判断屏幕使能
}
else
{
SBI_CS1;
CBI_CS2;
LCM12864_col = LCM12864_col - 64;
}
if(b==16)
{
for(j=0;j<2;j++)
{
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+LCM12864_page+j);
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+LCM12864_col);
for(i=0;i<b;i++)
{
data=pgm_read_byte(hanzi+x*32+b*j+i);
LCM12864_WriteData(data);
_delay_us(t);
}
}
}
else
{
for(j=0;j<2;j++)
{
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+LCM12864_page+j);
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+LCM12864_col);
for(i=0;i<b;i++)
{
data=pgm_read_byte(shuzi+x*16+b*j+i);
LCM12864_WriteData(data);
_delay_us(t);
}
}
}
}
/********************************************************************
函 数 名:void LCM12864_dot()
功 能:画点
说 明:在12864屏的指定位置画一个点
mode=0 画一个点
mode=1 清除一个点
mode=2 反白显示一个点
入口参数:x,y,mode
返 回 值:无
***********************************************************************/
void LCM12864_dot(unsigned char x,unsigned char y,unsigned char mode)
{
unsigned char temp_y,read_data;
temp_y = y%8;
if(x<64)
{
CBI_CS1; SBI_CS2; //判断屏幕位置
}
else
{
SBI_CS1; CBI_CS2;
x-=64;
}
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+x);
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+(y/8));
read_data=LCM12864_ReadData();
switch(mode)
{
case 0:
read_data|=(0x01<<temp_y);
break;
case 1:
read_data&=~(0x01<<temp_y);
break;
case 2:
read_data^=(0x01<<temp_y);
break;
}
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+x);
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+(y/8));
LCM12864_WriteData(read_data);
}
/********************************************************************
函 数 名:line()
功 能:画线
说 明:在12864屏上画直线或清除
入口参数:x,y,tx,ty,xe,ye,incx,incy,dist,xerr,yerr,t
返 回 值:无
**********************************************************************/
void line(unsigned char tx,unsigned char ty,unsigned char xe,unsigned char ye,unsigned mode)
{
unsigned char xerr,yerr,t,dist;
char incx,incy;
if(xe>tx)
incx=1;
if(xe<tx)
incx=-1;
if(xe==tx)
incx=0;
if(ye>ty)
incy=1;
if(ye<ty)
incy=-1;
if(ye==ty)
incy=0;
if(xe>=tx&&ye<ty) //第一象限
{
xe=xe-tx;
ye=ty-ye;
}
if(xe>tx&&ye>=ty) //第二象限
{
xe=xe-tx;
ye=ye-ty;
}
if(xe>ye)
dist=xe;
else
dist=ye;
xerr=yerr=0;
for(t=0;t<=dist;t++)
{
xerr=xerr+xe;
yerr=yerr+ye;
if(xerr>dist)
{
xerr=xerr-dist;
if(incx>0)
tx++;
if(incx<0)
tx--;
}
if(yerr>dist)
{
yerr=yerr-dist;
if(incy>0)
ty++;
if(incy<0)
ty--;
}
LCM12864_dot(tx,ty,mode);
}
}
/****************************************************************************
函 数 名:box()
功 能:画框
说 明:边框:mode=0:画 1:清 2:反显
填充:tc=0 填充黑色.1:清除填充.2:框内反显.3:不填充
入口参数:sx,sy,ex,ey,mode
sx,sy:左上角坐标.ex,ey:右下角坐标
返 回 值:无
*****************************************************************************/
void box(unsigned char sx,unsigned char sy,unsigned char ex,unsigned char ey,unsigned char mode,unsigned char tc)
{
unsigned char n;
line(sx,sy,ex,sy,mode);
line(sx,ey,sx,sy,mode);
line(sx,ey,ex,ey,mode);
line(ex,ey,ex,sy,mode);
if(tc!=3)
{
for(n=sy;n<ey;n++)
line(sx+1,n,ex-1,n,tc);
}
}
//********************************************************************************************
//LCM12864初始化 LCM12864_Init()
//
//*********************************************************************************************/
void LCM12864_Init(void)
{
CBI_RST; //复位
_delay_us(2000);
SBI_RST;
_delay_us(2000);
LCM12864_Clear_Screen(); //清除屏幕
CBI_CS1; CBI_CS2; //选中双屏
LCM12864_WriteCMD(LCM12864_DISP_OFF); //关显示
LCM12864_WriteCMD(LCM12864_PAGE_START_ADDR+0); //第0页位置
LCM12864_WriteCMD(LCM12864_START_ROW+0); //第0行
LCM12864_WriteCMD(LCM12864_COL_START_ADDR+0); //第0列
LCM12864_WriteCMD(LCM12864_DISP_ON); //开显示
}
//数码管渐变时关掉显示中断
void zhongduan_set(void)
{
if((type==2)&&(mode==1||mode==3))
{
TIMSK&=~(1<<TOIE0);
TIMSK&=~(1<<TOIE1);
disp_number*=5;
send_frame();
disp_number/=5;
}
else
{
TIMSK|=(1<<TOIE0);
TIMSK|=(1<<TOIE1);
CBI_OE;
}
}
//二级菜单向上键处理
void two_menu_up(void)
{
switch(show)
{
case 51:if(speed<9) {speed++;} else {speed=1;}
break;
case 52:if(brightness<9) {brightness++;} else {brightness=0;}
break;
case 53:if(disp_number<9) {disp_number++;} else {disp_number=1;}
break;
case 54:if(color_amount<7) {color_amount++;} else {color_amount=1;}
break;
case 55:if(gray_scale_set<951) {gray_scale_set+=50;} else{gray_scale_set=50;}
break;
}
}
//二级菜单向下键处理
void two_menu_down(void)
{
switch(show)
{
case 51:if(speed>1) {speed--;} else {speed=9;}
break;
case 52:if(brightness>0) {brightness--;} else {brightness=9;}
break;
case 53:if(disp_number>1) {disp_number--;} else {disp_number=9;}
break;
case 54:if(color_amount>1) {color_amount--;} else {color_amount=7;}
break;
case 55:if(gray_scale_set>50) {gray_scale_set-=50;} else{gray_scale_set=1000;}
}
}
//向上键处理 主级菜单或默认状态下
void key_up(void)
{
if(disp_set==0)
{
if(type>2)
{
type=0;
}
else
{
type++;
}
if(type==3)
{
shield_data=0xff;
}
else
{
shield_data=0x00;
}
}
if(disp_set==1)
{
if(show>1)
{
show--;
}
else
{
show=6;
}
}
if(disp_set==2)
{
two_menu_up();
}
}
//向下键处理 主级菜单或默认状态下
void key_down(void)
{
switch(disp_set)
{
case 0:
if(color>=color_amount)
{
color=1;
}
else
{
color++;
}
break;
case 1:
if(show<6)
{
show++;
}
else
{
show=1;
}
break;
case 2:two_menu_down();
break;
}
}
//左键处理
void key_left(void)
{
switch(disp_set)
{
case 0:
disp_set=1;
show=1;
LCM12864_Clear_Screen();
break;
case 1:if(show<50)
{
show+=50;
disp_set=2;
LCM12864_Clear_Screen();
}
break;
}
}
//右键处理
void key_right(void)
{
switch(disp_set)
{
case 1:
disp_set=0;
LCM12864_Clear_Screen(); //清屏
disp_default();
break;
case 2:
if(show>50)
{
show-=50;
LCM12864_Clear_Screen(); //清屏
disp_set=1;
}
break;
}
}
void key_transact(unsigned char temp)
{
switch(temp)
{
case 1: key_left();
break;
case 2: key_up();
break;
case 3: if(mode==3)
{
mode=0;
}
else
{
mode++;
}
break;
case 4: key_down();
break;
case 5:key_right();
break;
}
}
//********************************************************************************************
//按键处理 key()
//
//*********************************************************************************************/
void key(void)
{
unsigned char ankey;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -