历史上的今天
今天是:2024年11月16日(星期六)
2019年11月16日 | PIC16F877矩阵键盘的识别
2019-11-16 来源:eefocus
关于矩阵键盘的识别方法在51矩阵键盘识别中已经说过,现在要说的是PIC单片机与51单片机的区别,主要是PIC单片机的口子的输入输出需要TRISn寄存器设置,具体如下:

扫描法:
#include
#define uchar unsigned char
#define uint unsigned int
uchar num;
const ucharSSEG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay1ms(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void keyscan()
{
uchar temp;
TRISB=0x0f;
PORTB=0x7f;
temp=PORTB&0x0f;
if(temp!=0x0f)
{
delay1ms(10);
temp=PORTB&0x0f;
if(temp!=0x0f)
{
num=temp|0x70;
}
temp=PORTB&0x0f;
while(temp!=0x0f)
{
temp=PORTB&0x0f;
}
switch(num)
{
case 0x7e:num =12;break;
case0x7d: num =13;break;
case 0x7b:num =14;break;
case 0x77:num =15;break;
}
}
PORTB=0xbf;
temp=PORTB&0x0f;
if(temp!=0x0f)
{
delay1ms(10);
temp=PORTB&0x0f;
if(temp!=0x0f)
{
num=temp|0xb0;
}
temp=PORTB&0x0f;
while(temp!=0x0f)
{
temp=PORTB&0x0f;
}
switch(num)
{
case 0xbe:num =8;break;
case0xbd: num =9;break;
case 0xbb:num =10;break;
case 0xb7:num =11;break;
}
}
PORTB=0xdf;
temp=PORTB&0x0f;
if(temp!=0x0f)
{
delay1ms(10);
temp=PORTB&0x0f;
if(temp!=0x0f)
{
num=temp|0xd0;
}
temp=PORTB&0x0f;
while(temp!=0x0f)
{
temp=PORTB&0x0f;
}
switch(num)
{
case 0xde:num =4;break;
case0xdd: num =5;break;
case 0xdb:num =6;break;
case 0xd7:num =7;break;
}
}
PORTB=0xef;
temp=PORTB&0x0f;
if(temp!=0x0f)
{
delay1ms(10);
temp=PORTB&0x0f;
if(temp!=0x0f)
{
num=temp|0xe0;
}
temp=PORTB&0x0f;
while(temp!=0x0f)
{
temp=PORTB&0x0f;
}
switch(num)
{
case 0xee:num =0;break;
case0xed: num =1;break;
case 0xeb:num =2;break;
case 0xe7:num =3;break;
}
}
}
void main()
{
num=0xff;
TRISD=0;
PORTD=0;
while(1)
{
keyscan();
PORTD=~SSEG[num];
}
}
线反转法:
#include
#define uchar unsigned char
#define uint unsigned int
uchar num;
const ucharSSEG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay1ms(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void keyscan()
{
uchar temp,z,x;
TRISB=0x0f;
PORTB=0x0f;
x=PORTB&0x0f;
if(x!=0x0f)
{
delay1ms(10);
x=PORTB&0x0f;
if(x!=0x0f)
{
temp=PORTB&0x0f;
TRISB=0xf0;
PORTB=0xf0;
z=temp|PORTB;
x=PORTB&0xf0;
while(x!=0xf0)//松手检测
{
x=PORTB&0xf0;
}
switch(z)
{
case0xee: num =0; break;
case 0xde: num =4; break;
case 0xbe: num =8; break;
case 0x7e: num =12; break;
case 0xed: num =1; break;
case 0xdd: num =5; break;
case 0xbd: num =9; break;
case 0x7d: num =13; break;
case 0xeb: num =2; break;
case 0xdb: num =6;break;
case 0xbb: num =10;break;
case 0x7b: num =14;break;
case 0xe7: num =3;break;
case 0xd7: num =7;break;
case 0xb7: num =11;break;
case 0x77: num =15;break;
}
}
}
}
void main()
{
num=0xff;
TRISD=0;
PORTD=0;
while(1)
{
keyscan();
PORTD=~SSEG[num];
}
}
上一篇:PIC单片机USART的应用
下一篇:PIC单片机调试心得
史海拾趣
|
iphone和ipad的触摸屏是电容式的触摸屏吗? 这个比电阻式的贵多少呢? 支持多点触摸是怎么实现的呢? 国内没有能实现这个功能的吗??… 查看全部问答> |
|
小弟刚上手驱动开发不久,现在用PB5.0做驱动。 现在是想按扇区读写全部的flash rom,我知道PB中有FMD_WriteSector等函数可以读写扇区,但不知道如何调用? 另外我还想问一下,用PB FOR CE5.0写的驱动能在windows mobile 上面用吗? 谢谢各位高手… 查看全部问答> |
|
我公司因业务拓展需要,急聘wince应用程序开发工程师 要求熟悉Wince5.0 有VC /EVC开发经验 有意者请发简历到email:senses531@163.com… 查看全部问答> |
|
在s3c2410下程序是一定要下到0x30200000这里么?我自己修改了一个ucos的程序,下到芯片,但是指定的地址是从0开始,结果跑错了,然后就一直不能再下载其他程序了,请问应该怎么修正这个错误。 原因可能是:我查了下,下载程序时总是 ...… 查看全部问答> |
|
想到电池我的第一个念头就是直的,长度在5cm-10cm左右而已。但在日本东京的一个太阳能展览上,展现出了一个被制作成花朵和叶子形状的太阳能电池模型。这种由日本产业技巧综合研究所、日本TOKKI公司和三菱公司共同开发研制的彩色太阳能电池不仅重量 ...… 查看全部问答> |
|
用f123做了个电路板,用的是前2年的片子,烧写调试成功,偶然间不小心烧了片子,换了新的(刚买的),然后就提示60错误,找不到设备,请教斑竹为什么?头都大了,电路没问题的,用的是同样的电路板(同一批做的),元件也一样,是什么问题啊? 1。 ...… 查看全部问答> |
|
老板交给的任务终于快搞定了 ,谁知道现在又冒出来这样一个问题,本来脱离仿真器程序是可以运行的 。可前天把遥控器和另外一个板子的串口联起来调串口后,遥控器板子上的程序脱离仿真器就 不能运行了。各位高手,又谁知道这是什么原因呢 ? … 查看全部问答> |




