找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我的单片机电子密码锁程序

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include "Absacc.h"
  2. #define C8255_A XBYTE[0x7F00]  //8255 端口地址定义
  3. #define C8255_B XBYTE[0x7F01]
  4. #define C8255_C XBYTE[0x7F02]
  5. #define C8255_CON  XBYTE[0x7F03]

  6. unsigned char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  7.                                         0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
  8. unsigned char b[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 显示缓冲

  9. unsigned char key_down;
  10. unsigned char key_value;
  11. unsigned char key_count;
  12. void delay(unsigned int time)
  13. {
  14.         unsigned int i;
  15.         for(i=0; i<time; i++);
  16. }
  17. void keyscan() // 按键扫描函数
  18. {
  19.         unsigned char cc;
  20.         C8255_A = 0x00; //X1 ~ X4 置 0
  21.         cc = C8255_C;  // 得到 Y1 ~ Y4 的值
  22.         key_down = (~cc) & 0x0f;
  23. }
  24. void display() // 显示函数
  25. {
  26.         unsigned char i, j = 0xDF;
  27.         for(i=0; i<6; i++)
  28.         {
  29.                 C8255_A = 0xFF;
  30.                 C8255_B = a[b[i]]; // 查表输出显示
  31.                 C8255_A = j;
  32.                 delay(0x100);
  33.                 j = (j>>1)|(j<<7);
  34.         }
  35. }
  36. void clear()  // 清屏
  37. {
  38.         C8255_B = 0x00;
  39. }
  40. void writebuffer()
  41. {
  42.         b[key_count] = key_value;
  43.         key_count--;
  44.         if(key_count == -1)
  45.         key_count = 5;
  46.         display();
  47.         clear();
  48.         keyscan();
  49.         while(key_down) // 键盘消抖
  50.         {
  51.                 display();
  52.                 clear();
  53.                 keyscan();
  54.         }
  55. }
  56. void getkey()  // 得到按键值
  57. {
  58.         unsigned char value;
  59.         unsigned char i, j = 0xFE;
  60.         for(i=0; i<4; i++)
  61.         {
  62.                 C8255_A = j;
  63.                 value = C8255_C;
  64.                 if(!(value & 0x01)) // 行 1
  65.                 {
  66.                         key_value = i + 0;
  67.                         writebuffer();
  68.                         return;
  69.                 }
  70.                 if(!(value & 0x02)) // 行 2
  71.                 {
  72.                         key_value = i + 4;
  73.                         writebuffer();
  74.                         return;
  75.                 }
  76.                 if(!(value & 0x04)) // 行 3
  77.                 {
  78.                         key_value = i + 8;
  79.                         writebuffer();
  80.                         return;
  81.                 }
  82.                 if(!(value & 0x08)) // 行 4
  83.                 {
  84.                         key_value = i + 12;
  85.                         writebuffer();
  86.                         return;
  87.                 }
  88.                 j <<= 1;
  89.         }
  90. }
  91. void main()
  92. {
  93.         C8255_CON = 0x81;  //8255 初始化
  94.         key_count = 5;
  95.         while(1)
  96.         {
  97.                 display(); // 显示
  98.                 clear();  // 清屏
  99.                 keyscan(); // 按键扫描
  100.                 if(key_down)  // 判是否有键按下
  101.                 {
  102.                         display();
  103.                         delay(0x80);
  104.                         clear();
  105.                         keyscan();
  106.                         if(key_down)
  107.                         {
  108.                                 getkey();  // 得到按键值
  109.                         }
  110.                 }
  111.         }
  112. }
复制代码

所有资料51hei提供下载:
课程设计.zip (293.17 KB, 下载次数: 4)
keshetu.doc (256.5 KB, 下载次数: 3)


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

使用道具 举报

沙发
ID:122829 发表于 2019-6-8 13:54 | 只看该作者
这里面哪来的8255~~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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