📄 ym12864.c
字号:
**************************************************************/
void write_data( int data)
{
while(IsBusy)
{
readstate();
delay(1);
}
RS_1;
RW_0;
DDRD=0xff;
PORTD=data;
E_1;
E_0;
}
/**********************************************************************
清除屏幕内容:
变量:i ,j
调用模块:sendcommnd(),write_data()
模块功能:选择开始清除的位置,向该位置寄存器写入0
***********************************************************************/
void clr_scr()
{
int i,j;
sendcommnd(0xc0);
sendcommnd(0x40);
for(i=0;i<8;i++)
{
sendcommnd(0xb8|i);
for(j=0;j<64;j++)
{
write_data(0x00);
}
}
}
/****************************************************************
显示屏初始化函数
****************************************************************/
void init_lcd()
{
IsBusy=0;
DDRB=0xff;
PORTB=0xff;
DDRC=0x00;
sendcommnd(0x3e);
CS1_1;
CS2_1;
sendcommnd(chooselei(0));
sendcommnd(chooseline(0));
sendcommnd(choosepage(0));
sendcommnd(0x3f);
}
/******************************************************************
显示菜单函数
参数:
*dat page lei color wordnum
数据地址 显示的页 显示的列 显示文本颜色 显示数据个数
使用规则:
调用该函数显示一页内容,选择列超过128自动对齐,列数可以超过64且能
自动翻屏,显示文字数据不能超过8个
********************************************************************/
void dispwd(const char *dat,char page,char lei,char color,char wordnum )
{
int i,j,t,k=-1;
char setcolor;
if(lei>(128-16*wordnum))
lei=(128-16*wordnum);
if(wordnum>8)
wordnum=8;
CS1_1;CS2_0;
for(i=0;i<(16*wordnum);i++)
{ if((i%16)==0)
{
k++;
if(color&(1<<k))
setcolor=0;
else setcolor=1;
}
for(j=0;j<2;j++)
{
if((i+lei)>=64)
{CS1_0;CS2_1;}
sendcommnd(chooselei((i+lei)%64));
sendcommnd(choosepage(page+j));
if(setcolor==0)
write_data(~(*dat));
else write_data(*dat);
dat++;
}
}
}
/********************************************************************
读取HC542返回的按键值
变量:data[7] 接收返回按键值
具体命令数据接收规则和时序关系参考HC542数据手册
********************************************************************/
unsigned char GetKey()
{
int i;
char data[7];
DIN_1;
DCLK_0;
DCLK_1;
DCLK_0;
DCLK_1;
DCLK_0;
DCLK_1;
DIN_0;
DCLK_0;
DCLK_1;
DLOAD_0;
DLOAD_1;
for(i=6;i>=0;i--)
{
if(PINC&0x02)
data[i]=1;
else data[i]=0;
DCLK_0;
DCLK_1;
}
return (data[5]*32+data[4]*16+data[3]*8+data[2]*4+data[1]*2+data[0]);
}
/***********************************************************************
开启HC542键盘扫描功能
具体命令数据接收规则和时序关系参考HC542数据手册
***********************************************************************/
void init_keyb()
{
int i;
DDRC=0x01;
for(i=0;i<12;i++)
{
if(0x402&(1<<i))
DIN_1;
else DIN_0;
DCLK_0;
DCLK_1;
}
DIN_1;
DLOAD_0;
DLOAD_1;
}
/*******************************************************************
画图函数
在显示屏上画一幅128*64的图像,具体图像内容覆盖PICTURE数组即可
*******************************************************************/
void draw_picture(const char *data)
{
int i,j,t;
for(j=0;j<8;j++)
{ CS1_1;CS2_0;
sendcommnd(choosepage(j));
sendcommnd(chooselei(0));
for(i=0;i<64;i++)
{
write_data(*data);
data++;
}
CS1_0;CS2_1;
sendcommnd(choosepage(j));
sendcommnd(chooselei(0));
for(i=0;i<64;i++)
{
write_data(*data);
data++;
}
}
CS1_1;CS2_1;
}
/************************************************************************
程序入口函数
变量:MenuSelect 所选择菜单
************************************************************************/
void main()
{ int i;
MenuSelect=0x03;
init_lcd();
init_keyb();
//clr_scr();
//dispwd(menu,0,0,MenuSelect,8);
clr_scr();
draw_picture(picture);
while(1)
{
if((PINC&0x02)==0)
key=GetKey();
if(key!=-1)
{
switch(key)
{
case 2:
clr_scr();
MenuSelect<<=2;
if(MenuSelect>0xc0)
MenuSelect=0x03;
if(MenuSelect==0x03)
{
dispwd(num1[4],2,0,0,1);
dispwd(fuhao[2],2,11,0,1);
dispwd(num1[5],2,20,0,1);
dispwd(fuhao[1],2,30,0,1);
}
dispwd(menu,0,0,MenuSelect,8);
key=-1;
break;
case 0:
clr_scr();
MenuSelect>>=2;
if(MenuSelect<0x03)
MenuSelect=0xc0;
if(MenuSelect==0x03)
{
dispwd(num1[4],2,0,0,1);
dispwd(fuhao[2],2,11,0,1);
dispwd(num1[5],2,20,0,1);
dispwd(fuhao[1],2,30,0,1);
}
dispwd(menu,0,0,MenuSelect,8);
key=-1;
break;
case 1:
clr_scr();
draw_picture(picture);
key=-1;
break;
case 3:
dispwd(num1[0],2,0,0,1);
key=-1;
break;
case 0b101011:
key=-1;
break;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -