鱼C论坛

 找回密码
 立即注册
查看: 2373|回复: 2

普中51单片机,问题求解

[复制链接]
发表于 2019-12-4 16:29:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 HTIAN 于 2019-12-4 16:30 编辑


  1. #include "reg52.h"                       

  2. typedef unsigned int u16;          
  3. typedef unsigned char u8;

  4. #define GPIO_DIG P0
  5. #define GPIO_KEY P1

  6. sbit LSA=P2^2;                //38译码器引脚
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;

  9. u8 KeyValue;        //


  10. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  11.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F码表
  12. u8 show[2]={0,0};//存储两个矩阵键盘数据的数列
  13. void delay(u16 i)
  14. {
  15.         while(i--);       
  16. }


  17. void KeyDown(void)//键盘扫描程序
  18. {
  19.         char a=0;
  20.         u8 i;
  21.         GPIO_KEY=0x0f;
  22.         if(GPIO_KEY!=0x0f)//检测是否按下
  23.         {
  24.                 for(i;i<=1;i++)
  25.                 {
  26.                         delay(1000);//消抖
  27.                         if(GPIO_KEY!=0x0f)
  28.                         {       
  29.                                 //??????
  30.                                 GPIO_KEY=0X0F;
  31.                                 switch(GPIO_KEY)
  32.                                 {
  33.                                         case(0X07):        KeyValue=0;break;
  34.                                         case(0X0b):        KeyValue=1;break;
  35.                                         case(0X0d): KeyValue=2;break;
  36.                                         case(0X0e):        KeyValue=3;break;
  37.                                 }
  38.                                 //??????
  39.                                 GPIO_KEY=0XF0;
  40.                                 switch(GPIO_KEY)
  41.                                 {
  42.                                         case(0X70):        KeyValue=KeyValue;break;
  43.                                         case(0Xb0):        KeyValue=KeyValue+4;break;
  44.                                         case(0Xd0): KeyValue=KeyValue+8;break;
  45.                                         case(0Xe0):        KeyValue=KeyValue+12;break;
  46.                                 }
  47.                                 if((a<50)&&(GPIO_KEY!=0xf0))         //
  48.                                 {
  49.                                         delay(100);
  50.                                         a++;
  51.                                         i++;
  52.                                        
  53.                                 }
  54.                         }
  55.                 }
  56.         }

  57. }

  58. void main()
  59. {       
  60.         u8 q=0;
  61.         while(1)
  62.         {
  63.                 if(q=0)
  64.                 {
  65.                         LSA=0;
  66.                         LSB=0;
  67.                         LSC=0;
  68.                         KeyDown();
  69.                         show[0]=smgduan[KeyValue];
  70.                         GPIO_DIG=show[0];
  71.                         q=1;
  72.                         delay(10);
  73.                         if(q=1)
  74.                         {
  75.                                 LSA=1;
  76.                                 LSB=0;
  77.                                 LSC=0;
  78.                                 KeyDown();
  79.                                 show[1]=smgduan[KeyValue];
  80.                                 GPIO_DIG=show[1];
  81.                                 q=2;
  82.                                 delay(10);
  83.                                 while(q=2)//重复输出
  84.                                 {
  85.                                         LSA=0;
  86.                                         LSB=0;
  87.                                         LSC=0;
  88.                                         GPIO_DIG=show[0];
  89.                                         delay(100);
  90.        
  91.                                         LSA=1;
  92.                                         LSB=0;
  93.                                         LSC=0;
  94.                                         GPIO_DIG=show[1];
  95.                                         delay(1000);
  96.        
  97.                                         GPIO_KEY=0x0f;//检测是否有新的输入
  98.                                         if(GPIO_KEY!=0x0f)
  99.                                         {
  100.                                                 q=0;
  101.                                                 show[0]=0;
  102.                                                 show[1]=0;               
  103.                                         }
  104.                                        
  105.                                 }
  106.                         }
  107.                 }         
  108.         }
  109. }
复制代码

我想实现第一按矩阵键盘在数码管上第8位显示数字,第二次按矩阵键盘在第7 位数码管上显示数字,有以上代码,
怎么能检测到第一次输入和第二次输入并重复显示,我在板子上下载程序只有一个数码管亮,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-13 10:11:06 | 显示全部楼层
你可以这么样:比如在矩阵键盘上按第一个按键然后直接段选位选,你第二个键重新定段选位选,你这个程序的段选位选美又改变所以只是在一个位置改变数值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-22 18:04:12 | 显示全部楼层
不建议在开发板上实验,其他模块也会占用IO口的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 18:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表