我想用4*4键盘做输入,控制4位共阳数码管显示,前两位输出字母(dc),后两位输出数字,然后步进值为1,但做出来却是步进值为0.1,只能显示0.0到9.9的数字,下面是我的代码和
仿真图,各路大神看看我改怎么改,本人菜鸟一个,最近课程设计要用到,时间不够也来不及学习了,请大家帮帮忙吧
#include
/*定义全局变量*/
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; } } }
|