我想用4*4键盘做输入,控制4位共阳数码管显示,前两位输出字母(dc),后两位输出数字,然后步进值为1,但做出来却是步进值为0.1,只能显示0.0到9.9的数字,下面是我的代码和
仿真图,各路大神看看我改怎么改,本人菜鸟一个,最近课程设计要用到,时间不够也来不及学习了,请大家帮帮忙吧
#include <AT89X51.H>
/*定义全局变量*/
unsigned char v,v1,v10; //定义电压v,个位v1,十位v10
unsigned char state;//定义状态:直流DC,方波SQ
/*
定义4*4矩阵键盘键值
P1.0(e) 7 8 9 直流
P1.1(d) 4 5 6 方波
P1.2(b) 1 2 3 0
P1.3(7) 0 UP DOWN 0
P1.4(e) P1.5(d) P1.6(b) P1.7(7)
*/
unsigned char code keyword[16]={
0xee,0xed,0xeb,0xe7,
0xde,0xdd,0xdb,0xd7,
0xbe,0xbd,0xbb,0xb7,
0x7e,0x7d,0x7b,0x77
};
/*定义P1.4-P1.7扫描码*/
unsigned char code ksp[4]={0xef,0xdf,0xbf,0x7f};
/* 键值码值转换表*/
unsigned char code keynum[16]={7,4,1,0,8,5,2,10/*上UP*/,9,6,3,11/*下DOWN*/,12/*直流DC*/,13/*方波SQ*/,0,0};
/*键盘扫描时间延迟函数*/
void delay_key()
{
unsigned char i,j;
for (i=0;i<5;i++)
for(j=0;j<255;j++);
}
/*数码管段选编码表*/
unsigned char code dpcode[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //不带小数点dp的显示编码
unsigned char code dpcodedp[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点dp的显示编码
/*数码管扫描时间延迟函数*/
void delay_dp()
{
unsigned char i,j;
for (i=0;i<2;i++)
for(j=0;j<200;j++);
}
/*波形电压频率延迟函数*/
void delay_f1()
{
unsigned char i,j;
for (i=0;i<100;i++)
for(j=0;j<255;j++);
}
/*键盘、数码管、电压扫描函数*/
unsigned char keypad_scan()
{
unsigned char key,i;
P1=0xf0; //P1赋值11110000
while (P1!=0xf0); //如果P1不等于11110000,则有键按下
do
{
/*数码管扫描*/
P3=0x01;
P0=dpcode[v1];
delay_dp();
P3=0x02;
P0=dpcodedp[v10];
delay_dp();
/*电压扫描*/
if (state==12) //直流
{
P3=0x04;
P0=0xa7;
delay_dp();
P3=0x08;
P0=0xa1;
delay_dp();
P2=v;
}
else if(state==13) //方波
{
P3=0x04;
P0=0x92;
delay_dp();
P2=v;
delay_f1();
P3=0x08;
P0=0x98;
delay_dp();
P2=0;
delay_f1();
}
for(i=0;i<=3;i++) //循环扫描4次
{
P1=ksp
; //依次赋值扫描码11101111,11011111,10111111,01111111
if(P1!=ksp) //P1不等于以上4种状态就说明有键按下
{
delay_key(); //延时去抖动
key=P1; //读入P1的状态
if(key!=ksp) //确定键是否真的按下
return(key); //返回扫描码
}
}
}
while(1);
}
/*返回键值函数*/
unsigned char gotkey()
{
unsigned char temp,i;
temp=keypad_scan();
for (i=0;i<16;i++) //与键值码逐一比较,直到相等就返回键的ID号(i),都不相等则说明没有键按下,返回16.
{
if(temp==keyword)
return(keynum);
}
return(16);
}
/*主函数*/
void main()
{
unsigned char temp1,temp2; //键盘输入暂存
state=12; //状态默认为直流
P2=0; //给P2口置0,即输出电压为0
v=0; //电压V置0
v1=0;v10=0; //清空v1,v10
while(1)
{
temp1=gotkey();
if (temp1==12||temp1==13)//当按键为12(直流dc)或13(方波sq)时,标记state状态
state=temp1;
else if (temp1==10)//当按键为10(上UP)时,标记v,v10,v1
{
if (v==99)
{
v=0;v1=0;v10=0;
}
else
{
v=v+1;
if (v1==9)
{
v1=0;v10=v10+1;
}
else
{
v1=v1+1;
}
}
}
else if (temp1==11)//当按键为11(下DOWN)时,标记v,v10,v1
{
if(v==0)
{
v=99;v1=9;v10=9;
}
else
{
v=v-1;
if (v1==0)
{
v1=9;v10=v10-1;
}
else
{
v1=v1-1;
}
}
}
else//当按键为其他数字时,标记为相应的v,v10,v1
{
v10=temp1;
v1=10;
temp2=gotkey();
v1=temp2;
v=v10*10+v1;
}
}
}
控制显示输出.DSN
(136.24 KB, 下载次数: 11)
一周热门 更多>