找回密码
 立即注册

QQ登录

只需一步,快速开始

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

1602按键输入显示单片机源程序

[复制链接]
ID:263238 发表于 2017-12-20 11:57 | 显示全部楼层 |阅读模式
1602按键输入显示
单片机源程序如下:
  1. /*-----------------------------------------------
  2.   名称:LCD1602
  3.   内容:通过矩阵键盘输入,依次显示0-F16中字符
  4.   引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
  5. ------------------------------------------------*/
  6. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  7. #include<intrins.h>

  8. sbit RS = P2^4;   //定义端口
  9. sbit RW = P2^5;
  10. sbit EN = P2^6;

  11. #define RS_CLR RS=0
  12. #define RS_SET RS=1

  13. #define RW_CLR RW=0
  14. #define RW_SET RW=1

  15. #define EN_CLR EN=0
  16. #define EN_SET EN=1

  17. #define DataPort P0
  18. #define KeyPort P1

  19. unsigned char code dofly_code[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//转换成液晶显示的字符
  20. /*------------------------------------------------
  21. uS延时函数,含有输入参数 unsigned char t,无返回值
  22. unsigned char 是定义无符号字符变量,其值的范围是
  23. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  24. 长度如下 T=tx2+5 uS
  25. ------------------------------------------------*/
  26. void DelayUs2x(unsigned char t)
  27. {   
  28. while(--t);
  29. }
  30. /*------------------------------------------------
  31. mS延时函数,含有输入参数 unsigned char t,无返回值
  32. unsigned char 是定义无符号字符变量,其值的范围是
  33. 0~255 这里使用晶振12M,精确延时请使用汇编
  34. ------------------------------------------------*/
  35. void DelayMs(unsigned char t)
  36. {
  37.      
  38. while(t--)
  39. {
  40.      //大致延时1mS
  41.      DelayUs2x(245);
  42.          DelayUs2x(245);
  43. }
  44. }
  45. /*------------------------------------------------
  46.               判忙函数
  47. ------------------------------------------------*/
  48. bit LCD_Check_Busy(void)
  49. {
  50. DataPort= 0xFF;
  51. RS_CLR;
  52. RW_SET;
  53. EN_CLR;
  54. _nop_();
  55. EN_SET;
  56. return (bit)(DataPort & 0x80);
  57. }
  58. /*------------------------------------------------
  59.               写入命令函数
  60. ------------------------------------------------*/
  61. void LCD_Write_Com(unsigned char com)
  62. {  
  63. while(LCD_Check_Busy()); //忙则等待
  64. RS_CLR;
  65. RW_CLR;
  66. EN_SET;
  67. DataPort= com;
  68. _nop_();
  69. EN_CLR;
  70. }
  71. /*------------------------------------------------
  72.               写入数据函数
  73. ------------------------------------------------*/
  74. void LCD_Write_Data(unsigned char Data)
  75. {
  76. while(LCD_Check_Busy()); //忙则等待
  77. RS_SET;
  78. RW_CLR;
  79. EN_SET;
  80. DataPort= Data;
  81. _nop_();
  82. EN_CLR;
  83. }

  84. /*------------------------------------------------
  85.                 清屏函数
  86. ------------------------------------------------*/
  87. void LCD_Clear(void)
  88. {
  89. LCD_Write_Com(0x01);
  90. DelayMs(5);
  91. }
  92. /*------------------------------------------------
  93.               写入字符串函数
  94. ------------------------------------------------*/
  95. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  96. {     
  97. if (y == 0)
  98.         {     
  99.          LCD_Write_Com(0x80 + x);     
  100.         }
  101. else
  102.         {     
  103.         LCD_Write_Com(0xC0 + x);     
  104.         }        
  105. while (*s)
  106.         {     
  107. LCD_Write_Data( *s);     
  108. s ++;     
  109.         }
  110. }
  111. /*------------------------------------------------
  112.               写入字符函数
  113. ------------------------------------------------*/
  114. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  115. {     
  116. if (y == 0)
  117.         {     
  118.         LCD_Write_Com(0x80 + x);     
  119.         }   
  120. else
  121.         {     
  122.         LCD_Write_Com(0xC0 + x);     
  123.         }        
  124. LCD_Write_Data( Data);  
  125. }
  126. /*------------------------------------------------
  127.               初始化函数
  128. ------------------------------------------------*/
  129. void LCD_Init(void)
  130. {
  131.    LCD_Write_Com(0x38);    /*显示模式设置*/
  132.    DelayMs(5);
  133.    LCD_Write_Com(0x38);
  134.    DelayMs(5);
  135.    LCD_Write_Com(0x38);
  136.    DelayMs(5);
  137.    LCD_Write_Com(0x38);  
  138.    LCD_Write_Com(0x08);    /*显示关闭*/
  139.    LCD_Write_Com(0x01);    /*显示清屏*/
  140.    LCD_Write_Com(0x06);    /*显示光标移动设置*/
  141.    DelayMs(5);
  142.    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  143.    }

  144.    /*------------------------------------------------
  145. 按键扫描函数,返回扫描键值
  146. ------------------------------------------------*/
  147. unsigned char KeyScan(void)  //键盘扫描函数,使用行列反转扫描法
  148. {
  149. unsigned char cord_h,cord_l;//行列值中间变量
  150. KeyPort=0x0f;            //行线输出全为0
  151. cord_h=KeyPort&0x0f;     //读入列线值
  152. if(cord_h!=0x0f)    //先检测有无按键按下
  153. {
  154.   DelayMs(10);        //去抖
  155.   if((KeyPort&0x0f)!=0x0f)
  156.   {
  157.     cord_h=KeyPort&0x0f;  //读入列线值
  158.     KeyPort=cord_h|0xf0;  //输出当前列线值
  159.     cord_l=KeyPort&0xf0;  //读入行线值

  160.     while((KeyPort&0xf0)!=0xf0);//等待松开并输出

  161.     return(cord_h+cord_l);//键盘最后组合码值
  162.    }
  163.   }return(0xff);     //返回该值
  164. }
  165. /*------------------------------------------------
  166. 按键值处理函数,返回扫键值
  167. ------------------------------------------------*/
  168. unsigned char KeyPro(void)
  169. {
  170. switch(KeyScan())
  171. {
  172.   case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值
  173.   case 0x7d:return 1;break;//1
  174.   case 0x7b:return 2;break;//2
  175.   case 0x77:return 3;break;//3
  176.   case 0xbe:return 4;break;//4
  177.   case 0xbd:return 5;break;//5
  178.   case 0xbb:return 6;break;//6
  179.   case 0xb7:return 7;break;//7
  180.   case 0xde:return 8;break;//8
  181.   case 0xdd:return 9;break;//9
  182.   case 0xdb:return 10;break;//a
  183.   case 0xd7:return 11;break;//b
  184.   case 0xee:return 12;break;//c
  185.   case 0xed:return 13;break;//d
  186.   case 0xeb:return 14;break;//e
  187.   case 0xe7:return 15;break;//f
  188.   default:return 0xff;break;
  189. }
  190. }

  191. /*------------------------------------------------
  192.                     主函数
  193. ------------------------------------------------*/
  194. void main(void)
  195. {
  196. unsigned char i,j,num;

  197. ……………………

  198. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
1602按键输入显示.zip (19.52 KB, 下载次数: 32)
回复

使用道具 举报

ID:779113 发表于 2020-6-15 09:33 | 显示全部楼层
真的厉害
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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