求助,為什么顯示屏上什么都不顯示呀,代碼如下
0.png (79.59 KB, 下載次數: 23)
下載附件
2023-3-3 13:05 上傳
單片機源程序如下:
- #include <REGX52.H>
- //引腳配置:
- sbit LCD_RS=P2^6;
- sbit LCD_RW=P2^5;
- sbit LCD_EN=P2^7;
- #define LCD_DataPort P0
- //函數定義:
- /**
- * @brief LCD1602延時函數,12MHz調用可延時1ms
- * @param 無
- * @retval 無
- */
- void LCD_Delay()
- {
- unsigned char i, j;
- i = 2;
- j = 239;
- do
- {
- while (--j);
- } while (--i);
- }
- /**
- * @brief LCD1602寫命令
- * @param Command 要寫入的命令
- * @retval 無
- */
- void LCD_WriteCommand(unsigned char Command)
- {
- LCD_RS=0;
- LCD_RW=0;
- LCD_DataPort=Command;
- LCD_EN=1;
- LCD_Delay();
- LCD_EN=0;
- LCD_Delay();
- }
- /**
- * @brief LCD1602寫數據
- * @param Data 要寫入的數據
- * @retval 無
- */
- void LCD_WriteData(unsigned char Data)
- {
- LCD_RS=1;
- LCD_RW=0;
- LCD_DataPort=Data;
- LCD_EN=1;
- LCD_Delay();
- LCD_EN=0;
- LCD_Delay();
- }
- /**
- * @brief LCD1602設置光標位置
- * @param Line 行位置,范圍:1~2
- * @param Column 列位置,范圍:1~16
- * @retval 無
- */
- void LCD_SetCursor(unsigned char Line,unsigned char Column)
- {
- if(Line==1)
- {
- LCD_WriteCommand(0x80|(Column-1));
- }
- else if(Line==2)
- {
- LCD_WriteCommand(0x80|(Column-1+0x40));
- }
- }
- /**
- * @brief LCD1602初始化函數
- * @param 無
- * @retval 無
- */
- void LCD_Init()
- {
- LCD_WriteCommand(0x38);//八位數據接口,兩行顯示,5*7點陣
- LCD_WriteCommand(0x0c);//顯示開,光標關,閃爍關
- LCD_WriteCommand(0x06);//數據讀寫操作后,光標自動加一,畫面不動
- LCD_WriteCommand(0x01);//光標復位,清屏
- }
- /**
- * @brief 在LCD1602指定位置上顯示一個字符
- * @param Line 行位置,范圍:1~2
- * @param Column 列位置,范圍:1~16
- * @param Char 要顯示的字符
- * @retval 無
- */
- void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
- {
- LCD_SetCursor(Line,Column);
- LCD_WriteData(Char);
- }
- /**
- * @brief 在LCD1602指定位置開始顯示所給字符串
- * @param Line 起始行位置,范圍:1~2
- * @param Column 起始列位置,范圍:1~16
- * @param String 要顯示的字符串
- * @retval 無
- */
- void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
- {
- unsigned char i;
- LCD_SetCursor(Line,Column);
- for(i=0;String[i]!='\0';i++)
- {
- LCD_WriteData(String[i]);
- }
- }
- /**
- * @brief 返回值=X的Y次方
- */
- int LCD_Pow(int X,int Y)
- {
- unsigned char i;
- int Result=1;
- for(i=0;i<Y;i++)
- {
- Result*=X;
- }
- return Result;
- }
- /**
- * @brief 在LCD1602指定位置開始顯示所給數字
- * @param Line 起始行位置,范圍:1~2
- * @param Column 起始列位置,范圍:1~16
- * @param Number 要顯示的數字,范圍:0~65535
- * @param Length 要顯示數字的長度,范圍:1~5
- * @retval 無
- */
- void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
- {
- unsigned char i;
- LCD_SetCursor(Line,Column);
- for(i=Length;i>0;i--)
- {
- LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
- }
- }
- /**
- * @brief 在LCD1602指定位置開始以有符號十進制顯示所給數字
- * @param Line 起始行位置,范圍:1~2
- * @param Column 起始列位置,范圍:1~16
- * @param Number 要顯示的數字,范圍:-32768~32767
- * @param Length 要顯示數字的長度,范圍:1~5
- * @retval 無
- */
- void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
- {
- unsigned char i;
- unsigned int Number1;
- LCD_SetCursor(Line,Column);
- if(Number>=0)
- {
- LCD_WriteData('+');
- Number1=Number;
- }
- else
- {
- LCD_WriteData('-');
- Number1=-Number;
- }
- for(i=Length;i>0;i--)
- {
- LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
- }
- }
- /**
- * @brief 在LCD1602指定位置開始以十六進制顯示所給數字
- * @param Line 起始行位置,范圍:1~2
- * @param Column 起始列位置,范圍:1~16
- * @param Number 要顯示的數字,范圍:0~0xFFFF
- * @param Length 要顯示數字的長度,范圍:1~4
- * @retval 無
- */
- void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
- {
- unsigned char i,SingleNumber;
- LCD_SetCursor(Line,Column);
- for(i=Length;i>0;i--)
- {
- SingleNumber=Number/LCD_Pow(16,i-1)%16;
- if(SingleNumber<10)
- {
- LCD_WriteData(SingleNumber+'0');
- }
- else
- {
- LCD_WriteData(SingleNumber-10+'A');
- }
- }
- }
- /**
- * @brief 在LCD1602指定位置開始以二進制顯示所給數字
- * @param Line 起始行位置,范圍:1~2
- * @param Column 起始列位置,范圍:1~16
- * @param Number 要顯示的數字,范圍:0~1111 1111 1111 1111
- * @param Length 要顯示數字的長度,范圍:1~16
- * @retval 無
- */
- void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
- {
- unsigned char i;
- LCD_SetCursor(Line,Column);
- for(i=Length;i>0;i--)
- {
- LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
- }
- }
- #include <REGX52.H>
- #include "LCD1602.H"
- void main()
- {
- LCD_Init();
- LCD_ShowChar(1,1,'A');
- LCD_ShowString(1,3,"Hello");
- while(1)
- {
-
- }
-
- }
復制代碼
|