/*键盘功能和扫描值对应关系(前面是功能,后面是扫描键号)
|--------|--------|--------|---------|
|1 (0)|2 (1)|3 (2)|选择(3)|
|--------|--------|--------|---------|
|4 (4) |5 (5)|6 (6)|确认(7)|
|--------|--------|--------|---------|
|7 (8) |8 (9)|9 (10)|删除(11 |
|--------|--------|--------|---------|
|。(12)|0 (13)| (14) | (15) |
|--------|--------|--------|---------|
*/
/***********************键盘用外部中断0 *****************************************************/
#include"reg52.h"
//#include"main.h"
//#include"st7565.h"
//#include"keyscan.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char code DIG_PLACE[8] = {
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制
void delayms(uint);
uchar keyscan();
uchar keypad_zh(uchar);
void main()
{ uchar jh,num;
while(1)
{
jh=keyscan();
num=keypad_zh(jh);
P0=DIG_PLACE[4];
P2=DIG_CODE[num];//发送段码
delayms(10);
P2=0x00;
}
}
/************************************键盘扫描得到返回0—F编号******/
uchar keyscan(void)////要注意返回值
{ uchar jh=0,hx=4,sm=0xfe,lie=0; /*jh为按键号,hx为扫描行数,sm为行扫描值,lie为读取的列值,*/
// bit select=0; /*select为1时输入的为每克卡路里值,为0时输入的为编号*/
// float cli=0,cli_out=0; /*cli每克卡路里值,cli_out为最终的卡路里总值输出*/
// uchar xsd=0,xsd_0=0,xsd_1=0; /*xsd为小数点,xsd_0为小数点之前的位数,xsd_1为小数点之后的位数*/
// uint delete=0,i=0,f2int=0; /*delete为删除操作后的数*/
// float code str1[100]={1.2,1.3,1.4,1.5,2.3,2.6}; /*放在外部用code,这是定义的一串用于查询的卡路里的数组*/
// P1=0xff;
for(hx=4;hx>0;hx--)
{P1=sm;
lie=P1&0xf0;
if(lie!=0xf0)
{delayms(10);
lie=P1&0xf0;
if(lie!=0xf0)
{CY=1;
lie=lie<<4; //加了这一句
do
{lie=lie<<1; ////////可能有问题
if(CY==1){jh=jh+1;}
}
while(CY);
}
}
else //if(lie==0xf0)
{ delayms(10);
lie=P1&0xf0;
if(lie==0xf0)
{CY=1;
sm=sm<<1;
jh=jh+4;
hx--;
}
}
}
return (jh);
}
/**************************************************************************/
/****************将0-F编号转换成键盘上对应的功能键*******/
uchar keypad_zh(uchar jh)
{ uchar num;
switch(jh) //要把键号转换为对应的数字(0--9)
{
case 13:num=0;break;
case 0:num=1;break;
case 1:num=2;break;
case 2:num=3;break;
case 4:num=4;break;
case 5:num=5;break;
case 6:num=6;break;
case 8 :num=7;break ;
case 9:num=8;break;
case 10:num=9;break;
default: break;
}
return (num);
}
/********************延时程序****************/
void delayms(uint xms)
{uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
此帖出自
小平头技术问答
{
delayms(10);
lie=(P3&0xf0);
if(lie!=0xf0)
{
CY=1;
lie=(lie>>4); //加了这一句,把原先的左移改成了右移
do
{
lie=(lie>>1); ////////改成了右移
if(CY==1) jh++;
}
while(CY);//CY被你赋值为1了,不就成死循环了么?????
}
}
还得去研究扫描法的原理啊,你程序根本就没看到扫描代码部分。
一周热门 更多>