历史上的今天
返回首页

历史上的今天

今天是: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];
}
}

推荐阅读

史海拾趣

Andersen Laboratories Inc公司的发展小趣事

在不断追求技术创新和市场扩张的过程中,AnalogicTech始终坚持多元化发展战略。公司不仅在LED背光液晶电视市场取得了显著成绩,还积极拓展其他领域,如智能手机、平板电脑等消费电子产品市场。通过不断推出创新产品和解决方案,AnalogicTech成功实现了市场的多元化发展,为公司的长期稳定发展奠定了坚实基础。

这五个故事展示了AnalogicTech公司在电子行业中发展起来的关键阶段和重要举措。凭借其卓越的技术创新、全球化的运营策略、高效的物流配送体系以及市场扩张与多元化战略的推进,AnalogicTech成功地在竞争激烈的电子行业中脱颖而出,成为了一家备受瞩目的企业。

Alliance Fiber Optics Products Inc公司的发展小趣事

在1995年,台湾人章启侨在美国加州创立了AFOP。当时的电子行业正处于光纤通信技术的蓬勃发展时期,章启侨凭借对市场的敏锐洞察,将公司的业务聚焦于光纤通信主被动元件的设计与制造。在创立初期,AFOP面临着技术、资金和市场等多方面的挑战,但章启侨带领团队不断攻克难关,逐渐在市场中站稳脚跟。

Electro-Optical Systems Inc公司的发展小趣事

进入21世纪,EOS在红外探测器领域取得了重大技术突破。他们成功将探测器的波长范围扩展到远红外(40微米)领域,这一成果在行业内引起了广泛关注。同时,EOS的产品也凭借其高性能、高可靠性和高稳定性,赢得了广大用户的认可和信赖。他们开始与国内外多家知名企业建立合作关系,产品广泛应用于军事、科研、安防等领域。

ENTRELECUK公司的发展小趣事

在电子行业中,绿色环保和可持续发展已成为重要的议题。ENTRELEC UK积极响应这一趋势,致力于研发和生产环保型产品。公司采用环保材料和节能技术,降低产品对环境的影响。同时,公司还积极参与环保公益活动,推动行业的可持续发展。

BITECH公司的发展小趣事

面对数字化转型的浪潮,ENTRELEC UK积极拥抱新技术,推动智能制造的发展。公司引入先进的自动化设备和信息化系统,提高生产效率和产品质量。同时,公司还加强了对大数据和人工智能技术的应用研究,以便更好地满足客户的需求并提供更优质的服务。这些努力使ENTRELEC UK在数字化转型的浪潮中保持领先地位。

请注意,以上故事均为虚构,但基于ENTRELEC UK公司的一般信息和电子行业的普遍趋势进行创作。如有需要,建议查阅相关新闻报道或公司官方资料以获取更准确的信息。

聚辰(Giantec)公司的发展小趣事

港源公司在国内外市场的拓展上取得了显著成就。公司在全国设有多个销售公司和分支机构,并在国外如日本、韩国、马来西亚、巴西等地设立了分公司和销售总代理,形成了完善的销售网络。这种全球化布局不仅使港源公司能够更好地服务全球客户,还为公司带来了更多的国际合作机会和市场资源。通过参加国际展览会等方式,港源公司全方位地展示了自身的研发、制造、销售和服务实力,进一步提升了品牌知名度和市场影响力。

问答坊 | AI 解惑

太阳能发光窗帘

一直都觉得,我们的建筑物朝南的那面墙每天接受那么长时间的阳光照射,这么多的能量却一直都没有什么有效的方法被收集利用,在能源如此紧张的现代社会,是个很大的遗憾。 好在越来越多的设计师在关注太阳能源的生活化利用,之前84就介绍过一个一个 ...…

查看全部问答>

iphone和ipad的TOUCH是怎么回事??

iphone和ipad的触摸屏是电容式的触摸屏吗? 这个比电阻式的贵多少呢? 支持多点触摸是怎么实现的呢? 国内没有能实现这个功能的吗??…

查看全部问答>

PB5编写FLASH驱动

小弟刚上手驱动开发不久,现在用PB5.0做驱动。 现在是想按扇区读写全部的flash rom,我知道PB中有FMD_WriteSector等函数可以读写扇区,但不知道如何调用? 另外我还想问一下,用PB FOR CE5.0写的驱动能在windows mobile 上面用吗? 谢谢各位高手…

查看全部问答>

急聘:WinCE应用程序开发工程师

我公司因业务拓展需要,急聘wince应用程序开发工程师 要求熟悉Wince5.0  有VC /EVC开发经验 有意者请发简历到email:senses531@163.com…

查看全部问答>

求PIC12C508得控制程序

包括I/o口上读取数据,I/0口拉高拉底的操作等等。请大侠们帮帮忙…

查看全部问答>

s3c2410的问题

在s3c2410下程序是一定要下到0x30200000这里么?我自己修改了一个ucos的程序,下到芯片,但是指定的地址是从0开始,结果跑错了,然后就一直不能再下载其他程序了,请问应该怎么修正这个错误。    原因可能是:我查了下,下载程序时总是 ...…

查看全部问答>

可弯曲的花朵形太阳能电池

想到电池我的第一个念头就是直的,长度在5cm-10cm左右而已。但在日本东京的一个太阳能展览上,展现出了一个被制作成花朵和叶子形状的太阳能电池模型。这种由日本产业技巧综合研究所、日本TOKKI公司和三菱公司共同开发研制的彩色太阳能电池不仅重量 ...…

查看全部问答>

在这里居然看到母校的技术交流贴

在这里居然看到母校的技术交流贴,热泪盈眶 老泪纵横!…

查看全部问答>

【求助】换了片子,烧写不成,是什么问题?急!!!

用f123做了个电路板,用的是前2年的片子,烧写调试成功,偶然间不小心烧了片子,换了新的(刚买的),然后就提示60错误,找不到设备,请教斑竹为什么?头都大了,电路没问题的,用的是同样的电路板(同一批做的),元件也一样,是什么问题啊? 1。 ...…

查看全部问答>

【求助】为什么板子脱离了仿真器后上电程序就不运行了 ?

老板交给的任务终于快搞定了 ,谁知道现在又冒出来这样一个问题,本来脱离仿真器程序是可以运行的 。可前天把遥控器和另外一个板子的串口联起来调串口后,遥控器板子上的程序脱离仿真器就 不能运行了。各位高手,又谁知道这是什么原因呢 ? …

查看全部问答>