久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2772|回復: 1
打印 上一主題 下一主題
收起左側

基于單片機+lcd12864的英文記事本程序設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:461794 發表于 2019-1-10 20:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
    系統通電后,要輸入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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
英文記事本.zip (145.44 KB, 下載次數: 28)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:226160 發表于 2019-1-29 15:16 | 只看該作者
把別人的代碼原封不動的發上來,也不征求原作者的同意?也不注明原創?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久不卡区 | 人碰人操 | 亚洲欧美日韩成人在线 | 狠狠干五月天 | 玖玖操| 国产一区二区久久 | 97精品久久| 成人一级视频在线观看 | 亚洲国产精品一区二区第一页 | 中文字幕成人 | 欧美啪啪| 亚洲视频一区在线 | 日韩在线视频免费观看 | 午夜色播 | 国产精品黄视频 | 亚洲精品乱码久久久久久按摩观 | 成人在线免费电影 | 欧美一区免费 | 午夜影院在线观看视频 | 羞羞的视频免费在线观看 | 最新国产在线 | 视频在线观看一区二区 | 365夜爽爽欧美性午夜免费视频 | 亚洲天堂成人在线视频 | 日韩欧美亚洲 | 日本精品一区二区三区在线观看视频 | 日本羞羞影院 | jdav视频在线观看免费 | 日本五月婷婷 | 福利精品 | 精品欧美一区二区在线观看视频 | 青青草av网站 | 国产一区二区久久 | 欧美舔穴 | 精品久久久久久久久久久久久久 | 成人免费视频 | 巨大荫蒂视频欧美另类大 | 日本成人在线网址 | 日韩电影免费在线观看中文字幕 | 久久精品亚洲精品 | 一区二区在线 |