找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2443|回复: 1
收起左侧

51单片机键盘芯片74C922驱动代码

[复制链接]
ID:346927 发表于 2019-5-28 10:40 | 显示全部楼层 |阅读模式
74C922.PNG
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <math.h>
  4. #include <stdlib.h>

  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. #define nop() _nop_()
  8. const float ZERO = 0.1;
  9. uchar key = 16;
  10. long intValue = 0;
  11. float pointValue = 0.0;
  12. float mixValue = 0.0;
  13. uchar pointPos = 0;
  14. uchar numCount = 0;
  15. uchar pointCount = 0;
  16. uchar intFlag = 0;
  17. uchar code SEG_DAT[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  18. uchar code BIT_CS[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  19. void display(float floatValue);
  20.                      

  21. sbit SH_CP = P0^0;  //移位串行时钟脉冲
  22. sbit DS    = P0^1;  //串行数据输入
  23. sbit ST_CP = P0^2;  //数据并行输出锁存器控制脉冲
  24. void delay(uint t)
  25. {
  26.   uint i,j;
  27. for(i=0;i<t;i++)
  28. {
  29.   if (intFlag == 1)
  30.   {     
  31.    display(mixValue*100);
  32.   }
  33.   else
  34.   {
  35.    display(mixValue);
  36.   }
  37.   for(j=0;j<120;j++);
  38. }
  39. }
  40. //串行输入子程序  
  41. void Serial_Input_595(uchar dat)
  42. {  
  43. uchar i;
  44.                  
  45. for (i = 0; i < 8; i++)
  46.     {
  47.       if (dat&0x80) //发送高位
  48.   {
  49.    DS = 1;
  50.   }
  51.   else
  52.   {
  53.    DS = 0;
  54.   }
  55.   dat <<= 1; //次高位左移到高位
  56.   SH_CP = 0; //移位时钟线拉低
  57.   nop();
  58.   nop();   
  59.         SH_CP = 1; //DS位上的0或1在移位脉冲上升沿被移入595
  60.   nop();
  61.   nop();        
  62. }
  63. }
  64. //并行输出子程序  
  65. void Parallel_Output_595()
  66. {  
  67. ST_CP = 0;
  68. nop();
  69. nop();   
  70.     ST_CP = 1; //上升沿将数据送到输出锁存器
  71. nop();
  72. nop();
  73. }
  74. void display(float floatValue)
  75. {
  76. uchar i=0;
  77. uchar a[6];
  78. uchar temp;
  79. long intValue;
  80. if (floatValue<ZERO)
  81. {
  82.   numCount = 0;
  83.   pointPos = 0;
  84.   pointCount = 0;
  85.   intValue = 0;
  86.   pointValue = 0;
  87.   mixValue = 0;
  88.   intFlag = 0;
  89.   floatValue = 0;
  90. }
  91. switch (pointCount)
  92. {
  93.   case 0:
  94.    intValue = floatValue;
  95.    break;
  96.   case 1:
  97.    intValue = floatValue*10;
  98.    break;
  99.   case 2:
  100.    intValue = floatValue*100;
  101.    break;
  102.   case 3:
  103.    intValue = floatValue*1000;
  104.    break;
  105.   case 4:
  106.    intValue = floatValue*10000;
  107.    break;
  108.   case 5:
  109.    intValue = floatValue*100000;
  110.    break;
  111.   case 6:
  112.    intValue = floatValue*1000000;
  113.    break;
  114.   default:
  115.    break;
  116. }
  117. a[0]=intValue/100000;
  118. a[1]=(intValue%100000)/10000;
  119. a[2]=(intValue%10000)/1000;
  120. a[3]=(intValue%10000%1000)/100;
  121. a[4]=(intValue%10000%1000%100)/10;
  122. a[5]=intValue%10;
  123.   
  124. for(i = 0; i <= 5; i++)
  125. {
  126.   Serial_Input_595(BIT_CS[i]);
  127.   temp=a[i];
  128.   if (pointPos == 0)
  129.   {
  130.    Serial_Input_595(SEG_DAT[temp]);
  131.    Parallel_Output_595();
  132.   }
  133.   else
  134.   {
  135.    //if (i == (5 + pointPos - numCount))
  136.    if (i == 5 - (numCount - pointPos))
  137.    {
  138.     Serial_Input_595(SEG_DAT[temp]|0x80);
  139.    }
  140.    else
  141.    {
  142.     Serial_Input_595(SEG_DAT[temp]);
  143.    }   
  144.    Parallel_Output_595();
  145.   }
  146. }
  147. }
  148. uchar translate(uint keyCode)
  149. {
  150. switch(keyCode)
  151. {
  152.   case 0:
  153.    return '7';
  154.    break;
  155.   case 1:
  156.    return '4';
  157.    break;
  158.   case 2:
  159.    return '1';
  160.    break;
  161.   case 3:
  162.    return 'c';
  163.    break;
  164.   case 4:
  165.    return '8';
  166.    break;
  167.   case 5:
  168.    return '5';
  169.    break;
  170.   case 6:
  171.    return '2';
  172.    break;
  173.   case 7:
  174.    return '0';
  175.    break;
  176.   case 8:
  177.    return '9';
  178.    break;
  179.   case 9:
  180.    return '6';
  181.    break;
  182.   case 10:
  183.    return '3';
  184.    break;
  185.   case 11:
  186.    return '=';
  187.    break;
  188.   case 12:
  189.    return '/';
  190.    break;
  191.   case 13:
  192.    return '*';
  193.    break;
  194.   case 14:
  195.    return '-';
  196.    break;
  197.   case 15:
  198.    return '+';
  199.    break;
  200.   default:
  201.    break;
  202. }
  203. }
  204. void extern0_init(void)
  205. {
  206. IT0=1;
  207. EX0=1;
  208.     EA=1;
  209. }
  210. void extern0(void) interrupt 0
  211. {
  212. key = translate(P1 & 0x0f);
  213. if (key <= '9' && key >= '0')  //判断按下的键是否为数值
  214. {
  215.   numCount++;
  216.    if (pointPos == 0)
  217.   {
  218.    intValue = intValue*10 + (key-'0');
  219.   }
  220.    else
  221.   {
  222.    pointCount++;
  223.    switch (pointCount)
  224.    {
  225.     case 1:
  226.      pointValue = pointValue + (key-'0')*0.1;
  227.      break;
  228.     case 2:
  229.      pointValue = pointValue + (key-'0')*0.01;
  230.      break;
  231.     case 3:
  232.      pointValue = pointValue + (key-'0')*0.001;
  233.      break;
  234.     case 4:
  235.      pointValue = pointValue + (key-'0')*0.0001;
  236.      break;
  237.     case 5:
  238.      pointValue = pointValue + (key-'0')*0.00001;
  239.      break;
  240.     case 6:
  241.      pointValue = pointValue + (key-'0')*0.000001;
  242.      break;

  243.    }   
  244.   }
  245.   mixValue = intValue + pointValue;
  246.   
  247.   if(mixValue>=ZERO && mixValue<=999999.0)  //当前数值是否超出限定范围
  248.   {   
  249.   }
  250.   else
  251.   {
  252.    numCount = 0;
  253.    pointPos = 0;
  254.    pointCount = 0;
  255.    intValue = 0;
  256.    pointValue = 0;
  257.    mixValue = 0;
  258.    intFlag = 0;
  259.   }
  260. }
  261. else
  262. {
  263.    switch (key)
  264.   {
  265.    case 'c':
  266.     numCount = 0;
  267.     pointPos = 0;
  268.     pointCount = 0;
  269.     intValue = 0;
  270.     pointValue = 0;
  271.     mixValue = 0;
  272.     intFlag = 0;
  273.     break;
  274.    case '=':
  275.     pointPos = numCount; //记录小数点的位置
  276.     break;
  277.    case '-':
  278.     if (pointCount == 0)
  279.     {
  280.      numCount = 0;
  281.      pointPos = -2;
  282.      intFlag = 1;
  283.     }
  284.     while(mixValue>ZERO)
  285.     {   
  286.      mixValue = mixValue - 0.254;
  287.      delay(10);
  288.     }
  289.     if (mixValue<=ZERO)
  290.     {
  291.       numCount = 0;
  292.      pointPos = 0;
  293.      pointCount = 0;
  294.      intValue = 0;
  295.      pointValue = 0;
  296.      mixValue = 0;
  297.      intFlag = 0;
  298.     }
  299.     break;
  300.   }
  301. }
  302. }
  303. void main(void)
  304. {
  305. extern0_init();
  306. mixValue = -5;
  307. while(1)
  308. {
  309.   if (intFlag == 1)
  310.   {     
  311.    display(mixValue*100);
  312.   }
  313.   else
  314.   {
  315.    display(mixValue);
  316.   }
  317. }
  318. }
复制代码
全部资料51hei下载地址:
74C922.rar (84.54 KB, 下载次数: 9)

评分

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

查看全部评分

回复

使用道具 举报

ID:1 发表于 2019-5-28 19:47 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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