|
发表于 2005-8-31 17:01:09
|
显示全部楼层
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#pragma data:code
const uchar num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
#pragma data:data
uchar key[4]={0x3f,0x3f,0x3f,0x3f};
void delay_ns()
{
asm("nop");
}
void delay_Nns(unsigned char n)
{
unsigned char j=0;
for(j=0;j<n;j++)
delay_ns();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
} //延时是参考的3310液晶实验
uchar panduan(void)
{
DDRA=0xf0;
PORTA=0x0f;
if(PINA!=0x0f)
return 1;
else return 0; //判断键盘是否按下
}
uchar scankey(void)
{
uchar temp; //扫描键盘取的键值
uchar keypress;
{
delay_nms(10);
if((panduan())==1)
{
temp=PINA;
if(temp==0x07)
keypress=0;
else if(temp==0x0b)
keypress=3;
else if(temp==0x0d)
keypress=6;
else if(temp==0x0e)
keypress=9;
DDRA=0x0f;
PORTA=0x70;
delay_Nns(2); //键盘电平反转,延时只需要1到2个NOP
if (PINA==0x60)
keypress+=0;
else if(PINA==0x50)
keypress+=1;
else if(PINA==0x30)
keypress+=2;
}
do{
}while((panduan())==1);
DDRA=0x70; //从新回写A口初始化
PORTA=0x0f;
return keypress;
}
}
void yiwei(void)
{
uchar i=0;
uchar temp;
temp=scankey();
for(i=0;i<3;i++)
key[3-i]=key[2-i];
key[0]=num[temp];
}
void xianshi(void)
{
uchar i=0;
for(i=0;i<4;i++)
{
PORTB=key;
PORTD&=~(1<<i);
delay_nms(10);
PORTD|=(1<<i);
}
}
void main(void)
{
uchar temp=0;
OSCCAL=0xb7;
DDRB=0x00;
PORTB=0xff;
DDRD=0x0f;
PORTD=0x0f;
for(;;)
{
if((panduan())==1)
yiwei();
xianshi();
}
}
这是我用ICCAVR写的,可以在板上通过。 |
|