找回密码
 立即注册
搜索
热搜: 中医 针灸 咳嗽
查看: 195|回复: 0

独立键盘

[复制链接]

3711

主题

1

回帖

1万

积分

管理员

积分
11937
发表于 2023-1-26 11:55:17 | 显示全部楼层 |阅读模式
  1. /*

  2. 独立键盘

  3. 数码管字符串,双精度,长整型显示
  4. 利用共用体指针解决方案


  5. */
  6. #include <REG52.H>
  7. #include <stdio.h>
  8. #include <string.h>

  9. #define Uchar unsigned char
  10. #define Uint  unsigned int
  11. #define Ulong unsigned long

  12. // 引脚定义区域
  13. sbit DU       = P2 ^ 6; // 数码管段选
  14. sbit WE       = P2 ^ 7; // 数码管位选
  15. sbit S2= P3 ^ 0; //S2键盘定义
  16. int IS_double = 999;

  17. int Get_val(union DIS_VAL *val, int type);
  18. void Dis_scan();
  19. void DIS_play(int result, int type);
  20. void delay(Uchar z, int mod);
  21. void Chars_convert(union DIS_VAL *chars_ptr);
  22. void Ulong_convert(Ulong Z);
  23. int Double_convert(double Z);

  24. int val_arr[] = {24, 24, 24, 24, 24, 24, 24, 24}; // 24 在表码表中定义熄灭
  25. // 用共用体作为万能数据类型,兼容多种场景
  26. union DIS_VAL {
  27.     /*无符号长整型*/
  28.     unsigned long ULONG_data;
  29.     /*浮点型*/
  30.     float Float_data;
  31.     /*双精度*/
  32.     double Double_data;
  33.     /*字符串*/
  34.     char *Chars_data;
  35. };

  36. // 段码表
  37. Uchar code DUtabel[] = {
  38.     0x3F, //"0"
  39.     0x06, //"1"
  40.     0x5B, //"2"
  41.     0x4F, //"3"
  42.     0x66, //"4"
  43.     0x6D, //"5"
  44.     0x7D, //"6"
  45.     0x07, //"7"
  46.     0x7F, //"8"
  47.     0x6F, //"9"
  48.     0x77, //"A"
  49.     0x7C, //"B"
  50.     0x39, //"C"
  51.     0x5E, //"D"
  52.     0x79, //"E"
  53.     0x71, //"F"
  54.     0x76, //"H"
  55.     0x38, //"L"
  56.     0x6d, // S
  57.     0x6d, // S
  58.     0x37, //"n"
  59.     0x3E, //"u"
  60.     0x73, //"P"
  61.     0x63, //"o"
  62.     0x00, // 熄灭
  63.     0x01, // 上 -
  64.     0x40, // 中 -
  65.     0x08, // 下 -

  66. };

  67. // 位码表
  68. Uchar code WEtabel[] = {
  69.     0xFE, // 1
  70.     0xFD, // 2
  71.     0xfb, // 3
  72.     0xf7, // 4
  73.     0xef, // 5
  74.     0xdf, // 6
  75.     0xbf, // 7
  76.     0x7f, // 8
  77. };

  78. // 合法字符表
  79. Uchar code Enable_tabel[] = {
  80.     '0',
  81.     '1',
  82.     '2',
  83.     '3',
  84.     '4',
  85.     '5',
  86.     '6',
  87.     '7',
  88.     '8',
  89.     '9',
  90.     'a',
  91.     'b',
  92.     'c',
  93.     'd',
  94.     'e',
  95.     'f',
  96.     'h',
  97.     'l',
  98.     'A',
  99.     'B',
  100.     'C',
  101.     'D',
  102.     'E',
  103.     'F',
  104.     'H',
  105.     'L',
  106.     'S',
  107.     's',
  108.     'n',
  109.     'N',
  110.     'u',
  111.     'U',
  112.     'P',
  113.     'p',
  114.     'O',
  115.     'o',
  116.     '-',
  117.     '_',

  118. };

  119. int main()
  120. {
  121.     union DIS_VAL val;

  122.     // //字符串显示处理方案
  123.     // val.Chars_data = "05-09";
  124.     // if(Get_val(&val, 4)==1){//如果传入的数据合法

  125.     // //长整形处理方案
  126.     // val.ULONG_data = 23311;

  127.     // if(Get_val(&val, 1)==1){//如果传入的数据合法

  128.         //     // 双精度处理方案
  129.     // val.Double_data = 88888888.55;

  130.     // if (Get_val(&val, 3) == 1) { // 如果传入的数据合法
  131.     val.ULONG_data = 0;
  132.     if(Get_val(&val, 1)==1 && S2 == 0){
  133.         while (1)
  134.         {   
  135.             
  136.             if( S2 == 0){
  137.                 delay(80,1); //软件消抖
  138.                 if (S2 == 0)
  139.                 {
  140.                 val.ULONG_data++;
  141.                 Get_val(&val, 1);
  142.                 }
  143.                
  144.               
  145.             }
  146.            Dis_scan();
  147.         }
  148.         

  149.   }
  150.    



  151.     // // 双精度处理方案
  152.     // val.Double_data = 88888888.55;

  153.     // if (Get_val(&val, 3) == 1) { // 如果传入的数据合法

  154.     //     while (1)

  155.     //     {
  156.     //         Dis_scan();
  157.     //     }
  158.     // } else {
  159.     //     // 显示错误代码 001 传入字符串有误
  160.     //     val.Chars_data = "no000001";
  161.     //     Chars_convert(&val);
  162.     //     while (1) {
  163.     //         Dis_scan();
  164.     //     }
  165.     // }
  166. }

  167. // void display(Z)
  168. // {
  169. //     // Z长度
  170. //     int Zlen = 0;
  171. //     /*存储Z每个位的数字数组变量*/
  172. //     int val[8];
  173. //     int i;

  174. //     while (Z != 0) {
  175. //         // 提取n的各个数位上的数
  176. //         val[Zlen++] = Z % 10;
  177. //         Z /= 10;
  178. //     }
  179. // }
  180. /*

  181. 这个一个万能变量的处理函数
  182. /////////////////////////////////////////
  183. 参数1:union 指针
  184. 参数2:tpye  处理类型
  185. 返回值说明:0 传入数据有误,进程终止 1:处理成功
  186. /////////////////////////////////////////
  187. 1:无符号长整型
  188. 2:浮点型
  189. 3:双精度
  190. 4.字符串
  191. */
  192. int Get_val(union DIS_VAL *val, int type)
  193. {

  194.     char *charP       = val->Chars_data;
  195.     Ulong *ulongP     = val->ULONG_data;
  196.     double Double_val = val->Double_data;
  197.     int count;
  198.     int find_char;
  199.     int i = 0;

  200.     switch (type) {
  201.         case 1: // 无符号长整型
  202.             if (val->ULONG_data < 0 || val->ULONG_data > 99999999) {
  203.                 return 0;
  204.             }

  205.             Ulong_convert(ulongP);
  206.             break;

  207.         case 2: // 浮点型
  208.             // printf("%f", val->Float_data);
  209.             if (val->Float_data < 0 || val->Float_data > 99999999) {
  210.                 return 0;
  211.             }

  212.             break;
  213.         case 3: // 双精度

  214.             if (val->Double_data < 0 || val->Double_data > 99999999) {
  215.                 return 0;
  216.             }
  217.             IS_double = Double_convert(Double_val);

  218.             break;
  219.         case 4: // 字符串
  220.             // printf("%s", val->Chars_data);

  221.             count     = 0;
  222.             find_char = 1; // 和编码表比对字符串 1表示找到了  0代表找不到
  223.             Chars_convert(val);
  224.             // 传入的字符串合法性检测 如果中途返回0 则表示 传入的数据有误
  225.             while (charP[count] != '\0') {
  226.                 int count_char = count;
  227.                 count++;
  228.                 for (i = 0; i < sizeof(Enable_tabel) / sizeof(Uchar); i++) {
  229.                     if (Enable_tabel[i] == charP[count_char]) {

  230.                         find_char = 1;
  231.                         // continue;
  232.                         break;
  233.                     } else {

  234.                         find_char = 0;
  235.                     }
  236.                 }

  237.                 if (find_char == 0 || count >= 9) {
  238.                     return 0;
  239.                 } else {
  240.                     continue;
  241.                 }
  242.             }

  243.             break;

  244.         default:
  245.             break;
  246.     }

  247.     return 1;
  248. }

  249. /*数码管扫描显示
  250. 参数1:传入显示数据的指针首地址;
  251. */
  252. void Dis_scan()
  253. {
  254.     int i;

  255.     for (i = 0; i < 8; i++) {

  256.         DIS_play(val_arr[i], i);
  257.     }
  258. }
  259. /*单位数码管显示
  260. 参数1:显示的结果     详情查询段位表DUtabel[]
  261. 参数2:显示在哪一位上 0-7
  262. */
  263. void DIS_play(int result, int WE_int)
  264. {
  265.     P0 = 0XFF;            // 清除断码
  266.     WE = 1;               // 打开位选锁存器
  267.     P0 = WEtabel[WE_int]; // 1111 1110 选通第WE_int位数码管
  268.     WE = 0;               // 锁存位选数据

  269.     DU = 1;               // 打开段选锁存器
  270.     P0 = DUtabel[result]; // 推送数据

  271.         /*判断小数点,加小数点*/
  272.     if (IS_double != 999 && IS_double == WE_int) {
  273.         P0 = DUtabel[result];
  274.         P0 |= 0x80;

  275.     } else {
  276.         P0 = DUtabel[result];
  277.     }
  278.     DU = 0; // 锁存段选数据
  279.     delay(2, 1);
  280. }
  281. /*
  282. 延迟函数.晶振:11.0592
  283. 参数1:z为数量
  284. 参数2:mod为模式
  285. 1:毫秒
  286. 2:秒
  287. */
  288. void delay(Uchar z, int mod)
  289. {
  290.     Uint i;

  291.     if (mod == 1) {
  292.         for (i = 0; i < z; i++) {

  293.             unsigned char a, b;
  294.             for (b = 102; b > 0; b--)
  295.                 for (a = 3; a > 0; a--)
  296.                     ;
  297.         }
  298.     }

  299.     else if (mod == 2) {
  300.         for (i = 0; i < z * 1000; i++) {
  301.             // 10000us //误差 -0.000000000002us
  302.             unsigned char a, b;
  303.             for (b = 102; b > 0; b--)
  304.                 for (a = 3; a > 0; a--)
  305.                     ;
  306.         }
  307.     }
  308. }
  309. /*转换到段表*/
  310. void Chars_convert(union DIS_VAL *chars_ptr)
  311. {
  312.     int i;
  313.     int char_i = 0;
  314.     while (chars_ptr->Chars_data[char_i] != '\0') {
  315.         char_i++;
  316.     }

  317.     for (i = 0; i < char_i; i++) {

  318.         switch ((chars_ptr->Chars_data)[i]) {
  319.             case '0':
  320.                 val_arr[i] = 0;
  321.                 break;
  322.             case '1':
  323.                 val_arr[i] = 1;
  324.                 break;
  325.             case '2':
  326.                 val_arr[i] = 2;
  327.                 break;
  328.             case '3':
  329.                 val_arr[i] = 3;
  330.                 break;
  331.             case '4':
  332.                 val_arr[i] = 4;
  333.                 break;
  334.             case '5':
  335.                 val_arr[i] = 5;
  336.                 break;
  337.             case '6':
  338.                 val_arr[i] = 6;
  339.                 break;
  340.             case '7':
  341.                 val_arr[i] = 7;
  342.                 break;
  343.             case '8':
  344.                 val_arr[i] = 8;
  345.                 break;

  346.             case '9':
  347.                 val_arr[i] = 9;
  348.                 break;
  349.             case 'a':
  350.                 val_arr[i] = 10;
  351.                 break;
  352.             case 'A':
  353.                 val_arr[i] = 10;
  354.                 break;
  355.             case 'b':
  356.                 val_arr[i] = 11;
  357.                 break;
  358.             case 'B':
  359.                 val_arr[i] = 11;
  360.                 break;
  361.             case 'c':
  362.                 val_arr[i] = 12;
  363.                 break;
  364.             case 'C':
  365.                 val_arr[i] = 12;
  366.                 break;
  367.             case 'D':
  368.                 val_arr[i] = 13;
  369.                 break;
  370.             case 'd':
  371.                 val_arr[i] = 13;
  372.                 break;
  373.             case 'E':
  374.                 val_arr[i] = 14;
  375.                 break;
  376.             case 'e':
  377.                 val_arr[i] = 14;
  378.                 break;

  379.             case 'F':
  380.                 val_arr[i] = 15;
  381.                 break;
  382.             case 'f':
  383.                 val_arr[i] = 15;
  384.                 break;
  385.             case 'H':
  386.                 val_arr[i] = 16;
  387.                 break;
  388.             case 'h':
  389.                 val_arr[i] = 16;
  390.                 break;
  391.             case 'L':
  392.                 val_arr[i] = 17;
  393.                 break;
  394.             case 'l':
  395.                 val_arr[i] = 17;
  396.                 break;
  397.             case 's':
  398.                 val_arr[i] = 18;
  399.                 break;
  400.             case 'S':
  401.                 val_arr[i] = 18;
  402.                 break;

  403.             case 'n':
  404.                 val_arr[i] = 20;
  405.                 break;
  406.             case 'N':
  407.                 val_arr[i] = 20;
  408.                 break;
  409.             case 'u':
  410.                 val_arr[i] = 21;
  411.                 break;
  412.             case 'U':
  413.                 val_arr[i] = 21;
  414.                 break;
  415.             case 'P':
  416.                 val_arr[i] = 22;
  417.                 break;
  418.             case 'p':
  419.                 val_arr[i] = 22;
  420.                 break;
  421.             case 'o':
  422.                 val_arr[i] = 23;
  423.                 break;
  424.             case 'O':
  425.                 val_arr[i] = 23;
  426.                 break;
  427.             case 0x00:
  428.                 val_arr[i] = 24;
  429.                 break;
  430.             case '`':
  431.                 val_arr[i] = 25;
  432.                 break;
  433.             case '-':
  434.                 val_arr[i] = 26;
  435.                 break;
  436.             case '_':
  437.                 val_arr[i] = 27;
  438.                 break;

  439.             default:
  440.                 break;
  441.         }
  442.     }
  443. }

  444. // 长整型处理方案
  445. void Ulong_convert(Ulong Z)
  446. {
  447.     // Z长度
  448.     int Zlen = 0;
  449.     int Ulongi;
  450.     int temp[8] = {24};
  451.     int ii;
  452.     for (ii = 0; ii < 8; ii++) {
  453.         val_arr[ii] = 24;
  454.     }

  455.     /*存储Z每个位的数字数组变量*/
  456.     if (Z == 0) {
  457.         val_arr[0] = 0;
  458.     }
  459.     while (Z != 0) {
  460.         // 提取n的各个数位上的数
  461.         val_arr[Zlen] = Z % 10;
  462.         Z /= 10;
  463.         Zlen++;
  464.     }

  465.     for (Ulongi = 0; Ulongi < 8; Ulongi++) {
  466.         temp[Ulongi] = val_arr[7 - Ulongi];
  467.     }

  468.     for (Ulongi = 0; Ulongi < 8; Ulongi++) {
  469.         val_arr[Ulongi] = temp[Ulongi];
  470.     }
  471. }
  472. int Double_convert(double Z)
  473. {
  474.     int Zlen       = 0;
  475.     Ulong zhengshu = Z / 1; // 整数部分
  476.     int ge;                 // 个位数
  477.     int zhengshu_count = 0; // 整数位数
  478.     double xiaoshu     = Z - (double)zhengshu;
  479.     int i              = 0;
  480.     Ulong tempge;
  481.     Uint ii = 0;
  482.     Ulong temp_zhengshu;
  483.     Ulong z = Z / 1;
  484.     if (z == 0) {
  485.         val_arr[0] = 0;
  486.         i          = 1;
  487.         IS_double  = 0;
  488.         ge         = 0;
  489.     } else {
  490.         temp_zhengshu = zhengshu;
  491.         while (temp_zhengshu > 0) {
  492.             // 提取n的各个数位上的数
  493.             temp_zhengshu /= 10;
  494.             ii++;
  495.         }
  496.     }

  497.     while (zhengshu > 0) {
  498.         // 提取n的各个数位上的数

  499.         val_arr[ii - Zlen - 1] = zhengshu % 10;
  500.         zhengshu /= 10;
  501.         Zlen++;
  502.     }
  503.     ge = Zlen;

  504.     if (z == 0) {

  505.         if (8 - Zlen > 0 || 8 - i > 0) {

  506.             for (i = ge + 1; i < 8; i++) {
  507.                 val_arr[i] = (xiaoshu * 10) / 1;
  508.                 tempge     = xiaoshu * 10;
  509.                 xiaoshu    = xiaoshu * 10 - tempge;
  510.             }
  511.         }

  512.     } else {
  513.         if (8 - Zlen > 0 || 8 - i > 0) {

  514.             for (i = ge ; i < 8; i++) {
  515.                 val_arr[i] = (xiaoshu * 10) / 1;
  516.                 tempge     = xiaoshu * 10;
  517.                 xiaoshu    = xiaoshu * 10 - tempge;
  518.             }
  519.         }

  520.                  return ge-1;
  521.     }

  522.     return ge;
  523. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|私人站点 ( 冀ICP备2023028127号-2 )

GMT+8, 2025-7-5 06:22 , Processed in 0.080432 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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