2# 宇宙飞船 //4x4键盘试验程序
//使用板载的4x4键盘
//数码管显示按键值
#define uchar unsigned char
#define uint unsigned int
#include<iom16v.h>
#include"ch595.h"
#include"encoder.h"
#include"key_value.h"
#include"disp.h"
uchar a1,a2,a3;
//向ch595写数据
#define clk 1
#define rclk 2
#define dat 3
//延时函数
void s_ms(unsigned int t)
{
for(;t>1;t--)
{
}
}
//写74hc595函数
void sendbyte(uchar byte)
{
uchar i,tem;
byte=encoder(byte); //译码
for(i=0;i<8;i++)
{
PORTA&=~(1<<clk);
tem=(byte&0x80);
if(tem==0)
{
PORTA&=~(1<<dat);
}
else
{
PORTA|=(1<<dat);
}
byte=byte<<1;
PORTA|=(1<<clk);
}
PORTA&=~(1<<rclk);
s_ms(100);
PORTA|=(1<<rclk);
}
//读键盘值 键盘在端口B
uchar key_value()
{
uchar tem1,tem2,rem,i;
rem=0; //不清零会返回一个不可预知的值
DDRB=0xf0; //B口高四位输出 低四位输入
PORTB=0x0f; //输入有上拉电阻 输出低电平
s_ms(1);
tem1=PINB; //读取端口B
tem1=tem1&0x0f;
if(tem1!=0x0f) //判断是否有键被按下
{
s_ms(200); //延时
tem2=PINB; //读取端口B
tem2=tem2&0x0f;
if(tem1==tem2) //判断是否为干扰
{
DDRB=0x0f; //B口高四位输入 低四位输出
PORTB=0xf0; //反相输出
s_ms(50); //换向后要延时
rem=PINB; //读取端口B
rem=rem&0xf0; //取高四位
rem=rem+tem1; //合并
rem=~rem; //反向输出
//do //判断按键是否被释放
//{
// PORTB=0xf0;
//s_ms(200);
//}
//while(PINB!=0xf0);
}
}
return(rem);
}
}
void disp(uchar aa)
{
uint bb=0;
DDRA=0xff; //初始化端口A
PORTA=0xff;
disa(aa);//提取aa的各位
sendbyte(a1);//数码管1
PORTA&=~(1<<ls138a);
PORTA&=~(1<<ls138b);
PORTA&=~(1<<ls138c);
s_ms(600);
sendbyte(a2);//数码管2
PORTA|=(1<<ls138a);
PORTA&=~(1<<ls138b);
PORTA&=~(1<<ls138c);
s_ms(600);
sendbyte(a3);//数码管3
PORTA&=~(1<<ls138a);
PORTA|=(1<<ls138b);
PORTA&=~(1<<ls138c);
s_ms(600);
sendbyte(0);//数码管4
PORTA|=(1<<ls138a);
PORTA|=(1<<ls138b);
PORTA&=~(1<<ls138c);
s_ms(600);
sendbyte(0);//数码管5
PORTA&=~(1<<ls138a);
PORTA&=~(1<<ls138b);
PORTA|=(1<<ls138c);
s_ms(600);
sendbyte(0);//数码管6
PORTA|=(1<<ls138a);
PORTA&=~(1<<ls138b);
PORTA|=(1<<ls138c);
s_ms(600);
sendbyte(0);//数码管7
PORTA&=~(1<<ls138a);
PORTA|=(1<<ls138b);
PORTA|=(1<<ls138c);
s_ms(600);
sendbyte(0);//数码管8
PORTA|=(1<<ls138a);
PORTA|=(1<<ls138b);
PORTA|=(1<<ls138c);
s_ms(600);
}
//数码管译码函数
uchar encoder(uchar num)
{
uchar code;
switch(num)
{
case 0x00:
code=0xc0;break;
case 0x01:
code=0xf9;break;
case 0x02:
code=0xa4;break;
case 0x03:
code=0xb0;break;
case 0x04:
code=0x99;break;
case 0x05:
code=0x92;break;
case 0x06:
code=0x82;break;
case 0x07:
code=0xf8;break;
case 0x08:
code=0x80;break;
case 0x09:
code=0x90;break;
}
return(code);
}
//键值转换
turn(uchar key)
{
switch(key)
{
case 0x11:
key=0x01;break;
case 0x21:
key=0x02;break;
case 0x41:
key=0x03;break;
case 0x81:
key=0x04;break;
case 0x12:
key=0x05;break;
case 0x22:
key=0x06;break;
case 0x42:
key=0x07;break;
case 0x82:
key=0x08;break;
case 0x14:
key=0x09;break;
case 0x24:
key=0x0a;break;
case 0x44:
key=0x0b;break;
case 0x84:
key=0x0c;break;
case 0x18:
key=0x0d;break;
case 0x28:
key=0x0e;break;
case 0x48:
key=0xa0f;break;
case 0x88:
key=0x10;break;
}
return(key);
}
//主函数
main()
{
uchar key,tem;
//端口初始化
DDRA=0xff;
PORTA=0xff;
DDRC=0xff;
PORTC=0xff;
while(1)
{
key=key_value(); //读取键值
if(key!=0)
{
tem=turn(key); //转换译码
}
disp(tem); //显示键值
}
}
|