|
题目:利用数码管和键盘实现10以内四则运算,键盘用于输入,数码管用于显示。要求:通过键盘输入算式,并在数码管上显示该算式,由程序计算运算结果并在数码管上显示。例如:输入1+2= ,则程序把结果03计算出来并显示在最后两位数码管上。键盘上的符号如数字“0”~“9”、“+”、“-”、“*”,“/”等自己定义,“+”、“-”、“*”,“/”在数码管上的显示形式自己定义。如加号用“┝ ”表示,“*”用两竖表示,“/”用三横表示。
//-------------------------------------------------------------------------*
//工 程 名: *
//硬件连接: *
//程序描述: *
//目 的: *
//说 明: *
//日 期: *
//-------------------------------------------------------------------------*
#include "Includes.h" //总头文件
//主函数
unsigned char key_scan(void) //键盘识别
{ int i;
unsigned char line, row, k_value;
static unsigned char lastkey=0xff;
const unsigned char KBTable[] = {
0xEE,'0',0xDE,'1',0xBE,'2',0x7E,'3',
0xED,'4',0xDD,'5',0xBD,'6',0x7D,'7',
0xEB,'8',0xDB,'9',0xBB,'+',0x7B,'-',
0xE7,'*',0xD7,'/',0xB7,'=',0x77,'.',
0x00,0xff };
line=0xFE; //扫描信号:使行线m1 (PTA0)为低电平,其余三根行线高电平
for (i=0;i<4;i++)
{
PTD = line; //输出扫描信号
row=PTD; //读键盘口
if ((row & 0xf0) != 0xf0) //如果列线(PTA4-PTA7)不都为高电平,则表示有键按下
break;
line=(line<<1)+1; //如果没有键按下,依次是行线有一条为低电平
}
if (i==4) return 0xff; //如果i等于4,则表示扫描完毕,没有键按下
k_value = (row & 0xf0) | (line & 0x0f) ; //如果有键按下,求是哪个键
for (i=0; i<32; i+=2) //求KBTable[]中与按下的键相同的键值
if (k_value == KBTable)
break;
if(lastkey==KBTable[i+1]) return 0xff;
lastkey=KBTable[i+1];
return KBTable[i+1]; //返回键的定义值
}
void Delay(int count) //延时
{ int i;
for(i=0;i
}
void LEDshow(unsigned char ledBuf[ ])
{ const unsigned char Table[17]={0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F,0x0,0x46,0x40,0x36,0x49,0x48,0x80}; //显示码表"0~9,空白,+,-,*,/,=, ."
unsigned char i;
DDRB = 0xff; //数据口为输出
DDRC = 0xff; //位选口为输出
PTB = 0x0; //数据口输出全0,即全不亮
for (i=0;i<4;i++)
{ PTC = ~(0b00001000 >> i); //送位选信号
PTB = Table[ledBuf]; //取显示码并送到LED数据线
Delay(50);
}
}
void main()
{
int i=0,j=0,tmp;
unsigned char Buf[6]={0,0,0,0,0,0};
unsigned char ledBuf[4]={10,10,10,10};
unsigned char key=0xff;
unsigned char key_scan(void);
DisableMCUInt(); //禁止总中断
MCUInit(); //芯片初始化
DDRD=0x0f, PTDPUE=0xf0; //PTD0~3输出,PTD4~7带上拉输入
DDRB = 0xff, DDRC = 0xff;
PTC = 0xf0, PTB = 0x40; //显示“-”
while(1)
{ key=key_scan();
if (key==0xff) continue; //如果key==0xff,则没有键按下,继续扫描
key = key - 0x30; //键按下时,求key表示的数,0x30为‘0’
if (key >9) key=key-0x7; //如果大于9,用字母表示
Buf=key; //把key的值赋值给Buf数组
if(i>=4)
{
switch (Buf[1]) //求得数
{
case 11: tmp=Buf[0]+Buf[2]; break;
case 12: tmp=Buf[0]-Buf[2]; break;
case 13: tmp=Buf[0]*Buf[2]; break;
case 14: tmp=Buf[0]/Buf[2]; break;
}
ledBuf[0]=10;
ledBuf[1]=10;
ledBuf[2]=tmp/10;
ledBuf[3]=tmp%10;
i=0;
LEDshow(ledBuf);
}
else
{
ledBuf=Buf;
i++;
LEDshow(ledBuf);
}
}
}
这个程序搞了很久都没搞出来,希望大家帮帮忙,程序运行结果是LED只亮了一个数字,而且不是按下的数字
|
|