找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2547|回复: 0
打印 上一主题 下一主题
收起左侧

单片机16位按键控制两位数码管程序Proteus仿真

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


1.尽量不要一个一个位的设置,通过P0,P1,P2设置输出状态
2.P1 = 0x0f;
delay(1);
Tmp = P1 ^ 0x0f;

P1 = 0xf0;
delay(1);
Tmp = P1 >> 4 ^ 0x0f
3.P1=0x0f->芯片内部对外输出状态

单片机源程序如下:
  1. #include <reg51.h>
  2. typedef unsigned char uint8;
  3. typedef unsigned int uint16;

  4. code uint8 LED_CODE1[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  5. 0x7f,0x6f,0x3f,0x06,0x5b,0x4f,0x66,0x6d};
  6. //个位:0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5
  7. code uint8 LED_CODE2[] = {0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,
  8. 0x3f,0x3f,0x06,0x06,0x06,0x06,0x06,0x06};
  9. //十位:0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1

  10. uint8 KeyValue; //存放读取的键值
  11. uint8 KeyState; //存放键的状态

  12. void delay(uint16 x)
  13. {
  14.         uint16 i,j;
  15.         for(i = x; i > 0; i --)
  16.         for(j = 114; j > 0; j --);
  17. }

  18. void Beep()
  19. {
  20.         uint8 i;
  21.         for(i=0;i<100;i++)
  22.         {
  23.                 delay(1);
  24.                 P3 ^= 0x01;
  25.         }
  26. }


  27. void DigDisplay()
  28. {
  29.         P2 = 0x01;
  30.         P0 = LED_CODE1[KeyValue];
  31.         delay(10);
  32.         P2 = 0x02;
  33.         P0 = LED_CODE2[KeyValue];
  34.         delay(10);
  35. }

  36. void KeyDown()
  37. {
  38.         uint8 Tmp;
  39.         P1=0xf0; //对于并行口,不算赋值,是输出状态;
  40.         if(P1!=0xf0)
  41.         {
  42.                 KeyState=1;
  43.                 P1=0x0f;
  44.                 Tmp = P1 ^ 0x0f;  //检测低四位
  45.                 switch(Tmp)
  46.                 {
  47.                         case 1: KeyValue = 0; break;
  48.                         case 2: KeyValue = 1; break;
  49.                         case 4: KeyValue = 2; break;
  50.                         case 8: KeyValue = 3; break;
  51.                         default: KeyValue = 16;
  52.                 }
  53.                 P1=0xf0;
  54.                 Tmp = P1 >> 4 ^ 0x0f;//检测高四位
  55.                 switch(Tmp)
  56.                 {
  57.                         case 1: KeyValue += 0; break;
  58.                         case 2: KeyValue += 4; break;
  59.                         case 4: KeyValue += 8; break;
  60.                         case 8: KeyValue += 12;
  61.                 }
  62.                 while(P1!=0xf0);
  63.                 Beep();
  64.         }
  65. }

  66. void main()
  67. {
  68.         KeyState = 0;
  69.         KeyValue = 0;
  70.         while(1)
  71.         {
  72.                 KeyDown();
  73.                 if(KeyState==1)
  74.                         KeyState = 0;
  75.                 DigDisplay();
  76.         }
  77. }
复制代码

所有资料51hei附件下载:
实验四.zip (192.67 KB, 下载次数: 13)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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