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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2833|回復: 14
收起左側

新手學習1602 顯示函數 然后這是網上找的程序 是有錯誤的 希望得到討論一下

[復制鏈接]
ID:666991 發表于 2021-5-23 21:41 | 顯示全部樓層 |閱讀模式
  1. #include "1602.h"
  2. #include "delay.h"
  3. #include <intrins.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. #define _NOP() _nop_()
  7. sbit RS = P2^4;   //定義端口
  8. sbit RW = P2^5;
  9. sbit EN = P2^6;

  10. #define DataPort    P0                                
  11. #define DataPIN     P0
  12. #define DataDir                P0

  13. #define CLR_RS (RS=0)
  14. #define SET_RS (RS=1)        
  15. #define CLR_RW (RW=0)        
  16. #define SET_RW (RW=1)
  17. #define CLR_EN (EN=0)
  18. #define SET_EN (EN=1)        


  19.         LcdReset();               //LCD1602初始化
  20.         DelayMs(10);        
  21.         sprintf(temp,"1111111111111111");//更新顯示
  22.         DispStr(0,0,(unsigned char *)temp);//打印顯示
  23.         sprintf(temp,"1111111111111111");//更新顯示
  24.         DispStr(0,1,(unsigned char *)temp);//打印顯示

  25. /***********************************************
  26. 函數名稱:DispStr
  27. 功    能:讓液晶從某個位置起連續顯示一個字符串
  28. 參    數:x--位置的列坐標
  29.           y--位置的行坐標
  30.           ptr--指向字符串存放位置的指針
  31. 返回值  :無
  32. ***********************************************/
  33. void DispStr(uchar x,uchar y,uchar *ptr)
  34. {
  35.     uchar *temp;
  36.     uchar i,n = 0;
  37.    
  38.     temp = ptr;
  39.     while(*ptr++ != '\0')   n++;    //計算字符串有效字符的個數
  40.    
  41.     for (i=0;i<n;i++)
  42.     {
  43.                 if((temp[i]&0x30)==0x30)temp[i]=temp[i]&0x36;//**All notes can be deleted and modified**//                        
  44.         Disp1Char(x++,y,temp[i]);
  45.         if (x == 0x10)
  46.         {
  47.             break;
  48.         }
  49.     }
  50. }

  51. /*******************************************
  52. 函數名稱:DispNchar
  53. 功    能:讓液晶從某個位置起連續顯示N個字符
  54. 參    數:x--位置的列坐標
  55.           y--位置的行坐標
  56.           n--字符個數
  57.           ptr--指向字符存放位置的指針
  58. 返回值  :無
  59. *******************************************/
  60. void DispNChar(uchar x,uchar y, uchar n,uchar *ptr)
  61. {
  62.     uchar i;
  63.    
  64.     for (i=0;i<n;i++)
  65.     {
  66.         Disp1Char(x++,y,ptr[i]);
  67.         if (x == 0x10)
  68.         {
  69.            x = 0;
  70.             y ^= 1;                          //異或操作 換行
  71.         }
  72.     }
  73. }

  74. /*******************************************
  75. 函數名稱:LocateXY
  76. 功    能:向液晶輸入顯示字符位置的坐標信息
  77. 參    數:x--位置的列坐標
  78.           y--位置的行坐標
  79. 返回值  :無
  80. ********************************************/
  81. void LocateXY(uchar x,uchar y)
  82. {
  83.     uchar temp;

  84.     temp = x&0x0f;
  85.     y &= 0x01;
  86.     if(y)   temp |= 0x40;  //如果在第2行
  87.     temp |= 0x80;

  88.     LcdWriteCommand(temp,1);
  89. }

  90. /*******************************************
  91. 函數名稱:Disp1Char
  92. 功    能:在某個位置顯示一個字符
  93. 參    數:x--位置的列坐標
  94.           y--位置的行坐標
  95.           data--顯示的字符數據
  96. 返回值  :無
  97. ********************************************/
  98. void Disp1Char(uchar x,uchar y,uchar data1)
  99. {
  100.     LocateXY( x, y );                        
  101.     LcdWriteData( data1 );               
  102. }

  103. /*******************************************
  104. 函數名稱:LcdReset
  105. 功    能:對1602液晶模塊進行復位操作
  106. 參    數:無
  107. 返回值  :無
  108. ********************************************/
  109. void LcdReset(void)
  110. {
  111.     DataDir  = 0xFF;                 //數據端口設為輸出狀態
  112.     LcdWriteCommand(0x38, 0);            //規定的復位操作
  113.     DelayMs(5);
  114.     LcdWriteCommand(0x38, 0);               
  115.     DelayMs(5);
  116.     LcdWriteCommand(0x38, 0);
  117.     DelayMs(5);

  118.     LcdWriteCommand(0x38, 1);                //顯示模式設置
  119.     LcdWriteCommand(0x08, 1);                //顯示關閉
  120.     LcdWriteCommand(0x01, 1);            //顯示清屏
  121.     LcdWriteCommand(0x06, 1);                //寫字符時整體不移動
  122.     LcdWriteCommand(0x0c, 1);                //顯示開,不開游標,不閃爍
  123. }

  124. /*------------------------------------------------
  125.                 清屏函數
  126. ------------------------------------------------*/
  127. void LcdClear(void)
  128. {
  129.         LcdWriteCommand(0x01,1);
  130.         DelayMs(5);
  131. }

  132. /*******************************************
  133. 函數名稱:LcdWriteCommand
  134. 功    能:向液晶模塊寫入命令
  135. 參    數:cmd--命令,
  136.           chk--是否判忙的標志,1:判忙,0:不判
  137. 返回值  :無
  138. ********************************************/
  139. void LcdWriteCommand(uchar cmd,uchar chk)
  140. {

  141.     if (chk) WaitForEnable();   // 檢測忙信號?
  142.    
  143.     CLR_RS;        
  144.     CLR_RW;
  145.     _NOP();

  146.     DataPort = cmd;             //將命令字寫入數據端口
  147.     _NOP();                                       
  148.    
  149.     SET_EN;                     //產生使能脈沖信號
  150.     _NOP();
  151.     _NOP();
  152.     CLR_EN;                        
  153. }

  154. /*******************************************
  155. 函數名稱:LcdWriteData
  156. 功    能:向液晶顯示的當前地址寫入顯示數據
  157. 參    數:data--顯示字符數據
  158. 返回值  :無
  159. ********************************************/
  160. void LcdWriteData( uchar data1 )
  161. {
  162.     WaitForEnable();        //等待液晶不忙
  163.     SET_RS;
  164.     CLR_RW;

  165.     SET_EN;
  166.         
  167.         _NOP();
  168.     DataPort = data1;        //將顯示數據寫入數據端口
  169.     _NOP();
  170.                 //產生使能脈沖信號
  171.     _NOP();
  172.     _NOP();
  173.     CLR_EN;               
  174. }

  175. /*******************************************
  176. 函數名稱:WaitForEnable
  177. 功    能:等待1602液晶完成內部操作
  178. 參    數:無
  179. 返回值  :無
  180. ********************************************/
  181. void WaitForEnable(void)
  182. {
  183.           unsigned int later=0;
  184.         DataPort=0xff;
  185.     CLR_RS;
  186.     SET_RW;
  187.     _NOP();
  188.     SET_EN;
  189.     _NOP();
  190.     _NOP();
  191.     while((DataPIN&Busy)!=0);   
  192.     while(((DataPIN&0x80)!=0)&&(later<1000))  //檢測忙標志
  193.     {
  194.       DelayUs2x(2);
  195.       later++;        
  196.     }
  197.     CLR_EN;
  198.     DataDir|=0xFF;  //將P4口切換為輸出狀態
  199. }               

復制代碼
compiling 1602.c...
1602.C(25): error C231: 'LcdReset': redefinition
1602.C(26): error C141: syntax error near '10'
1602.C(26): error C231: '_DelayMs': redefinition
1602.C(27): error C141: syntax error near '<string>'
1602.C(28): error C141: syntax error near '0'
1602.C(28): error C132: 'temp': not in formal parameter list
1602.C(28): error C141: syntax error near ')'
1602.C(29): error C141: syntax error near '<string>'
1602.C(29): error C132: '_sprintf': not in formal parameter list
1602.C(30): error C141: syntax error near '0'
1602.C(30): error C132: 'DispStr': not in formal parameter list
1602.C(30): error C141: syntax error near 'temp'
1602.C(30): error C132: 'temp': not in formal parameter list
1602.C(41): error C132: '_DispStr': not in formal parameter list
1602.C(41): error C141: syntax error near '{'
1602.C(42): error C132: 'temp': not in formal parameter list
1602.C(43): error C132: 'i': not in formal parameter list
1602.C(43): error C244: 'n': can't initialize, bad type or class
1602.C(43): error C132: 'n': not in formal parameter list
1602.C(45): error C244: 'temp': can't initialize, bad type or class
1602.C(45): error C202: 'ptr': undefined identifier
1602.C(45): error C132: 'temp': not in formal parameter list
1602.C(46): error C141: syntax error near 'while'
1602.C(46): error C141: syntax error near '++', expected ')'
1602.C(46): error C129: missing ';' before '++'
1602.c - 25 Error(s), 0 Warning(s).

我現在在學習這個18b20測溫 1602顯示 然后這是網上找的程序  
錯誤這么多 怎么搞啊
這是缺了聲明函數還是啥?
回復

使用道具 舉報

ID:824490 發表于 2021-5-24 00:34 | 顯示全部樓層
認真檢查代碼中的符號:
 “;”
 “()”
   “,”
  “{}”
等等。。。
因為網上來的代碼,編碼變了,可能更改了全角/半角.
回復

使用道具 舉報

ID:213173 發表于 2021-5-24 06:19 | 顯示全部樓層
這段代碼只是LCD1602的驅動模塊,不一定有錯誤。其只能由主程序調用,不可以單獨編譯。只算是整個物體上的一個構件。
回復

使用道具 舉報

ID:189235 發表于 2021-5-24 08:21 | 顯示全部樓層
回復

使用道具 舉報

ID:277550 發表于 2021-5-24 08:23 | 顯示全部樓層
在lcd1602.h中,使用 #ifndef   #define 來防止重復加載
回復

使用道具 舉報

ID:57657 發表于 2021-5-24 09:55 | 顯示全部樓層
main函數去哪了?
回復

使用道具 舉報

ID:666991 發表于 2021-5-24 10:52 | 顯示全部樓層
名字不是重點 發表于 2021-5-24 00:34
認真檢查代碼中的符號:
 “;”
 “()”

應該不是這個問題 我復制來都特意編譯過 沒有問題的
回復

使用道具 舉報

ID:666991 發表于 2021-5-24 10:54 | 顯示全部樓層
npn 發表于 2021-5-24 09:55
main函數去哪了?

這個是1602.c main 沒有貼出來  main函數沒有問題
回復

使用道具 舉報

ID:824490 發表于 2021-5-24 11:32 | 顯示全部樓層
compiling 1602.c...
1602.C(25): error C231: 'LcdReset': redefinition          ==>LcdReset重復定義
1602.C(26): error C141: syntax error near '10'            ==>語法錯誤,在字符‘10’附近
1602.C(26): error C231: '_DelayMs': redefinition         ==>_DelayMs重復定義
1602.C(27): error C141: syntax error near '<string>'  ==>語法錯誤,在字符‘<string>’附近
1602.C(28): error C141: syntax error near '0'            ==>語法錯誤
。
。
。
回復

使用道具 舉報

ID:824490 發表于 2021-5-24 11:39 | 顯示全部樓層
低級錯誤:

聲明完了直接進入代碼,連個函數的基本格式都沒有??

#define CLR_RS (RS=0)
#define SET_RS (RS=1)        
#define CLR_RW (RW=0)        
#define SET_RW (RW=1)
#define CLR_EN (EN=0)
#define SET_EN (EN=1)        
//這里應該要有void  函數名()
//這里還要有“{"

        LcdReset();               //LCD1602初始化
        DelayMs(10);        
        sprintf(temp,"1111111111111111");//更新顯示
        DispStr(0,0,(unsigned char *)temp);//打印顯示
        sprintf(temp,"1111111111111111");//更新顯示
        DispStr(0,1,(unsigned char *)temp);//打印顯示
//這里還要有”}"
/***********************************************
函數名稱:DispStr
功    能:讓液晶從某個位置起連續顯示一個字符串
參    數:x--位置的列坐標
          y--位置的行坐標

再認真檢查一下吧。
回復

使用道具 舉報

ID:390416 發表于 2021-5-24 18:21 | 顯示全部樓層
LCD1602顯示℃ 這種自定義符號 http://www.zg4o1577.cn/bbs/dpj-200685-1.html
LCD1602液晶最新資料 說明了具體的時間要求 http://www.zg4o1577.cn/bbs/dpj-205768-1.html
回復

使用道具 舉報

ID:666991 發表于 2021-5-24 18:35 | 顯示全部樓層
名字不是重點 發表于 2021-5-24 11:39
低級錯誤:

聲明完了直接進入代碼,連個函數的基本格式都沒有??

這一段話什么意思啊 ,我在.h 文件中看了聲明函數 所有的聲明函數都在.c中出現了 就是已經一對一了  所以我就不知道這段代表啥了
回復

使用道具 舉報

ID:824490 發表于 2021-5-25 09:13 | 顯示全部樓層
本帖最后由 名字不是重點 于 2021-5-25 09:14 編輯

void Test_display(){
        LcdReset();               //LCD1602初始化
        DelayMs(10);        
        sprintf(temp,"1111111111111111");//更新顯示
        DispStr(0,0,(unsigned char *)temp);//打印顯示
        sprintf(temp,"1111111111111111");//更新顯示
        DispStr(0,1,(unsigned char *)temp);//打印顯示
}
改成這樣,再編譯一下
回復

使用道具 舉報

ID:592807 發表于 2021-5-25 10:15 | 顯示全部樓層
zhangyu111 發表于 2021-5-24 18:35
這一段話什么意思啊 ,我在.h 文件中看了聲明函數 所有的聲明函數都在.c中出現了 就是已經一對一了  所以 ...



        LcdReset();               //LCD1602初始化
        DelayMs(10);        
        sprintf(temp,"1111111111111111");//更新顯示
        DispStr(0,0,(unsigned char *)temp);//打印顯示
        sprintf(temp,"1111111111111111");//更新顯示
        DispStr(0,1,(unsigned char *)temp);//打印顯示
這些是函數聲明嗎?
不是聲明你放文件開頭還不注釋,又不是函數內容。想干嘛?
回復

使用道具 舉報

ID:666991 發表于 2021-5-27 11:52 | 顯示全部樓層
本帖最后由 zhangyu111 于 2021-5-27 11:55 編輯
名字不是重點 發表于 2021-5-25 09:13
void Test_display(){
        LcdReset();               //LCD1602初始化
        DelayMs(10);        ...

C:\Users\Administrator\Desktop
6IM6LWF[%V[35A51D__]~MG.png
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美午夜在线 | 免费人成在线观看网站 | 九七午夜剧场福利写真 | 日韩一级 | 亚洲高清久久 | 成人av高清在线观看 | 国产一区二区三区在线 | 成人在线欧美 | 艹逼网| 粉嫩一区二区三区国产精品 | 亚洲一区二区免费看 | 中文字幕一区在线 | 国产成人免费视频网站高清观看视频 | 亚洲天堂一区二区 | av 一区二区三区 | 日韩精品无码一区二区三区 | 国产真实精品久久二三区 | 国产日韩久久 | 欧美一级在线 | 精品日本久久久久久久久久 | 亚洲av毛片 | 国产精品视频在线播放 | 99热首页| 日本电影网站 | 超碰97人人人人人蜜桃 | 亚洲成人一二三 | 精品亚洲一区二区三区四区五区 | 欧美日韩一区二区在线播放 | 国产高清精品一区 | 欧美在线一区二区三区 | 日本视频免费观看 | 久久综合入口 | 欧美多人在线 | 日韩欧美综合 | a级在线观看 | 免费观看一级特黄欧美大片 | 天天摸天天看 | 久久久久av | 日韩电影一区二区三区 | 一区二区成人在线 | av网站推荐 |