📄 main.c
字号:
#include <iom8515v.h>
#include <macros.h>
#include <stdio.h>
#include"ForATmega8515.h"
#define SomeNop NOP();NOP();NOP();NOP();NOP();NOP();\
NOP();NOP();NOP();NOP();NOP();NOP();\
NOP();NOP();NOP();NOP();NOP();NOP();
#define C0 0x04
#define C1 0x08
#define C2 0x10
#define R0 0x40
#define R1 0x80
///////////////////////////////
uchar leddata=0;
uchar left=0;
uchar right=0;
uchar lcdindex=0;
unsigned char ledflag=0;
unsigned char shuflag=0;
unsigned char lcdflag=0;
uchar index=0;
uchar key,temp;
uchar const str[]={"0123456789ABCDEF"};
uchar const line[]={0,2,4,6,8,10,12,14,
0,2,4,6,8,10,12,14};//关
uchar const pic1[]={0x18,0x18,0x99,0xDB,0x7E,0x3C,0x18,0x00};
///////////////////////////////
void delay(uint ticks);
void display();
/////////LCD///////////
void writedata(uchar lcddata);
void writecom(uchar lcddata);
void writeline(uchar x,uchar const *pt);
void initlcd();
//////////////////////////////
uchar GetKey(void);
/////////////////////////////
void main()
{
init_devices();
initlcd();
printf("-----------Test For ATMega8515--------------\n");
while(1)
{
display();
if(ledflag){leddata++;ledflag=0; if(index++==7)index=0;}
if(shuflag){if(left++==9)left=0;shuflag=0;}
if(lcdflag){if(lcdindex++==16)lcdindex=0;writeline(lcdindex,str);lcdflag=0;}
if(lcdindex==16)PORTD&=~BEEL;
else PORTD|=BEEL;
///////////////////////////////////
temp=GetKey();
key=temp;
if((key&0x10)!=0)
{
if((temp&0x01)==0)right=1;
else if((temp&0x02)==0)right=3;
else if((temp&0x04)==0)right=5;
}
else if((key&0x20)!=0)
{
if((temp&0x01)==0)right=2;
else if((temp&0x02)==0)right=4;
else if((temp&0x04)==0)right=6;
}
/////////////////////////////////////
}
}
//////////////////////////////
void delay(uint ticks)
{
uchar x;
for(;ticks!=0;ticks--)for(x=100;x!=0;x--);
}
void display()
{
uchar i;
PORTA=~leddata;
PORTC&=~LED;
delay(1);
PORTC|=LED;
///////////
PORTA=Tab[left];
PORTC&=~SEG0;
delay(1);
PORTC|=SEG0;
/////////////////
PORTA=Tab[right];
PORTC&=~SEG1;
delay(1);
PORTC|=SEG1;
//////////////////
for(i=0;i!=8;i++)
{
PORTB|=0x01;
SPDR=pic1[i];
SomeNop
PORTB&=0xf1;
PORTB|=line[i+index];
PORTB&=~0x01;
delay(1);
}
}
/////////////////LCD///////////////////////
///////////////////////////////
void writedata(uchar lcddata)
{
// E=1;
PORTC|=E;
// RS=1;
PORTC|=RS;
// RW=0;
PORTA=lcddata;
// E=0;
PORTC&=~E;
delay(1);
}
/////////////////////////////////
void writecom(uchar lcddata)
{
// E=1;
PORTC|=E;
// RS=0;
PORTC&=~RS;
// RW=0;
PORTA=lcddata;
// E=0;
PORTC&=~E;
delay(1);
}
void writeline(uchar x,uchar const *pt)
{
if(x==0)
{
writecom(0x01);
writecom(0x80);
}
else
{
writedata(pt[x-1]);
}
}
///////////////////////////////////
void initlcd()
{
writecom(0x01);
writecom(0x38);
writecom(0x0f);
writecom(0x06);
writecom(0x01);
writecom(0x80);
}
///////////////////////////////////
//////////////////////////////////
uchar GetKey(void)
{
uchar key;
uchar temp;
//temp的高4位是按下的列
//temp低4位是按下的行
DDRD&=~(C0+C1+C2);//输
DDRD|=R0+R1;//输
PORTD&=~(R0+R1);
key=PIND;
key>>=2;
key&=0x07;
if(key!=0x07)
{
delay(1);
key=PIND;
key>>=2;
key&=0x07;
if(key!=0x07)
{
//确实有键按下
temp=key;
DDRD|=C0+C1+C2;//输出
DDRD&=~(R0+R1);//输入
PORTD|=C0+C1+C2;
key=PIND;
key>>=2;
key&=0x30;
temp+=key;
return temp;
}
}
return 0xff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -