刚学单片
- #include "reg51.h"
- #define uchar unsigned char
- #define uint unsigned int
- //定义要发送的数组SendBuf[]并进行初始
- uchar SendBuf_1[]={0XF0,0X03,0X26,0X01,0X00,0X27,0XFF};
- void Delay1ms(uint count)
- {
- uint i,j;
- for(i=0;i<count;i++)
- for(j=0;j<110;j++);
- }
- /********数据发送函数********/
- void send_dat_1()
- {
- uchar i;
- for(i=0;i<7;i++)
- {
- SBUF =SendBuf_1[i];
- while(!TI); // 等待数据发送完成
- TI = 0; // 清发送标志位
- }
- }
- /********4X4键盘扫描函数********/
- uchar keyscan()
- {
- uchar cord_h,cord_l;
- P1=0x0f; //行线输出全为0
- cord_h=P1&0x0f; //读入列线值
- if(cord_h!=0x0f) //先检测有无按键按下
- {
- Delay1ms(20); //去抖
- if(cord_h!=0x0f)
- {
- cord_h=P1&0x0f; //读入列线值
- P1=cord_h|0xf0; //输出当前列线值
- cord_l=P1&0xf0; //读入行线值
- return(cord_h+cord_l);
- }
- }
- return(0xff);
- }
-
- /********以下是串行口初始化函数********/
- void series_init()
- {
- SCON=0x50; //串口工作方式1,允许接收
- TMOD=0x20; //定时器T1工作方式2
- TH1=0xfd;
- TL1=0xfd; //定时初值
- // PCON&=0x00; //SMOD=0 电源控制寄存器PCON SMOD=1时波特率倍增
- PCON=0x80; //SMOD=1时波特率倍增为19200
- TR1=1; //开启定时器1
- }
- /********以下是主函数********/
- void main()
- {
- uchar key;
- series_init(); //调串行口初始化函数
- while(1)
- {
- key=keyscan();
- switch(key)
- {
- case 0x7e:send_dat_1();break;//0 按下相应的键调数据发送函数
- case 0x7d:send_dat_2();break;//1
- case 0x7b:send_dat_3();break;//2
- case 0x77:send_dat_4();break;//3
- case 0xbe:send_dat_5();break;//4
- case 0xbd:send_dat_6();break;//5
- // case 0xbb:P0=table[6];break;//6
- // case 0xb7:P0=table[7];break;//7
- // case 0xde:P0=table[8];break;//8
- // case 0xdd:P0=table[9];break;//9
- // case 0xdb:P0=table[10];break;//a
- // case 0xd7:P0=table[11];break;//b
- // case 0xee:P0=table[12];break;//c
- // case 0xed:P0=table[13];break;//d
- // case 0xeb:P0=table[14];break;//e
- // case 0xe7:P0=table[15];break;//f
- default: break; //无键按下
- }
- }
- }
复制代码机,直接进入主题吧。4x4键盘反转法,按下按键发送相应的串口数据,但是上位机收到的确是一堆数据,数据是正确的,只是多收到了好几遍,判定键盘消抖没做好!
{
uchar key,CurrenKey=0xff;
series_init(); //调串行口初始化函数
while(1)
{
key=keyscan();
if(key!=CurrentKey)
{
CurrentKey=key;
switch(key)
{
case 0x7e:send_dat_1();break;//0 按下相应的键调数据发送函数
case 0x7d:send_dat_2();break;//1
case 0x7b:send_dat_3();break;//2
case 0x77:send_dat_4();break;//3
case 0xbe:send_dat_5();break;//4
case 0xbd:send_dat_6();break;//5
// case 0xbb:P0=table[6];break;//6
// case 0xb7:P0=table[7];break;//7
// case 0xde:P0=table[8];break;//8
// case 0xdd:P0=table[9];break;//9
// case 0xdb:P0=table[10];break;//a
// case 0xd7:P0=table[11];break;//b
// case 0xee:P0=table[12];break;//c
// case 0xed:P0=table[13];break;//d
// case 0xeb:P0=table[14];break;//e
// case 0xe7:P0=table[15];break;//f
default:CurrentKey=0xff; break; //无键按下
}
}
}
}
楼主可以试试这样,加一个当前按键中间变量,相同则不重复动作,释放后则设为初始值。
一周热门 更多>