#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS =P2^6;
sbit SCK=P2^7;
sbit SID=P2^5;
sbit PSB=P3^2;
sbit KEY_ADD=P3^0; //定义按键输入端口
sbit KEY_DEC=P3^1;
unsigned char code AC_TABLE[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a, 0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
};
//#define keyport P3
unsigned char curr,currold;//全局变量,当前箭头位置
unsigned char code user16x16[]={ //箭头图片
0x00,0x00,0x20,0x00,0x30,0x00,0x38,0x00,0x3C,0x00,0x3E,0x00,0x3F,0x00,0x3F,0x80,
0x3F,0xC0,0x3F,0x80,0x3F,0x00,0x3E,0x00,0x3C,0x00,0x38,0x00,0x30,0x00,0x20,0x00,
};
//☆(0)
unsigned char code star16x16[]={//五角星
0xBF,0x3F,0xBF,0xBF,0xBF,0x9F,0xE3,0xFC,0xE3,0x9F,0xBF,0xBF,0xBF,0x3F,0xBF,0xFF,
0xFF,0xFF,0xBE,0xC6,0xD9,0xEF,0xEF,0xF7,0xF7,0xEF,0xD9,0xC6,0xBE,0xFF,0xFF,0xFF};/*"☆",0*/
unsigned char code *MainMenu[]=
{
{"1.设置1"},
{"2.设置2"},
{"3.设置3"},
{"4.设置4"},
{"5.设置5"},
{"6.设置6"},
{"7.设置7"},
{"8.设置8"},
{"9.设置9"},
{"10. 设置10"},
};
/*------------------------------------------------
延时
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
发送
------------------------------------------------*/
void SendByte(unsigned char Dbyte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCK = 0;
Dbyte=Dbyte<<1;
SID = CY;
SCK = 1;
SCK = 0;
}
}
/*------------------------------------------------
接收
------------------------------------------------*/
unsigned char ReceiveByte(void)
{
unsigned char i,temp1,temp2;
temp1=temp2=0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
SCK = 0;
SCK = 1;
SCK = 0;
if(SID) temp1++;
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
SCK = 0;
SCK = 1;
SCK = 0;
if(SID) temp2++;
}
return ((0xf0&temp1)+(0x0f&temp2));
}
/*------------------------------------------------
忙检测
------------------------------------------------*/
void CheckBusy( void )
{
do SendByte(0xfc); //11111,RW(1),RS(0),0
while(0x80&ReceiveByte());
}
/*------------------------------------------------
写指令
------------------------------------------------*/
void WriteCommand( unsigned char Cbyte )
{
CS = 1;
CheckBusy();
SendByte(0xf8); //11111,RW(0),RS(0),0
SendByte(0xf0&Cbyte);
SendByte(0xf0&Cbyte<<4);
CS = 0;
}
/*------------------------------------------------
写数据
------------------------------------------------*/
void WriteData( unsigned char Dbyte )
{
CS = 1;
CheckBusy();
SendByte(0xfa); //11111,RW(0),RS(1),0
SendByte(0xf0&Dbyte);
SendByte(0xf0&Dbyte<<4);
CS = 0;
}
/*------------------------------------------------
延时
------------------------------------------------*/
void delay(unsigned int MS)
{
unsigned char us,usn;
while(MS!=0) //for 12M
{ usn = 2;
while(usn!=0)
{
us=0xf5;
while (us!=0){us--;};
usn--;
}
MS--;
}
}
/*------------------------------------------------
12864初始化
------------------------------------------------*/
void LcmInit( void )
{
WriteCommand(0x30);
WriteCommand(0x03);
WriteCommand(0x0C);
WriteCommand(0x01);
WriteCommand(0x06);
}
/*------------------------------------------------
清屏
------------------------------------------------*/
void ClrScreen()
{
WriteCommand(0x01);
DelayMs(15);
}
/*void LcmClearTXT( void )
{
unsigned char i;
WriteCommand(0x30);
WriteCommand(0x80);
for(i=0;i<64;i++)
WriteData(0x20);
}
void LcmClearBMP( void )
{
unsigned char i,j;
WriteCommand(0x34);
WriteCommand(0x36);
for(i=0;i<32;i++)
{
WriteCommand(0x80|i);
WriteCommand(0x80);
for(j=0;j<32;j++)
WriteData(0);
}
}*/
/*------------------------------------------------
字符串
------------------------------------------------*/
void PutStr(unsigned char x,unsigned char y,unsigned char code *s)
{
switch(y)
{
case 1: WriteCommand(0x80+x);break;
case 2: WriteCommand(0x90+x);break;
case 3: WriteCommand(0x88+x);break;
case 4: WriteCommand(0x98+x);break;
default:break;
}
while(*s>0)
{
WriteData(*s);
s++;
DelayUs2x(50);
}
}
/*------------------------------------------------
图片
------------------------------------------------*/
void PutBMP(unsigned char *puts)
{
unsigned int x=0;
unsigned char i,j;
WriteCommand(0x34);
WriteCommand(0x36);
for(i=0;i<32;i++)
{
WriteCommand(0x80|i);
WriteCommand(0x80);
for(j=0;j<32;j++)
{
WriteData(puts[x]);
x++;
}
}
}
/*------------------------------------------------
用户自定义字符
------------------------------------------------*/
void CGRAM()
{
int i;
WriteCommand(0x30);
WriteCommand(0x40);
for(i=0;i<16;i++)
{
WriteData(user16x16[i*2]);
WriteData(user16x16[i*2+1]);
}
}
void STRAM()
{
int i;
WriteCommand(0x30);
WriteCommand(0x40);
for(i=0;i<16;i++)
{
WriteData(star16x16[i*2]);
WriteData(star16x16[i*2+1]);
}
}
/*------------------------------------------------
显示用户自定义字符
------------------------------------------------*/
void DisplayCGRAM(unsigned char x,unsigned char y)
{
switch(y)
{
case 1: WriteCommand(0x80+x);break;
case 2: WriteCommand(0x90+x);break;
case 3: WriteCommand(0x88+x);break;
case 4: WriteCommand(0x98+x);break;
default:break;
}
WriteData(00);
WriteData(00);
}
/*------------------------------------------------
调用显示更新
------------------------------------------------*/
void DisplayUpdata(void)
{
unsigned char num;
ClrScreen();
num=sizeof(MainMenu)/sizeof(MainMenu[0]);//判断数组中数值个数
if((0+(curr/4)*4)<num)
PutStr(0,1,MainMenu[0+(curr/4)*4]);
else //如果超出数组最大元素,则写空信息,不判断此信息可能会出现乱码
PutStr(0,1,"");
if((1+(curr/4)*4)<num)
PutStr(0,2,MainMenu[1+(curr/4)*4]);
else
PutStr(0,2,"");
if((2+(curr/4)*4)<num)
PutStr(0,3,MainMenu[2+(curr/4)*4]);
else
PutStr(0,3,"");
if((3+(curr/4)*4)<num)
PutStr(0,4,MainMenu[3+(curr/4)*4]);
else
PutStr(0,4,"");
DisplayCGRAM(0,curr%4+1);
}
///////////////////////////////////////////////////////////
void main( void )
{
PSB=0;
LcmInit();
PutStr(0,0,*MainMenu);//开机界面
DisplayUpdata();
delay(10);
while(1)
{
if(curr!=currold) //光标位置变化,则更新显示
{
DisplayUpdata();
currold=curr;
}
if(KEY_ADD == 0)
{
delay(10);
if(KEY_ADD == 0)
{
while (KEY_ADD == 0);
{
if(curr<sizeof(MainMenu)/sizeof(MainMenu[0])-1)
{
curr++;
}
}
}
}
if (KEY_DEC == 0)
{
delay(10);
if(KEY_DEC == 0)
{
while (KEY_DEC == 0);
{
if(curr>0)
{
curr--;
}
}
}
}
}
//end while
}//end main
Keil代码下载:
1.zip
(48.02 KB, 下载次数: 19)
|