用的AVR M16。写了一个44键盘,值可以读取,但是我想让我按下的键保持,等下一次按键再改变为另一个值
此外,我还想可以在数码管上显示像计算器那样的效果,按一下数字,之前那个数向左移一位,这个程序里还没有,我希望大哥帮我看看,
如果你有更好的程序,可不可以发给我看看。
如果你的能用,真的很感谢,大量分相送~!
/*---------------------------------------------------------------
程序名称:4*4按键扫描程序
目标系统: 基于AVR单片机
应用软件: ICC AVR
注意: 晶振频率:8HMZ,经调试成功运行
循环扫描PD口接入的按键,并使用PB口的LED指示灯指示按键的码值。
并在数码管上显示数。
---------------------------------------------------------------*/
#include <iom16v.H>
#include <macros.h>
#define LED_DDR DDRB
#define LED_PORT PORTB
#define KEY_DDR DDRD
#define KEY_PORT PORTD
#define KEY_PIN PIND
#pragma data:code
const table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e};
#define uchar unsigned char
const uchar setSta_[4]={0xfe,0xfd,0xfb,0xf7};
// setSta={11111110 11111101 11111011 11110111}
const uchar getSta_[4]={0xe0,0xd0,0xb0,0x70};
/*---------------------------------------------------------------
程序名称:delay
程序功能:延时
----------------------------------------------------------------*/
void delay(uchar num)
{
uchar i,j;
for(num;num>0;num--)
{
for(i=100;i>0;i--)
for(j=100;j>0;j--);
}
}
uchar GetKeyVal()
{
uchar i,j,getSta,keyVal;
for(i=0;i<4;i++)
{
KEY_PORT=setSta_[i];
delay(1);
if(KEY_PIN!=setSta_[i])
{
getSta=KEY_PIN&0xf0;
for(j=0;j<4;j++)
if(getSta==getSta_[j])
{
keyVal=j+i*4;
return keyVal;
}
}
}
return 0xFF;
}
/*--------------------------------------------------------------------
程序名称:主函数
程序功能:
--------------------------------------------------------------------*/
void main()
{
uchar keyVal;
LED_DDR = 0XFF;
LED_PORT=0XFF;
KEY_DDR = 0X0F;
while(1)
{
keyVal = GetKeyVal();
delay(10);
LED_PORT=0XFF;
DDRC=0xff;
PORTC&=0x01; //数码管位选
DDRA=0xff;
PORTA=0xff;
if( keyVal!=0xFF )
{
LED_PORT =(keyVal); //LED低电平点亮
PORTC|=BIT(0);
PORTA=table[keyVal];
delay(100);
//这个下面是我为了保持状态而加的,不管用,别的键按不进的
//我知道这个地方已经进入死循环
while(PIND!=keyVal) //当前有按键处于按下状态,再按其他按键时程序维持当前
{
;
}
}
}
}