找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简易单片机计算器仿真,16按键行扫描式LCD1602显示

[复制链接]
ID:322892 发表于 2018-5-5 16:19 | 显示全部楼层 |阅读模式
简易计算器,行扫描式,LCD显示(非完美版)。16按键
0.jpg

单片机计算器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
162402icyllgagsmznlcma.png

单片机源程序如下:
  1. #include
  2. #include

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit Lcd_RS = P2^5;
  6. sbit Lcd_RW = P2^6;

  7. sbit Lcd_en = P2^7;

  8. uchar code table[] = "51201314";
  9. uchar code table1[] = "20140815";
  10. uchar code key16[]=
  11. {0xee,0xed,0xeb,0xe7,
  12. 0xde,0xdd,0xdb,0xd7,
  13. 0xbe,0xbd,0xbb,0xb7,
  14. 0x7e,0x7d,0x7b,0x77}
  15. uchar key_number;
  16. void delayMS(uint x)
  17. {
  18.    uchar i;
  19.    while(x--) for(i = 0; i < 120; i++);
  20.    
  21.     }

  22. bit Busy_Check()
  23. {
  24.    bit state;
  25.    Lcd_RS = 0;
  26.    Lcd_RW = 1;
  27.    Lcd_EN = 1;
  28.    delayMS(1);
  29.    
  30.    state=(bit)(P0&0x80);
  31.    Lcd_EN = 0;
  32.    delayMS(1);
  33.    return state;
  34. }

  35. void LCD_Wdata(uchar dat)
  36. {
  37.    while(Busy_Check());
  38.    Lcd_RS = 1;
  39.    Lcd_RW = 0;
  40.    Lcd_EN = 0;
  41.    P0 = dat;
  42.    Lcd_EN = 1;
  43.    delayMS(1);
  44.    Lcd_EN = 0;
  45. }

  46. void LCD_Wcmd(uchar cmd)
  47. {

  48.    while(Busy_Check());
  49.    Lcd_RS = 0;
  50.    Lcd_RW = 0;
  51.    P0 = cmd;
  52.    delayMS(1);
  53.    Lcd_EN = 0;
  54.    Lcd_EN = 1;
  55.    delayMS(1);
  56.    Lcd_EN = 0;
  57. }
  58. void Init_Lcd()
  59. {

  60.    LCD_Wcmd(0x38);
  61.    delayMS(1);
  62.    LCD_Wcmd(0x0f);
  63.    delayMS(1);
  64.    
  65.    LCD_Wcmd(0x06);
  66.    delayMS(1);
  67.    LCD_Wcmd(0x01);
  68.    delayMS(1);
  69. }

  70. bit pushkey()
  71. {

  72.    P1=0xf0;
  73.    if(P1!=0xf0)
  74.         return (1);
  75.         else
  76.         return (0);
  77. }

  78. void key_scan()
  79. {
  80.     uchar keycode,p;
  81.     delayMS(15);  
  82.      if(P1!=0xf0)
  83.        {P1?=?0xf7;
  84.          while(1)
  85.             {
  86.                keycode = P1;
  87.                if((keycode&0xf0)!=0xf0)?break;
  88.                P1=_cror_(P1,1);
  89.                }
  90.                while((pushkey()));
  91.                for  (p?=?0 p<16?P++)
  92.                   if ( keycode== key16[p])
  93.                   key_number=p;
  94.                     }
  95.       }
  96. void LCD_address(uchar hang,uchar lie )
  97. {
  98.     if (hang%2==1) LCD_Wcmd(0x80+(lie%16)-1);
  99.         else LCD_Wcmd(0x80+0x40+(lie%16)-1);

  100. }
  101. void LCD_display()
  102. { uchar j;
  103. LCD_address(1,1);
  104. while(table1[j]!='')
  105. {
  106. LCD_Wdata(table[j]);
  107. j++;
  108.   }

  109. }

  110. void main()
  111. {   uchar n=0;
  112.     Init_Lcd();//初始化LCD
  113.     LCD_display();
  114.     while(1)
  115.     {
  116.       if(pushkey())//判断是否有键按下

  117.         {
  118.         key_scan();
  119.         switch(key_number)

  120.               {
  121.                 case 10: LCD_Wcmd(0x10);break;

  122.                 case 11: LCD_Wcmd(0x14);break;

  123.                 case 12: n++;

  124.                 if((n%2)==1)


  125.                 {
  126.                 LCD_Wcmd(0x80+0x40);break;
  127.                  }
  128.                 else LCD_Wcmd(0x80);break;

  129.                 ase 13: LCD_Wcmd(0x10);

  130.                 LCD_Wdata(0x00);LCD_Wcmd(0x10);break;

  131.                 case 15: LCD_Wcmd(0x01);break;

  132.                 default: LCD_Wdata(key_number+0x30);break;

  133.                 }

  134.         }

  135.         }

  136.     }
复制代码
0.jpg

所有资料51hei提供下载:
4乘4计算器LCD.rar (49.01 KB, 下载次数: 26)
回复

使用道具 举报

ID:304879 发表于 2018-5-6 07:22 | 显示全部楼层
哇靠。很多错误
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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