📄 ch452_lcd.c~
字号:
}
/*******************************************************************
函 数 名:ext_int0_isr
入口参数:
出口参数:
建立日期:2007年8月15日
修改日期:
函数作用:用于处理按键的中断服务程序。
说 明:
********************************************************************/
interrupt [EXT_INT0] void ext_int0_isr(void)
{
uchar key_press;
postion=0;
CH452_I2C_Write(CH452_GET_KEY); //发出获取键值命令
key_press=CH452_I2C_Read(); //读出键值
if(key_press==0xC0) //0号按键
{
if(input_position==1)
postion=0;
}
if(key_press==0xC1) //1号按键
{
if((input_position==1)||(input_banjing==1))
postion=1;
else
{
switch (menu_statu)
{
case 100 :
menu_statu=110;
print_sub1_page();//显示主菜单1的子菜单
break;
case 110 :
menu_statu=111;
print_sub1_1_page();//显示主菜单1子菜单1的子菜单或功能界面
break;
case 111 :
//print_sub1_1_1_page();
break;
case 120 :
menu_statu=121;
//print_sub1_2_0_page();
break;
case 121 :
//print_sub1_2_1_page();
break;
case 130 :
menu_statu=131;
//print_sub1_3_0_page();
break;
case 131 :
//print_sub1_3_1_page();
break;
case 140 :
menu_statu=141;
monitor=1;
LCD_Clear();//清屏
//print_sub4_1_0page();//显示主菜单4子菜单1的子菜单
break;
case 141 :
//print_sub1_4_1_page();//显示主菜单1子菜单1子菜单1的子菜单
break;
}
}
}
if(key_press==0xC2) //2号按键
{
if((input_position==1)||(input_banjing==1))
postion=2;
else
{
switch (menu_statu)
{
case 100 :
menu_statu=120;
print_sub2_page();//显示主菜单2的子菜单
break;
case 110 :
menu_statu=112;
print_sub1_2_page();//显示主菜单1子菜单2的子菜单或功能界面
break;
case 112 :
//print_sub1_1_1_page();
break;
case 120 :
menu_statu=122;
//print_sub1_1_1_page();
break;
case 122 :
//print_sub1_1_1_page();
break;
case 130 :
menu_statu=132;
//print_sub1_1_1_page();
break;
case 132 :
//print_sub1_1_1_page();
break;
}
}
}
if(key_press==0xC3) //3号按键
{
if((input_position==1)||(input_banjing==1))
postion=3;
else
{
switch (menu_statu)
{
case 100 :
menu_statu=130;
print_sub3_page();//显示主菜单3的子菜单
break;
case 110 :
menu_statu=113;
//print_sub1_1_page();//显示主菜单1子菜单3的子菜单或功能界面
break;
case 113 :
//print_sub1_1_1_page();
break;
case 120 :
menu_statu=123;
//print_sub1_1_1_page();
break;
case 123 :
//print_sub1_1_1_page();
break;
case 130 :
menu_statu=133;
//print_sub1_1_1_page();
break;
case 133 :
//print_sub1_1_1_page();
break;
}
}
}
if(key_press==0xC8) //4号按键
{
if((input_position==1)||(input_banjing==1))
postion=4;
else
{
switch (menu_statu)
{
case 100 :
menu_statu=140;
print_sub4_page();//显示主菜单4的子菜单
break;
}
}
}
if(key_press==0xC9) //5号按键
{
if((input_position==1)||(input_banjing==1))
postion=5;
}
if(key_press==0xCA) //6号按键
{
if((input_position==1)||(input_banjing==1))
postion=6;
}
if(key_press==0xCB) //7号按键
{
if((input_position==1)||(input_banjing==1))
postion=7;
}
if(key_press==0xD0) //8号按键
{
if((input_position==1)||(input_banjing==1))
postion=8;
}
if(key_press==0xD1) //9号按键
{
if((input_position==1)||(input_banjing==1))
postion=9;
}
if(key_press==0xD2) //10号按键
{
}
if(key_press==0xD3) //11号按键
{
}
if(key_press==0xD8) //12号按键
{
}
if(key_press==0xD9) //13号按键 //设定保存键
{
save();
}
if(key_press==0xDA) //14号按键 //清屏键
{
W_1byte(0,0,0x0C); //关光标
LCD_Clear();//清屏
//LCD_set_xy(0,0);
input_position=0;
}
if(key_press==0xDB) //15号按键 //返回主菜单
{
monitor=0;
input_position=0;
W_1byte(0,0,0x0C); //关光标
print_root_page();
}
input();
}
/*******************************************************************
函 数 名:W_1byte
入口参数:RW、RS、W_data
出口参数:无
建立日期:2007年8月15日
修改日期:
函数作用:写一个字节的数据到12864液晶,包括指令和数据
说 明:RW=1,从液晶读数据到MCU;RW=0,写一个数据到液晶;
(一般RW都设为0,即只向液晶写数据,不读数据)
RS=1,写入的是数据;RS=0,写入的是指令;
一般模式:RW=0,RS=1;写数据
RW=0,RS=0;写指令
********************************************************************/
void W_1byte(uchar RW, uchar RS, uchar W_data)
{
uint H_data,L_data,S_ID = 0xf8; //11111RWRS0
if(RW == 0)
{
S_ID &=~ 0x04;
}
else //if(RW==1)
{
S_ID |= 0X04;
}
if(RS == 0)
{
S_ID &=~ 0x02;
}
else //if(RS==1)
{
S_ID |= 0X02;
}
H_data = W_data;
H_data &= 0xf0; //屏蔽低4位的数据 //为什么要这样,见SG12864J501C2.pdf第18页
L_data = W_data; //xxxx0000格式
L_data &= 0x0f; //屏蔽高4位的数据
L_data <<= 4; //xxxx0000格式
Set_CS();
Write_8bits(S_ID); //发送S_ID
Write_8bits(H_data); //发送H_data
Write_8bits(L_data); //发送L_data
Clr_CS();
}
/********************************************************************
函 数 名:Write_8bits
入口参数:W_bits
出口参数:无
建立日期:2007年8月15日
修改日期:
函数作用:负责串行输出8个bit位
说 明:
********************************************************************/
void Write_8bits(uint W_bits)
{
uint i,Temp_data;
for(i=0; i<8; i++)
{
Temp_data = W_bits;
Temp_data <<= i;
if((Temp_data&0x80)==0) //bit7 is zero
{
Clr_SID();
#asm("nop");
Set_SCLK();
#asm("nop");
#asm("nop");
Clr_SCLK();
#asm("nop");
Clr_SID();
}
else //bit7 is one
{
Set_SID();
#asm("nop");
Set_SCLK();
#asm("nop");
#asm("nop");
Clr_SCLK();
#asm("nop");
Clr_SID();
}
}
}
/*******************************************************************
函 数 名:LCD_Init
入口参数:无
出口参数:无
建立日期:2007年8月15日
修改日期:
函数作用:液晶初始化
说 明:
********************************************************************/
void LCD_Init(void)
{
W_1byte(0,0,0x30); //功能设置 8位数据,基本指令
Delay(2);
W_1byte(0,0,0x0C); //显示状态 ON,游标OFF,反白OFF
Delay(2);
W_1byte(0,0,0x01); //清除显示
Delay(2);
W_1byte(0,0,0x02); //地址归位
Delay(2);
W_1byte(0,0,0x80); //设置DDRAM地址
Delay(2);
}
/********************************************************************
函 数 名:LCD_set_xy
入口参数:X:0-3 Y:0-15
出口参数:无
建立日期:2007年8月15日
修改日期:
函数作用:写地址
说 明:y为字体顶行位置,x为字体的列位置 ,
********************************************************************/
void LCD_set_xy(uchar y, uchar x)
{
uchar address;
switch(y)
{
case 0: address = 0x80 + x; break;
case 1: address = 0x90 + x; break;
case 2: address = 0x88 + x; break;
case 3: address = 0x98 + x; break;
default: break;
}
W_1byte(0,0,address);
}
/********************************************************************
函 数 名:LCD_Display
入口参数:*message
出口参数:无
建立日期:2007年8月15日
修改日期:
函数作用:在LCD上显示*message所指向的内容
说 明:
********************************************************************/
void LCD_Display(uchar *message)
{
uchar i = 0;
for(i=0;message[i]!='\0';i++)
{
W_1byte(0,1,message[i]);
}
}
/*******************************************************************
函 数 名:LCD_Clear
入口参数:无
出口参数:无
建立日期:2007年8月17日
修改日期:
函数作用:清屏
说 明:
********************************************************************/
void LCD_Clear(void)
{
#asm("nop");
W_1byte(0,0,0x01);
#asm("nop");
}
/********************************************************************
函 数 名:Draw_Pic
入口参数:x, y, *Draw
出口参数:无
建立日期:2007年8月18日
修改日期:
函数作用:在LCD上(x,y)处开始显示*Draw所指向的内容
说 明:
********************************************************************/
void Draw_Pic(uchar x, uchar y, flash uchar *Draw)
{
uchar i, j, temp_x, temp_y;
W_1byte(0,0,0x34); //8BIT控制界面,扩充指令集,,绘图显示OFF
temp_x = x;
temp_y = y;
temp_x |= 0x80;
temp_y |= 0x80;
for(i=0;i<32;i++ )
{
W_1byte(0,0,temp_y++);//设置绘图区的Y地址坐标
W_1byte(0,0,temp_x);//设置绘图区的X地址坐标
for(j=0;j<16;j++)
{
W_1byte(0,1,*Draw);
Draw++;
}
}
temp_x = 0x88;
temp_y = 0x80;
j = 0;
for(;i<64;i++ )
{
W_1byte(0,0,temp_y++);//设置绘图区的Y地址坐标
W_1byte(0,0,temp_x);//设置绘图区的X地址坐标
for(j=0;j<16;j++)
{
W_1byte(0,1,*Draw);
Draw++;
}
}
W_1byte(0,0,0x36);//8BIT控制界面,扩充指令集,,绘图显示OFF
}
/********************************************************************
函 数 名:Draw_Pic_Clear
入口参数:无
出口参数:无
建立日期:2007年8月18日
修改日期:
函数作用:绘图模式下的清屏
说 明:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -