请教按键的程序问题,望大神能解答啊!
时间:10-02
整理:3721RD
点击:
先贴上原理图:
其中JP4的8口接P2^8,7口接P2^7,以此类推。然后下面是程序:
#include<reg52.h>
unsigned char code Led_Display[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
unsigned char keysta[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned char keybackup[4][4] ={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
void initial_myself();
void initial_peripheral();
void delay_long(unsigned int uiDelayLong);
void keyservice();
void keyscan();
void InterruptTime0();
sbit keyout1_dr = P2^7;
sbit keyout2_dr = P2^6;
sbit keyout3_dr = P2^5;
sbit keyout4_dr = P2^4;
sbit keyin1_sr = P2^3;
sbit keyin2_sr = P2^2;
sbit keyin3_sr = P2^1;
sbit keyin4_sr = P2^0;
void main()
{
initial_myself();
delay_long(100);
initial_peripheral();
while(1)
{
keyservice();
}
}
void keyservice()
{
unsigned char i;
unsigned char j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(keybackup[j]!=keysta[j])
{
if(keybackup[j]==0)
{
P0 = Led_Display[i*4+j];
}
keybackup[j]=keysta[j];
}
}
}
}
void keyscan()
{
unsigned char i;
static unsigned char keyout = 0;
static unsigned char keybuf[4][4]={
{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}};
keybuf[keyout][0] = (keybuf[keyout][0]<<1)| keyin1_sr;
keybuf[keyout][1] = (keybuf[keyout][1]<<1)| keyin2_sr;
keybuf[keyout][2] = (keybuf[keyout][2]<<1)| keyin3_sr;
keybuf[keyout][3] = (keybuf[keyout][3]<<1)| keyin4_sr;
for(i=0;i<4;i++)
{
if((keybuf[keyout]&0x0F)==0x00)
{
keysta[keyout]=0;
}
else if((keybuf[keyout]&0x0F)==0x0F);
{
keysta[keyout]=1;
}
}
keyout++;
keyout=keyout&0x03;
switch(keyout)
{
case 0:P0=0x7F;break;
case 1:P0=0xBF;break;
case 2:P0=0xDF;break;
case 3:P0=0xEF;break;
default:break;
}
}
void InterruptTime0() interrupt 1
{
TF0 = 0;
TR0 = 0;
keyscan();
TH0 = 0xF8;
TL0 = 0x30;
TR0 = 1;
}
void delay_long(unsigned int DelayLong)
{
unsigned int i;
unsigned int j;
for(i=0;i<DelayLong;i++)
{
for(j=0;j<50;j++)
{
;
}
}
}
void initial_myself()
{
TMOD = 0x01;
TH0 = 0xF8;
TL0 = 0x30;
P0 = Led_Display[0];
}
void initial_peripheral()
{
EA = 1;
ET0 = 1;
TR0 = 1;
}
我编程的思路是这样的:每1ms 中断一次,扫描按键状态,按一下为0,然后把0输送给备份值,当检测到4次都为0,则判断为按下,然后执行按键服务函数。
我出现的问题是:无论怎么按,都没反应, 望大神告诉哪里出现问题啊!
file:///C:\Users\gy-lrd\AppData\Roaming\Tencent\Users\314094918\QQ\WinTemp\RichOle\RGAFQS1QK{FXY}{4LSO}4HX.png
补充内容 (2016-8-23 14:07):
程序复制上来 有些地方没复制上,二维数组中的都不见了!实际程序有的!
补充内容 (2016-8-23 14:07):
[ i ]
其中JP4的8口接P2^8,7口接P2^7,以此类推。然后下面是程序:#include<reg52.h>
unsigned char code Led_Display[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
unsigned char keysta[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
unsigned char keybackup[4][4] ={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
void initial_myself();
void initial_peripheral();
void delay_long(unsigned int uiDelayLong);
void keyservice();
void keyscan();
void InterruptTime0();
sbit keyout1_dr = P2^7;
sbit keyout2_dr = P2^6;
sbit keyout3_dr = P2^5;
sbit keyout4_dr = P2^4;
sbit keyin1_sr = P2^3;
sbit keyin2_sr = P2^2;
sbit keyin3_sr = P2^1;
sbit keyin4_sr = P2^0;
void main()
{
initial_myself();
delay_long(100);
initial_peripheral();
while(1)
{
keyservice();
}
}
void keyservice()
{
unsigned char i;
unsigned char j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(keybackup[j]!=keysta[j])
{
if(keybackup[j]==0)
{
P0 = Led_Display[i*4+j];
}
keybackup[j]=keysta[j];
}
}
}
}
void keyscan()
{
unsigned char i;
static unsigned char keyout = 0;
static unsigned char keybuf[4][4]={
{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF}};
keybuf[keyout][0] = (keybuf[keyout][0]<<1)| keyin1_sr;
keybuf[keyout][1] = (keybuf[keyout][1]<<1)| keyin2_sr;
keybuf[keyout][2] = (keybuf[keyout][2]<<1)| keyin3_sr;
keybuf[keyout][3] = (keybuf[keyout][3]<<1)| keyin4_sr;
for(i=0;i<4;i++)
{
if((keybuf[keyout]&0x0F)==0x00)
{
keysta[keyout]=0;
}
else if((keybuf[keyout]&0x0F)==0x0F);
{
keysta[keyout]=1;
}
}
keyout++;
keyout=keyout&0x03;
switch(keyout)
{
case 0:P0=0x7F;break;
case 1:P0=0xBF;break;
case 2:P0=0xDF;break;
case 3:P0=0xEF;break;
default:break;
}
}
void InterruptTime0() interrupt 1
{
TF0 = 0;
TR0 = 0;
keyscan();
TH0 = 0xF8;
TL0 = 0x30;
TR0 = 1;
}
void delay_long(unsigned int DelayLong)
{
unsigned int i;
unsigned int j;
for(i=0;i<DelayLong;i++)
{
for(j=0;j<50;j++)
{
;
}
}
}
void initial_myself()
{
TMOD = 0x01;
TH0 = 0xF8;
TL0 = 0x30;
P0 = Led_Display[0];
}
void initial_peripheral()
{
EA = 1;
ET0 = 1;
TR0 = 1;
}
我编程的思路是这样的:每1ms 中断一次,扫描按键状态,按一下为0,然后把0输送给备份值,当检测到4次都为0,则判断为按下,然后执行按键服务函数。
我出现的问题是:无论怎么按,都没反应, 望大神告诉哪里出现问题啊!
file:///C:\Users\gy-lrd\AppData\Roaming\Tencent\Users\314094918\QQ\WinTemp\RichOle\RGAFQS1QK{FXY}{4LSO}4HX.png
补充内容 (2016-8-23 14:07):
程序复制上来 有些地方没复制上,二维数组中的都不见了!实际程序有的!
补充内容 (2016-8-23 14:07):
[ i ]
你这个是用protues仿真还是实际有板子?
宋老师的程序被你改成这样,也是醉了,先把人家原创的程序分析明白,再去修改
实际板子的
原创我是弄明白啦,然后我是加上鸿哥的 3区一线理念去修改的,只是让程序更可读性吧!
还是老老实实的把宋老师的东西弄明白吧,你这样搞,要走弯路。
实际板子的话, 那就说明板子没有问题; 问题会是出现在你的程序中; 建议你排查的时候, 分步去看看, 在执行到按键的时候, 是否相关的数值有给到keybuffer中;建议一步步的去看看。 如果都OK,建议先实现按键就执行按键服务函数,在来添加按键次数。
问题是啥。怎么没发现
初始化你自己,延时,初始化外设。,然后死循环按键服务再然后,一个嵌套循环,就完了?你键盘扫描怎么进去,我没看到啊?
