找回密码
 立即注册
首页 业界区 安全 LCD1602 单片机上代码的实现和代码结构的分析 ...

LCD1602 单片机上代码的实现和代码结构的分析

魄柜 2025-6-11 15:25:35
1、单片机引脚和设备引脚之间的通信
LCD1602使用并口与单片机进行通信,主要包括D0-D7 8个数据线和3根控制线(RS(指令和数据寄存器的区分),R/W(读写控制引脚),E(开始读写引脚,理解为串行总线的时钟线))。设备可以被配置为使用4线或8线数据宽度的数据线通信(实现方式为刚开始的几个配置指令只识别高4位)。下面是51单片机实现的数据通信的代码,代码写的比较low,主要分析代码架构:
database1602.h 基本数据交流的头文件:
  1. #ifndef _DATABASE1602_H
  2. #define _DATABASE1602_H
  3. void delay1ms(void);
  4. void delay(u16 time);
  5. u8 read_status_8(void);
  6. u8 read_data_8(void);
  7. void write_data_8(u8 wdata);
  8. void write_commond_8(u8 commond);
  9. u8 read_status_4(void);
  10. u8 read_data_4(void);
  11. void write_data_4(u8 wdata);
  12. void write_commond_4(u8 commond);
  13. void write_commond_4_4(u8 commond);
  14. #endif
复制代码
对应的.c文件:
  1. #include "config.h"
  2. #include "database1602.h"
  3. /*延时1ms程序*/
  4. void delay1ms(void)                               
  5. {
  6.         u8 i,j;
  7.         i = 2;
  8.         j = 199;
  9.         do
  10.         {
  11.                 while (--j);
  12.         } while (--i);
  13. }
  14. /*根据设定的值延迟*/
  15. void delay(u16 time){
  16.         while(time--);
  17. }
  18. /*读取LCD1602状态寄存器的值*/
  19. u8 read_status_8(void){
  20.         u8 value = 0;
  21.         //datap = 0xff;
  22.         DATA0 = 1;
  23.         DATA1 = 1;
  24.         DATA2 = 1;
  25.         DATA3 = 1;
  26.         DATA4 = 1;
  27.         DATA5 = 1;
  28.         DATA6 = 1;
  29.         DATA7 = 1;
  30.         EN = 0;
  31.         delay(50);
  32.         RS = 0;
  33.         RW = 1;
  34.         delay(50);
  35.         EN = 1;
  36.         delay(10);
  37.         //value = datap;
  38.         if(DATA0 == 1){
  39.                 value = value | 0x01;
  40.         }else{
  41.                 value = value | 0x00;
  42.         }
  43.         if(DATA1 == 1){
  44.                 value = value | 0x02;
  45.         }else{
  46.                 value = value | 0x00;
  47.         }
  48.         if(DATA2 == 1){
  49.                 value = value | 0x04;
  50.         }else{
  51.                 value = value | 0x00;
  52.         }
  53.         if(DATA3 == 1){
  54.                 value = value | 0x08;
  55.         }else{
  56.                 value = value | 0x00;
  57.         }
  58.         if(DATA4 == 1){
  59.                 value = value | 0x10;
  60.         }else{
  61.                 value = value | 0x00;
  62.         }
  63.         if(DATA5 == 1){
  64.                 value = value | 0x20;
  65.         }else{
  66.                 value = value | 0x00;
  67.         }
  68.         if(DATA6 == 1){
  69.                 value = value | 0x40;
  70.         }else{
  71.                 value = value | 0x00;
  72.         }
  73.         if(DATA7 == 1){
  74.                 value = value | 0x80;
  75.         }else{
  76.                 value = value | 0x00;
  77.         }
  78.         delay(10);
  79.         EN = 0;
  80.         RS = 0;
  81.         RW = 0;
  82.         return value;
  83. }
  84. /*读取数据寄存器的值*/
  85. u8 read_data_8(void){
  86.         u8 rdata = 0;
  87.         //datap = 0xff;
  88.         DATA0 = 1;
  89.         DATA1 = 1;
  90.         DATA2 = 1;
  91.         DATA3 = 1;
  92.         DATA4 = 1;
  93.         DATA5 = 1;
  94.         DATA6 = 1;
  95.         DATA7 = 1;
  96.        
  97.         EN = 0;
  98.         delay(50);
  99.         RS = 1;
  100.         RW = 1;
  101.         delay(50);
  102.         EN = 1;
  103.         delay(10);
  104.         //rdata = datap;
  105.        
  106.         if(DATA0 == 1){
  107.                 rdata = rdata | 0x01;
  108.         }else{
  109.                 rdata = rdata | 0x00;
  110.         }
  111.         if(DATA1 == 1){
  112.                 rdata = rdata | 0x02;
  113.         }else{
  114.                 rdata = rdata | 0x00;
  115.         }
  116.         if(DATA2 == 1){
  117.                 rdata = rdata | 0x04;
  118.         }else{
  119.                 rdata = rdata | 0x00;
  120.         }
  121.         if(DATA3 == 1){
  122.                 rdata = rdata | 0x08;
  123.         }else{
  124.                 rdata = rdata | 0x00;
  125.         }
  126.         if(DATA4 == 1){
  127.                 rdata = rdata | 0x10;
  128.         }else{
  129.                 rdata = rdata | 0x00;
  130.         }
  131.         if(DATA5 == 1){
  132.                 rdata = rdata | 0x20;
  133.         }else{
  134.                 rdata = rdata | 0x00;
  135.         }
  136.         if(DATA6 == 1){
  137.                 rdata = rdata | 0x40;
  138.         }else{
  139.                 rdata = rdata | 0x00;
  140.         }
  141.         if(DATA7 == 1){
  142.                 rdata = rdata | 0x80;
  143.         }else{
  144.                 rdata = rdata | 0x00;
  145.         }
  146.         //rdata = P0;
  147.         delay(10);
  148.         EN = 0;
  149.         RS = 0;
  150.         RW = 0;
  151.         return rdata;
  152. }
  153. /*写数据到数据寄存器*/
  154. void write_data_8(u8 wdata){
  155.         u8 value = wdata;
  156.         EN = 0;
  157.         delay(50);
  158.         RS = 1;
  159.         RW = 0;
  160.         delay(50);
  161.         EN = 1;
  162.         delay(50);
  163.         //datap = value;
  164.         if(value & 0x01){
  165.                 DATA0 = 1;
  166.         }else{
  167.                 DATA0 = 0;
  168.         }
  169.         if((value >> 1) & 0x01){
  170.                 DATA1 = 1;
  171.         }else{
  172.                 DATA1 = 0;
  173.         }
  174.         if((value >> 2) & 0x01){
  175.                 DATA2 = 1;
  176.         }else{
  177.                 DATA2 = 0;
  178.         }
  179.         if((value >> 3) & 0x01){
  180.                 DATA3 = 1;
  181.         }else{
  182.                 DATA3 = 0;
  183.         }
  184.         if((value >> 4) & 0x01){
  185.                 DATA4 = 1;
  186.         }else{
  187.                 DATA4 = 0;
  188.         }
  189.         if((value >> 5) & 0x01){
  190.                 DATA5 = 1;
  191.         }else{
  192.                 DATA5 = 0;
  193.         }
  194.         if((value >> 6) & 0x01){
  195.                 DATA6 = 1;
  196.         }else{
  197.                 DATA6 = 0;
  198.         }
  199.         if((value >> 7) & 0x01){
  200.                 DATA7 = 1;
  201.         }else{
  202.                 DATA7 = 0;
  203.         }
  204.         //P0 = value;
  205.         delay(50);
  206.         EN = 0;
  207.         RS = 0;
  208.         RW = 0;
  209. }
  210. /*写命令到命令寄存器*/
  211. void write_commond_8(u8 commond){
  212.         u8 value = commond;
  213.         EN = 0;
  214.         delay(50);
  215.         RS = 0;
  216.         RW = 0;
  217.         delay(50);
  218.         EN = 1;
  219.         delay(50);
  220.         //datap = value;
  221.         if(value & 0x01){
  222.                 DATA0 = 1;
  223.         }else{
  224.                 DATA0 = 0;
  225.         }
  226.         if((value >> 1) & 0x01){
  227.                 DATA1 = 1;
  228.         }else{
  229.                 DATA1 = 0;
  230.         }
  231.         if((value >> 2) & 0x01){
  232.                 DATA2 = 1;
  233.         }else{
  234.                 DATA2 = 0;
  235.         }
  236.         if((value >> 3) & 0x01){
  237.                 DATA3 = 1;
  238.         }else{
  239.                 DATA3 = 0;
  240.         }
  241.         if((value >> 4) & 0x01){
  242.                 DATA4 = 1;
  243.         }else{
  244.                 DATA4 = 0;
  245.         }
  246.         if((value >> 5) & 0x01){
  247.                 DATA5 = 1;
  248.         }else{
  249.                 DATA5 = 0;
  250.         }
  251.         if((value >> 6) & 0x01){
  252.                 DATA6 = 1;
  253.         }else{
  254.                 DATA6 = 0;
  255.         }
  256.         if((value >> 7) & 0x01){
  257.                 DATA7 = 1;
  258.         }else{
  259.                 DATA7 = 0;
  260.         }
  261.         //P0 = value;
  262.         delay(50);
  263.         EN = 0;
  264.         RS = 0;
  265.         RW = 0;
  266. }
  267. /*读取LCD1602状态寄存器的值*/
  268. u8 read_status_4(void){
  269.         u8 value = 0;
  270.         //datap = 0xff;
  271.         DATA4 = 1;
  272.         DATA5 = 1;
  273.         DATA6 = 1;
  274.         DATA7 = 1;
  275.         EN = 0;
  276.         delay(50);
  277.         RS = 0;
  278.         RW = 1;
  279.         delay(50);
  280.         EN = 1;
  281.         delay(10);
  282.         //value = datap;
  283.         if(DATA4 == 1){
  284.                 value = value | 0x10;
  285.         }else{
  286.                 value = value | 0x00;
  287.         }
  288.         if(DATA5 == 1){
  289.                 value = value | 0x20;
  290.         }else{
  291.                 value = value | 0x00;
  292.         }
  293.         if(DATA6 == 1){
  294.                 value = value | 0x40;
  295.         }else{
  296.                 value = value | 0x00;
  297.         }
  298.         if(DATA7 == 1){
  299.                 value = value | 0x80;
  300.         }else{
  301.                 value = value | 0x00;
  302.         }
  303.         delay(10);
  304.         EN = 0;
  305.         delay(10);
  306.         EN = 1;
  307.         delay(10);
  308.         if(DATA4 == 1){
  309.                 value = value | 0x01;
  310.         }else{
  311.                 value = value | 0x00;
  312.         }
  313.         if(DATA5 == 1){
  314.                 value = value | 0x02;
  315.         }else{
  316.                 value = value | 0x00;
  317.         }
  318.         if(DATA6 == 1){
  319.                 value = value | 0x04;
  320.         }else{
  321.                 value = value | 0x00;
  322.         }
  323.         if(DATA7 == 1){
  324.                 value = value | 0x08;
  325.         }else{
  326.                 value = value | 0x00;
  327.         }
  328.         delay(10);
  329.         EN = 0;
  330.         RS = 0;
  331.         RW = 0;
  332.         return value;
  333. }
  334. /*读取数据寄存器的值*/
  335. u8 read_data_4(void){
  336.         u8 rdata = 0;
  337.         //datap = 0xff;
  338.         DATA4 = 1;
  339.         DATA5 = 1;
  340.         DATA6 = 1;
  341.         DATA7 = 1;
  342.        
  343.         EN = 0;
  344.         delay(50);
  345.         RS = 1;
  346.         RW = 1;
  347.         delay(50);
  348.         EN = 1;
  349.         delay(10);
  350.         if(DATA4 == 1){
  351.                 rdata = rdata | 0x10;
  352.         }else{
  353.                 rdata = rdata | 0x00;
  354.         }
  355.         if(DATA5 == 1){
  356.                 rdata = rdata | 0x20;
  357.         }else{
  358.                 rdata = rdata | 0x00;
  359.         }
  360.         if(DATA6 == 1){
  361.                 rdata = rdata | 0x40;
  362.         }else{
  363.                 rdata = rdata | 0x00;
  364.         }
  365.         if(DATA7 == 1){
  366.                 rdata = rdata | 0x80;
  367.         }else{
  368.                 rdata = rdata | 0x00;
  369.         }
  370.         delay(10);
  371.         EN = 0;
  372.         delay(10);
  373.         EN = 1;
  374.         delay(10);
  375.         if(DATA4 == 1){
  376.                 rdata = rdata | 0x01;
  377.         }else{
  378.                 rdata = rdata | 0x00;
  379.         }
  380.         if(DATA5 == 1){
  381.                 rdata = rdata | 0x02;
  382.         }else{
  383.                 rdata = rdata | 0x00;
  384.         }
  385.         if(DATA6 == 1){
  386.                 rdata = rdata | 0x04;
  387.         }else{
  388.                 rdata = rdata | 0x00;
  389.         }
  390.         if(DATA7 == 1){
  391.                 rdata = rdata | 0x08;
  392.         }else{
  393.                 rdata = rdata | 0x00;
  394.         }
  395.         delay(10);
  396.         EN = 0;
  397.         RS = 0;
  398.         RW = 0;
  399.         return rdata;
  400. }
  401. /*写数据到数据寄存器*/
  402. void write_data_4(u8 wdata){
  403.         u8 value = wdata;
  404.         EN = 0;
  405.         delay(50);
  406.         RS = 1;
  407.         RW = 0;
  408.         delay(50);
  409.         EN = 1;
  410.         delay(50);
  411.         if((value >> 4) & 0x01){
  412.                 DATA4 = 1;
  413.         }else{
  414.                 DATA4 = 0;
  415.         }
  416.         if((value >> 5) & 0x01){
  417.                 DATA5 = 1;
  418.         }else{
  419.                 DATA5 = 0;
  420.         }
  421.         if((value >> 6) & 0x01){
  422.                 DATA6 = 1;
  423.         }else{
  424.                 DATA6 = 0;
  425.         }
  426.         if((value >> 7) & 0x01){
  427.                 DATA7 = 1;
  428.         }else{
  429.                 DATA7 = 0;
  430.         }
  431.         delay(50);
  432.         EN = 0;
  433.         delay(50);
  434.         EN = 1;
  435.         delay(50);
  436.         if(value & 0x01){
  437.                 DATA4 = 1;
  438.         }else{
  439.                 DATA4 = 0;
  440.         }
  441.         if((value >> 1) & 0x01){
  442.                 DATA5 = 1;
  443.         }else{
  444.                 DATA5 = 0;
  445.         }
  446.         if((value >> 2) & 0x01){
  447.                 DATA6 = 1;
  448.         }else{
  449.                 DATA6 = 0;
  450.         }
  451.         if((value >> 3) & 0x01){
  452.                 DATA7 = 1;
  453.         }else{
  454.                 DATA7 = 0;
  455.         }
  456.         delay(50);
  457.         EN = 0;
  458.         RS = 0;
  459.         RW = 0;
  460. }
  461. /*写命令到命令寄存器*/
  462. void write_commond_4(u8 commond){
  463.         u8 value = commond;
  464.         EN = 0;
  465.         delay(50);
  466.         RS = 0;
  467.         RW = 0;
  468.         delay(50);
  469.         EN = 1;
  470.         delay(50);
  471.         if((value >> 4) & 0x01){
  472.                 DATA4 = 1;
  473.         }else{
  474.                 DATA4 = 0;
  475.         }
  476.         if((value >> 5) & 0x01){
  477.                 DATA5 = 1;
  478.         }else{
  479.                 DATA5 = 0;
  480.         }
  481.         if((value >> 6) & 0x01){
  482.                 DATA6 = 1;
  483.         }else{
  484.                 DATA6 = 0;
  485.         }
  486.         if((value >> 7) & 0x01){
  487.                 DATA7 = 1;
  488.         }else{
  489.                 DATA7 = 0;
  490.         }
  491.         delay(50);
  492.         EN = 0;
  493.         delay(50);
  494.         EN = 1;
  495.         delay(50);
  496.         if(value & 0x01){
  497.                 DATA4 = 1;
  498.         }else{
  499.                 DATA4= 0;
  500.         }
  501.         if((value >> 1) & 0x01){
  502.                 DATA5 = 1;
  503.         }else{
  504.                 DATA5 = 0;
  505.         }
  506.         if((value >> 2) & 0x01){
  507.                 DATA6 = 1;
  508.         }else{
  509.                 DATA6 = 0;
  510.         }
  511.         if((value >> 3) & 0x01){
  512.                 DATA7 = 1;
  513.         }else{
  514.                 DATA7 = 0;
  515.         }
  516.         delay(50);
  517.         EN = 0;
  518.         RS = 0;
  519.         RW = 0;
  520. }
  521. void write_commond_4_4(u8 commond){
  522.         u8 value = commond;
  523.         EN = 0;
  524.         delay(50);
  525.         RS = 0;
  526.         RW = 0;
  527.         delay(50);
  528.         EN = 1;
  529.         delay(50);
  530.         if((value >> 4) & 0x01){
  531.                 DATA4 = 1;
  532.         }else{
  533.                 DATA4 = 0;
  534.         }
  535.         if((value >> 5) & 0x01){
  536.                 DATA5 = 1;
  537.         }else{
  538.                 DATA5 = 0;
  539.         }
  540.         if((value >> 6) & 0x01){
  541.                 DATA6 = 1;
  542.         }else{
  543.                 DATA6 = 0;
  544.         }
  545.         if((value >> 7) & 0x01){
  546.                 DATA7 = 1;
  547.         }else{
  548.                 DATA7 = 0;
  549.         }
  550.         delay(50);
  551.         EN = 0;
  552.         RS = 0;
  553.         RW = 0;
  554. }
复制代码
2、通过基础数据通信对设备的操作代码,相当于通过基础的交流进行更上一层的交互,这里主要包括怎么样初始化设备,怎么样配置设备,和对设备的操作(设备实现的功能)。
下面是设备操作的代码:
driver1602.h是关于设备内部寄存器和控制位的声明(这里写的不是很好,后续再进一步改进):
[code]#ifndef _DRIVER1602_H#define _DRIVER1602_H#include "config.h"#define CLEAR_DISPLAY 0x01        #define RETURN_HOME 0x02 #define STATUS_BF_BUSY 0x80#define STATUS_BF_READY 0x00/*** 接口数据宽度定义,4位和8位宽两种*/#define interface_data_width_4 (0 cursor_blink;                write_commond_status(tmp);        }else if(onoff == display_on){                lcd->display_on_off = display_on;                tmp = 0x0c | lcd->cursor_on_off | lcd->cursor_blink;                write_commond_status(tmp);        }else{                return -1;        }        return 0;}/***设置显示的光标是否打开*/s8 lcd1602_set_cursor_on_off(LCD1602_initTypeDef *lcd,u8 onoff){        u8 tmp = 0;        if(onoff == cursor_off){                lcd->cursor_on_off = cursor_off;                tmp = 0x08 | lcd->display_on_off | lcd->cursor_blink;                write_commond_status(tmp);        }else if(onoff == cursor_on){                lcd->cursor_on_off = cursor_on;                tmp = 0x0a | lcd->display_on_off | lcd->cursor_blink;                write_commond_status(tmp);        }else{                return -1;        }        return 0;}/***设置显示的光标是否闪烁*/s8 lcd1602_set_cursor_blink(LCD1602_initTypeDef *lcd,u8 onoff){        u8 tmp = 0;        if(onoff == cursor_character_blink_off){                lcd->cursor_blink = cursor_character_blink_off;                tmp = 0x08 | lcd->display_on_off | lcd->cursor_on_off;                write_commond_status(tmp);        }else if(onoff == cursor_character_blink_on){                lcd->cursor_blink = cursor_character_blink_on;                tmp = 0x09 | lcd->display_on_off | lcd->cursor_on_off;                write_commond_status(tmp);        }else{                return -1;        }        return 0;}/***设置改变DDRAM内容时光标和显示的移动*/s8 lcd1602_set_change_ddram_cursor_display(LCD1602_initTypeDef *lcd,u8 cursor_display,u8 direction){        u8 tmp = 0;        if(cursor_display == ddram_move_cursor){                lcd->ddram_cursor_display_move = ddram_move_cursor;        }else if(cursor_display == ddram_move_display){                lcd->ddram_cursor_display_move = ddram_move_display;        }else{                return -1;        }                if(direction == ddram_move_direction_left){                lcd->ddram_sc_move_driection = ddram_move_direction_left;        }else if(direction == ddram_move_direction_right){                lcd->ddram_sc_move_driection = ddram_move_direction_right;        }else{                return -1;        }        tmp = 0x10 | lcd->ddram_sc_move_driection | lcd->ddram_cursor_display_move;        write_commond_status(tmp);        return 0;}/***设置字体格式*/s8 lcd1602_set_font(LCD1602_initTypeDef *lcd,u8 font){        u8 tmp = 0;        if(font == font_mode_5_8){                lcd->display_font = font_mode_5_8;                tmp = 0x30 | lcd->display_lines;                write_commond_status(tmp);        }else if(font == font_mode_5_10){                lcd->display_font = font_mode_5_10;                tmp = 0x34 | lcd->display_lines;                write_commond_status(tmp);        }else{                return -1;        }        return 0;}/*读取默认位置的数据,当前数据指针所指数据*/u8 read_data_current(void){        u8 cur = 0;        u8 value;        if(width == interface_data_width_8){                cur = read_status_8();        }else{                cur = read_status_4();        }        cur = cur & 0x7f;        cur = cur | 0x80;        value = read_data_local(cur);        return value;}/*读取指定位置的字符*/u8 read_data_local(u8 addr){        u8 value;        write_commond_status(addr|0x80);        if(width == interface_data_width_8){                value = read_data_8();        }else{                value = read_data_4();        }        return value;}/*从指定位置,读取指定长度的字符串*/void read_string(u8 addr,u8 len,u8 *val){        u8 i = 0;        write_commond_status(addr|0x80);        for(i=0;i 7){                return -1;        }        write_commond_status(CGRAM_ADDRESS_SET_BASE| (local  3){                return -1;        }        write_commond_status(CGRAM_ADDRESS_SET_BASE| (local  DDRAM_PER_LINE_SIZE){                len = DDRAM_PER_LINE_SIZE - local;        }        write_commond_status(DDRAM_ADDRESS_SECOND_LINE + local);        while(len > 0){                write_data_status(*str);                str++;                len--;        }        return 0;}/*根据行号判断写入第一行还是第二行,写入字符串*/s8 write_string(u8 local,u8 line,u8 *str){        if(line == 1){                write_first_line_string(local,str);        }else if(line == 2){                write_second_line_string(local,str);        }else{                return -1;        }        return 0;}/*清除特定位置的字符并保持原来地址计数器的位置不变*/s8 clear_char(u8 local,u8 line){        u8 curlocation = read_counter();        if(local > DDRAM_PER_LINE_SIZE){                return -1;        }        if(line == 1){                write_commond_status(DDRAM_ADDRESS_FIRST_LINE + local);        }else if(line == 2){                write_commond_status(DDRAM_ADDRESS_SECOND_LINE + local);        }else{                return -2;        }        write_data_status(0x20);        write_commond_status(curlocation|0x80);        return 0;}/*清除一行,一行的40个字符全部清除*/s8 clear_line(u8 line){        u8 i = 0;        if(line == 1){                write_commond_status(DDRAM_ADDRESS_FIRST_LINE);        }else if(line == 2){                write_commond_status(DDRAM_ADDRESS_SECOND_LINE);        }else{                return -1;        }        for(i = 0;i DDRAM_PER_LINE_SIZE){                return -1;        }        if((s + length) > DDRAM_PER_LINE_SIZE){                length = DDRAM_PER_LINE_SIZE - s;        }        if(line == 1){                write_commond_status(DDRAM_ADDRESS_FIRST_LINE + s);        }else if(line == 2){                write_commond_status(DDRAM_ADDRESS_SECOND_LINE + s);        }else{                return -2;        }        for(i = 0;i DDRAM_PER_LINE_SIZE){                return -1;        }        if(line == 1){                write_commond_status(DDRAM_ADDRESS_FIRST_LINE + s);        }else if(line == 2){                write_commond_status(DDRAM_ADDRESS_SECOND_LINE + s);        }else{                return -2;        }        write_data_status(value);        write_commond_status(curlocation|0x80);        return 0;}/*替换特定位置的几个字符*/s8 replace_string(u8 local,u8 line,u8 *str){        u8 s = local;        u8 i = 0;        u8 curlocation = read_counter();        u8 len = strlen(str);        if(local > DDRAM_PER_LINE_SIZE){                return -1;        }        if(line == 1){                write_commond_status(DDRAM_ADDRESS_FIRST_LINE + s);        }else if(line == 2){                write_commond_status(DDRAM_ADDRESS_SECOND_LINE + s);        }else{                return -2;        }        if((s + len) > DDRAM_PER_LINE_SIZE){                len = DDRAM_PER_LINE_SIZE - s;        }        while(len > 0){                write_data_status(*str);                str++;                len--;        }        write_commond_status(curlocation|0x80);        return 0;}/*从开始位置显示一整段字符到可显示的位置*/void displaystring(u8 *str){        u8 length = strlen(str);        if(length
您需要登录后才可以回帖 登录 | 立即注册