EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 543|回复: 1

[资料共享] 基于单片机+lcd12864的英文记事本程序设计

[复制链接]

6

主题

0

回帖

36

E币

技术员

Rank: 2

积分
12
发表于 2019-1-11 10:18:39 | 显示全部楼层 |阅读模式
系统通电后,要输入6位的密码才能进入系统。进入系统后,可以输入英文文章。即系统按键具有数字、标点符号、大小写字母、空格,回车等字符输入功能。附加功能为进入系统后,密码可以用按键更改;输入的文章,液晶界面显示满之后,能够分页切换,并且具有保存、清楚功能。

单片机源程序如下:

  1. /**
  2. * note.c
  3. *
  4. *  Created At: 2018-12-17
  5. *             Author: yowfung
  6. * Description: 英文记事本程序
  7. */

  8. #include <reg52.h>
  9. #include "../inc/public.h"
  10. #include "../inc/lcd12864.h"
  11. #include "../inc/keys.h"


  12. /**
  13. * 定义常量
  14. */
  15. const unsigned char PASSWORD_CONTENT[7] = "yowfung";        // 登录密码
  16. const unsigned char PASSWORD_LENGTH         = 7;                        // 密码长度

  17. /**
  18. * 声明函数
  19. */
  20. bit ValidatePassword();
  21. void Editor(void);
  22. void insCharToStr(unsigned char *str, unsigned char ch, unsigned int index);
  23. void delCharFromStr(unsigned char *str, unsigned int index);
  24. void WriteContent(unsigned char *content, unsigned char length);
  25. void setLcdPos(unsigned char pos);


  26. /**
  27. * 英文记事本程序运行
  28. *
  29. * 需要连接的线路:
  30. *                 1. LCD12864电路:        RS                -> P0.0
  31. *                                                         RW                -> P0.1
  32. *                                                         E                 -> P0.2
  33. *                                                         D0~D7        -> P1.0~1.7
  34. *                 2. 矩阵按键电路:        Row1~9        -> P2.0~2.7,P0.7
  35. *                                                         Col1~6        -> P3.2~3.7
  36. *                 3. Shift状态灯电路:LED         -> P0.3
  37. *
  38. * 功能及流程描述:
  39. *                 1. 运行后LCD上第一行显示“Hello YowFung”,第二行显示“NoteBook”;
  40. *                 2. 5秒后出现密码输入界面,通过按键输入六位数密码,然后按Enter键,密码
  41. *                    正确则进入编辑状态,否则显示“Password Error!”3秒并回到密码输入
  42. *                    界面;
  43. *                 3. 在编辑状态中,通过按键输入字符,每输入一个字符光标向右移动一位,当
  44. *                    一行显示满了后,则在下一行显示,当一个屏幕都显示满了后,则可以通过
  45. *                    按 Up 或 Down 键来滚动屏幕;
  46. *                 4. 按 ← 或 → 键可以左右移动光标;
  47. *                 5. 按 Clear 键可以清屏;
  48. *                 6. 按 Del 键可以删除当前光标左边的一个字符;
  49. *                 7. 按下 Shift 键时,Shift 状态 LED 灯被点亮,此时输入的字符为第二字
  50. *                    符,再按一次 Shift 键,LED 灭,回到第一字符输入状态。
  51. */
  52. void note_run(void)
  53. {
  54.         bit vali_res = 0;
  55.         
  56.         // 初始化 LCD12864
  57.         Lcd12864_init();
  58.         
  59.         // 显示欢迎界面
  60.         Lcd12864_wrLine(2, "  Hello YowFung");
  61.         Lcd12864_wrLine(3, "    NoteBook");
  62.         delay(3000);
  63.         
  64.         
  65.         // 输入登录密码,直到密码正确
  66.         do {
  67.                 // 清屏
  68.                 Lcd12864_cls();
  69.                 delay(500);
  70.                
  71.                 // 输入密码并验证
  72.                 vali_res = ValidatePassword();
  73.                
  74.                 // 如果密码错误则显示错误信息
  75.                 if (vali_res == 0) {
  76.                         Lcd12864_cls();
  77.                         Lcd12864_showCursor(0);
  78.                         Lcd12864_wrLine(2, "Password Error,");
  79.                         Lcd12864_wrLine(3, "Input Again!");
  80.                         delay(2000);
  81.                 }
  82.         } while (vali_res == 0);
  83.         
  84.         // 密码输入正确,显示欢迎信息
  85.         Lcd12864_cls();
  86.         Lcd12864_showCursor(0);
  87.         Lcd12864_wrLine(2, " Welcome Back!");
  88.         delay(2000);
  89.         
  90.         // 进入编辑界面
  91.         Editor();
  92.         while(1);
  93. }

  94. /**
  95. * 检测登录密码输入并验证
  96. *
  97. */
  98. bit ValidatePassword()
  99. {
  100.         unsigned char input, length = 0, ch, ct, i;
  101.         unsigned char pass_in[7]         = {0x00};                // 全部显示空格
  102.         unsigned char pass_show[7]        = {0x20};                // 密码默认为空
  103.         bit result = 1;

  104.         // 提示输入登录密码的界面
  105.         Lcd12864_wrLine(1, " Login Password");
  106.         Lcd12864_wrLine(2, " ^^^^^^^^^^^^^^ ");
  107.         Lcd12864_wrLine(3, ">              <");
  108.         Lcd12864_wrLine(4, " -------------- ");
  109.         Lcd12864_setPos(3, 2);
  110.         Lcd12864_showCursor(1);
  111.         delay(500);

  112.         // 监测按键输入(同时监测字符按键和控制按键)
  113.         while (1) {
  114.                 input = Keys_get9x6Num();
  115.                 delay(20);

  116.                 if (input == 0)
  117.                         // 如果没有按下任何键
  118.                         continue;
  119.                 else {
  120.                         // 取出按下的控制键码
  121.                         ct = Keys_get9x6Ctrl(input);
  122.                         if (ct != NULL_CHAR) {
  123.                                 switch (ct) {
  124.                                         case CTRL_SHIFT        : {                // 切换 Shift 输入状态
  125.                                                 Keys_setShift(!Keys_getShift());
  126.                                         }; break;
  127.                                         case CTRL_DEL        : {                // 栅格
  128.                                                 if (length) {
  129.                                                         length--;
  130.                                                         pass_show[length] = 0x20;
  131.                                                         pass_in[length] = 0x00;
  132.                                                 }
  133.                                         }; break;
  134.                                         case CTRL_CLS        : {                // 清屏
  135.                                                 length = 0;
  136.                                                 for (i = 0; i < 7; i++) {
  137.                                                         pass_show[i] = 0x20;
  138.                                                         pass_in[i] = 0x00;
  139.                                                 }
  140.                                         }; break;
  141.                                         case CTRL_ENT        : {                // 回车
  142.                                                 for (i = 0; i < 7; i++) {
  143.                                                         if (pass_in[i] != PASSWORD_CONTENT[i]) {
  144.                                                                 result = 0;
  145.                                                                 break;
  146.                                                         }
  147.                                                 }
  148.                                                 return result;
  149.                                         }; break;
  150.                                 }
  151.                         }

  152.                         // 如果已经输满了,则不再监测字符输入
  153.                         if (length != PASSWORD_LENGTH) {
  154.                                 // 取出按下的字符
  155.                                 ch = Keys_get9x6Char(input);
  156.                                 if (ch != NULL_CHAR) {
  157.                                         pass_in[length] = ch;
  158.                                         pass_show[length] = '*';
  159.                                         length++;
  160.                                 }
  161.                         }
  162.                 }

  163.                 // 显示输入情况
  164.                 Lcd12864_wrLine(3, "|              |");
  165.                 Lcd12864_setPos(3, 2);
  166.                 Lcd12864_wrStr(pass_show, 7);
  167.                 Lcd12864_setPos(3, 2 + length/2);
  168.         }
  169. }

  170. /**
  171. * 记事本编辑器
  172. */
  173. void Editor(void)
  174. {
  175.         unsigned char input, ch, ct, i, j;
  176.         unsigned char length = 0;                                // 字符长度
  177.         unsigned char content[64] = {0x20};                // 字符串内容
  178.         unsigned char pos = 0;                                        // 光标位置

  179.         // 清屏,显示光标
  180.         Lcd12864_cls();
  181.         Lcd12864_showCursor(1);
  182.         delay(500);

  183.         while(1) {
  184.                 // 监测按键输入
  185.                 input = Keys_get9x6Num();
  186.                 delay(20);

  187.                 if (input == 0)
  188.                         // 如果没有按键输入则跳过
  189.                         continue;
  190.                 else {
  191.                         // 监测是否为控制键码
  192.                         ct = Keys_get9x6Ctrl(input);
  193.                         if (ct != NULL_CHAR) {
  194.                                 switch (ct) {
  195.                                         case CTRL_CLS        : {                // 清屏
  196.                                                 Lcd12864_cls();
  197.                                                 length = 0;
  198.                                                 pos = 0;
  199.                                                 for (i = 0; i < 64; i++)
  200.                                                         content[i] = 0x20;
  201.                                         }; continue;
  202.                                         case CTRL_DEL        : {                // 栅格
  203.                                                 if (pos != 0) {
  204.                                                         pos--;
  205.                                                         delCharFromStr(content, pos);
  206.                                                         length--;
  207.                                                 }
  208.                                         }; break;
  209.                                         case CTRL_SHIFT        : {                // 切换 Shift 输入状态
  210.                                                 Keys_setShift(!Keys_getShift());
  211.                                         }; continue;
  212.                                         case CTRL_UP        : {                // 向上移动光标
  213.                                                 if (pos >= 16) {
  214.                                                         pos -= 16;
  215.                                                         setLcdPos(pos);
  216.                                                 }
  217.                                                 
  218.                                         }; continue;
  219.                                         case CTRL_DOWN        : {                // 向下移动光标
  220.                                                 if (pos + 16 < length) {
  221.                                                         pos += 16;
  222.                                                         setLcdPos(pos);
  223.                                                 }
  224.                                                 
  225.                                         }; continue;
  226.                                         case CTRL_LEFT        : {                // 向左移动光标
  227.                                                 if (pos != 0) {
  228.                                                         pos--;
  229.                                                         setLcdPos(pos);
  230.                                                 }
  231.                                                 
  232.                                         }; continue;
  233.                                         case CTRL_RIGHT        : {                // 向右移动光标
  234.                                                 if (pos < length - 1) {
  235.                                                         pos++;
  236.                                                         setLcdPos(pos);
  237.                                                 }
  238.                                                 
  239.                                         }; continue;
  240.                                 }
  241.                         }

  242.                         // 监测是否为字符按键
  243.                         ch = Keys_get9x6Char(input);
  244.                         if (ch != NULL_CHAR) {
  245.                                 insCharToStr(content, ch, pos);
  246.                                 pos++;
  247.                                 length++;
  248.                                 if (pos > 63)
  249.                                         pos = 63;
  250.                                 if (length > 64)
  251.                                         length = 64;
  252.                         }

  253.                         // 显示记事本文本内容
  254.                         WriteContent(content, length);
  255.                         
  256.                         // 设置光标位置
  257.                         setLcdPos(pos);
  258.                 }

  259.         }

  260. }

  261. /**
  262. * 插入字符到字符串中
  263. * @param str   字符串
  264. * @param ch    欲插入的字符
  265. * @param index 插入位置
  266. */
  267. void insCharToStr(unsigned char str[], unsigned char ch, unsigned int index)
  268. {
  269.         unsigned int i = 0;
  270.         unsigned char tmp1, tmp2;

  271.         while(i < 64) {
  272.                 if (i == index) {
  273.                         tmp1 = str[i];
  274.                         str[i] = ch;
  275.                 } else if (i > index) {
  276.                         tmp2 = str[i];
  277.                         str[i] = tmp1;
  278.                         tmp1 = tmp2;
  279.                 }

  280.                 i++;
  281.         }
  282. }

  283. /**
  284. * 从字符串中删除指定位置处的字符
  285. * @param str   字符串
  286. * @param index 欲删除字符的位置
  287. */
  288. void delCharFromStr(unsigned char str[], unsigned int index)
  289. {
  290.         unsigned int i = 0;

  291.         while(i < 64) {
  292.                 if (i >= index) {
  293.                         if (i == 63)
  294.                                 str[i] = 0x20;
  295.                         else {
  296.                                 str[i] = str[i+1];
  297. ……………………

  298. …………限于本文篇幅 余下代码请从论坛下载附件…………
复制代码


英文记事本.zip

145.44 KB, 下载次数: 1, 下载积分: E币 -5 元

积分规则
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-20 01:31 , Processed in 0.056992 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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