|
自己空閑的時間寫了一下LCD1602的亂并口然后把各個IO口進(jìn)行數(shù)據(jù)理合來輸出控制LCD1602 有改善的請?zhí)岢鰜?br />
實(shí)驗(yàn)平臺用的是野火指南者的STM32F103VET6的開發(fā)板
制作出來的實(shí)物圖如下:
單片機(jī)源程序如下:
- /*****************************************************************
- * @attention 注意: 本程序是LCD1602的亂口的數(shù)據(jù)傳輸?shù)尿?qū)動適用于任意口的IO口
- * IO口一定要先初始化 不然無法使用
- *
- **********************************************************************/
- #include "lcd1602_luan.h"
- // sbit RS=P3^5;
- // sbit RW=P3^6;
- // sbit EN=P3^4;
- //uchar tab1[]="2020-09-30 wek:3";//第一行顯示0123456789abcdef共16個字符
- //uchar tab2[]=" V temp: . C"; //第二行顯示時鐘的模板
- uint8_t tab1_LUAN[]="C0:3.3V C1:3.3V ";//第一行顯示0123456789abcdef共16個字符
- uint8_t tab2_LUAN[]="C2:3.3V C3:3.3V "; //第二行顯示時鐘的模板
- uint8_t tab3_LUAN[]="C4: . V C5: . V ";//第一行顯示0123456789abcdef共16個字符
- uint8_t tab4_LUAN[]=" "; //第二行顯示時鐘的模板
- uint8_t tab5_LUAN[]=" ";//第一行顯示0123456789abcdef共16個字符
- uint8_t tab6_LUAN[]="Temper: . "; //第二行顯示時鐘的模板
- uint8_t tab7_LUAN[]=" : : : ";//第一行顯示0123456789abcdef共16個字符
- uint8_t tab8_LUAN[]=" Temper: . "; //第二行顯示時鐘的模板
- //數(shù)據(jù)處理函數(shù)
- /********************************************************************
- 函數(shù)功能:把一個BYTE輸入到LCD的數(shù)據(jù)引腳。
- 入口參數(shù):dat:要寫入LCD的數(shù)據(jù)。
- 返 回:無。
- 備 注:無。
- ********************************************************************/
- /*
- void SetLcdData(uint8_t dat)
- {
- LCD_D0=((dat>>0)&0x01);
- LCD_D1=((dat>>1)&0x01);
- LCD_D2=((dat>>2)&0x01);
- LCD_D3=((dat>>3)&0x01);
- LCD_D4=((dat>>4)&0x01);
- LCD_D5=((dat>>5)&0x01);
- LCD_D6=((dat>>6)&0x01);
- LCD_D7=((dat>>7)&0x01);
- }
- */
- /**///////////////////////Pino Electronics////////////////////////**/
- void SetLcdData(uint8_t dat)
- {
- LCD_D0=((dat>>0)&0x01);
- LCD_D1=((dat>>1)&0x01);
- LCD_D2=((dat>>2)&0x01);
- LCD_D3=((dat>>3)&0x01);
- LCD_D4=((dat>>4)&0x01);
- LCD_D5=((dat>>5)&0x01);
- LCD_D6=((dat>>6)&0x01);
- LCD_D7=((dat>>7)&0x01);
- }
- /********************************************************************
- 函數(shù)功能:從LCD的數(shù)據(jù)引腳讀取一個BYTE。
- 入口參數(shù):無。
- 返 回:dat:從LCD讀取的數(shù)據(jù)。
- 備 注:無。
- ********************************************************************/
- /*
- uint8_t GetLcdData(void)
- {
- u8 dat=0;
- if(LCD_D0) dat|=0x01;
- if(LCD_D1) dat|=0x02;
- if(LCD_D2) dat|=0x04;
- if(LCD_D3) dat|=0x08;
- if(LCD_D4) dat|=0x10;
- if(LCD_D5) dat|=0x20;
- if(LCD_D6) dat|=0x40;
- if(LCD_D7) dat|=0x80;
- return dat;
- }*/
- /**///////////////////////Pino Electronics////////////////////////**/
- /********************************************************************
- 函數(shù)功能:設(shè)置光標(biāo)位置和AC寄存器地址。
- 入口參數(shù):line:光標(biāo)所在的行數(shù),0表示第一行,1表示第二行;
- index:光標(biāo)所在的列數(shù),0表示第一列。
- 返 回:無。
- 備 注:1602屏可顯示兩行,每行16個字符,地址分別為00H-0FH,40H-4FH。
- ********************************************************************/
- /*
- void Lcd1602SetAC(u8 line, u8 index)
- {
- u8 base;
- if (line==1)
- base=0xC0;
- else if(line==0)
- base=0x80;
- else
- return;
- Lcd1602WriteCmd(base+index); //設(shè)置RAM地址
- }
- */
- /**///////////////////////Pino Electronics////////////////////////**/
- void LCD1602_LUAN_Write_com(uint8_t com)
- {
- RS_LUAN=0; RW_LUAN=0; EN_LUAN=0;
- // P0=com;
- SetLcdData(com);
- EN_LUAN=1;
- delay_ms(5);//必要的延時
- EN_LUAN=0; //下降沿,LCD1602開始工作
- }
- void LCD1602_LUAN_Write_data(uint8_t date)
- {
- RS_LUAN=1; RW_LUAN=0; EN_LUAN=0;
- // P0=date;
- SetLcdData(date);
- EN_LUAN=1; //先拉高
- delay_ms(5);//必要的延時
- EN_LUAN=0; //下降沿,開始寫入有效數(shù)據(jù)
- }
- void LCD1602_LUAN_Init(void)
- {
-
- LCD1602_LUAN_Write_com(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
- LCD1602_LUAN_Write_com(0x0c); //顯示開,關(guān)光標(biāo);0x08為關(guān)顯示
- LCD1602_LUAN_Write_com(0x06); //自動右移光標(biāo),0x04為左移光標(biāo)
- LCD1602_LUAN_Write_com(0x80); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
- LCD1602_LUAN_Write_com(0x01); //清除LCD的顯示內(nèi)容
- }
-
- void lcd1602_LUAN_dis1(void) //顯示模板函數(shù)
- {
- uint8_t i; //定義一個變量i
- LCD1602_LUAN_Write_com(0x80); //定義第一行
- for(i=0;i<16;i++) //從數(shù)組1調(diào)用16個字符
- {
- LCD1602_LUAN_Write_data(tab1_LUAN[i]); //調(diào)用第一行數(shù)組數(shù)據(jù)
- delay_ms(5); //延時5毫秒
- }
- LCD1602_LUAN_Write_com(0x80+0x40); //定義第二行
- for(i=0;i<16;i++)//從數(shù)組調(diào)用16個字符
- {
- LCD1602_LUAN_Write_data(tab2_LUAN[i]); //從數(shù)組2調(diào)用16個字符
- delay_ms(5); //延時5毫秒
- }
- }
-
-
- void lcd1602_LUAN_dis2(void) //顯示模板函數(shù)
- {
- uint8_t i; //定義一個變量i
- LCD1602_LUAN_Write_com(0x80); //定義第一行
- for(i=0;i<16;i++) //從數(shù)組1調(diào)用16個字符
- {
- LCD1602_LUAN_Write_data(tab3_LUAN[i]); //調(diào)用第一行數(shù)組數(shù)據(jù)
- delay_ms(5); //延時5毫秒
- }
- LCD1602_LUAN_Write_com(0x80+0x40); //定義第二行
- for(i=0;i<16;i++)//從數(shù)組調(diào)用16個字符
- {
- LCD1602_LUAN_Write_data(tab4_LUAN[i]); //從數(shù)組2調(diào)用16個字符
- delay_ms(5); //延時5毫秒
- }
- }
-
-
- void lcd1602_LUAN_dis3(void) //顯示模板函數(shù)
- {
- uint8_t i; //定義一個變量i
- LCD1602_LUAN_Write_com(0x80); //定義第一行
- for(i=0;i<16;i++) //從數(shù)組1調(diào)用16個字符
- {
- LCD1602_LUAN_Write_data(tab7_LUAN[i]); //調(diào)用第一行數(shù)組數(shù)據(jù)
- delay_ms(5); //延時5毫秒
- }
- LCD1602_LUAN_Write_com(0x80+0x40); //定義第二行
- for(i=0;i<16;i++)//從數(shù)組調(diào)用16個字符
- {
- LCD1602_LUAN_Write_data(tab8_LUAN[i]); //從數(shù)組2調(diào)用16個字符
- delay_ms(5); //延時5毫秒
- }
- }
-
-
- // /******************LCD1602顯示時間*********************/
- // void lcd1602_dis2() //顯示時間
- // {
- // LCD1602_dw(2,7,shi/10) ; //第二行 的第8位裝秒的十位
- // LCD1602_dw(2,8,shi%10) ; //第二行 的第9位裝秒的個位
- // LCD1602_Write_com(0x80+0x40+9);//第二行 的第10個位置
- // LCD1602_Write_data(':');//送一個:
- // LCD1602_dw(2,10,fen/10) ; //第二行 的第14位裝秒的十位
- // LCD1602_dw(2,11,fen%10) ; //第二行 的第15位裝秒的個位
- // LCD1602_Write_com(0x80+0x40+12);//第二行 的第13個位置
- // LCD1602_Write_data(':');//送一個:
- // LCD1602_dw(2,13,miao/10) ; //第二行 的第14位裝秒的十位
- // LCD1602_dw(2,14,miao%10) ; //第二行 的第15位裝秒的個位
- // }
- void LCD1602_LUAN_GPIO_Init(void)
- {
-
- GPIO_InitTypeDef GPIO_InitStructure; //聲明一個結(jié)構(gòu)體變量,用來初始化GPIO
- RCC_APB2PeriphClockCmd(LED_PORT_RCC_LUAN,ENABLE);//* 開啟GPIO時鐘
- /* 配置GPIO的模式和IO口 */
- GPIO_InitStructure.GPIO_Pin=LED_PIN1_LUAN; //選擇你要設(shè)置的IO口---E端口
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//選擇你要設(shè)置的IO模式
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//設(shè)置速度
- GPIO_Init(LED_PORT1_LUAN,&GPIO_InitStructure); /* 初始化GPIO ---E端口*/
- /************配置端口F***************/
- GPIO_InitStructure.GPIO_Pin=LED_PIN2_LUAN; //選擇你要設(shè)置的IO口---F端口
- GPIO_Init(LED_PORT2_LUAN,&GPIO_InitStructure); /* 初始化GPIO ----F端口*/
- }
- /************************************************************
- 使用
- void main(void)
- {
- LCD1602_GPIO_Init();
- LCD1602_Init();
- lcd1602_dis1();
- }
- **********************************************************/
- /********************************************************************
- 函數(shù)功能:設(shè)置光標(biāo)位置和AC寄存器地址。
- 入口參數(shù):line:光標(biāo)所在的行數(shù),0表示第一行,1表示第二行;
- index:光標(biāo)所在的列數(shù),0表示第一列。
- date :數(shù)字 數(shù)字變?yōu)閷?yīng)字符需要 |0x30即可 +0x30
- 返 回:無。
- 備 注:1602屏可顯示兩行,每行16個字符,地址分別為00H-0FH,40H-4FH。
- 特定位置顯示特定數(shù)值
- ********************************************************************/
- void Lcd1602_LUAN_SetAC_Date(u8 line, u8 index,u8 date)
- {
- u8 base;
- if (line==1)
- base=0xC0;
- else if(line==0)
- base=0x80;
- else
- return;
- LCD1602_LUAN_Write_com(base+index); //設(shè)置RAM地址
- LCD1602_LUAN_Write_data(date); //輸入要顯示的數(shù)據(jù)
- }
- /*********************************************************
- 特定位置顯示特定數(shù)值
- ************************************************************/
- //第一行的界面設(shè)置函數(shù)
- /********************************************************************
- 函數(shù)功能:設(shè)置光標(biāo)位置和AC寄存器地址。第一行的界面設(shè)置函數(shù)
- 入口參數(shù): index:光標(biāo)所在的列數(shù)。
- date :數(shù)字 數(shù)字變?yōu)閷?yīng)字符需要 |0x30即可 +0x30
- 返 回:無。
- 備 注:1602屏可顯示兩行,每行16個字符,地址分別為00H-0FH,40H-4FH。
- 特定位置顯示特定數(shù)值
- ********************************************************************/
- void LCD1602_LUAN_Display_line1(u8 index,u8 date)
- {
- LCD1602_LUAN_Write_com(0x80+index); //設(shè)置RAM地址
- LCD1602_LUAN_Write_data(date); //輸入要顯示的數(shù)據(jù)
- delay_ms(5); //延時5毫秒
- }
- //第二行的界面設(shè)置函數(shù)
- /********************************************************************
- 函數(shù)功能:設(shè)置光標(biāo)位置和AC寄存器地址。第二行的界面設(shè)置函數(shù)
- 入口參數(shù): index:光標(biāo)所在的列數(shù)。
- date :數(shù)字 數(shù)字變?yōu)閷?yīng)字符需要 |0x30即可 +0x30
- 返 回:無。
- 備 注:1602屏可顯示兩行,每行16個字符,地址分別為00H-0FH,40H-4FH。
- 特定位置顯示特定數(shù)值
- ********************************************************************/
- void LCD1602_LUAN_Display_line2(u8 index,u8 date)
- {
- LCD1602_LUAN_Write_com(0xC0+index); //設(shè)置RAM地址
- LCD1602_LUAN_Write_data(date); //輸入要顯示的數(shù)據(jù)
- delay_ms(5); //延時5毫秒
- }
- //自己做的穩(wěn)定的不會閃爍的界面1
- void LCD1602_LUAN_Interface_1(void)
- {
- //第一行
- LCD1602_LUAN_Display_line1(0,'C');
- LCD1602_LUAN_Display_line1(1,'0');
- LCD1602_LUAN_Display_line1(2,':');
- LCD1602_LUAN_Display_line1(4,'.');
- LCD1602_LUAN_Display_line1(6,'V');
- LCD1602_LUAN_Display_line1(7,' ');
-
- LCD1602_LUAN_Display_line1(8,'C');
- LCD1602_LUAN_Display_line1(9,'1');
- LCD1602_LUAN_Display_line1(10,':');
- LCD1602_LUAN_Display_line1(12,'.');
- LCD1602_LUAN_Display_line1(14,'V');
- LCD1602_LUAN_Display_line1(15,' ');
-
- //第2行
- LCD1602_LUAN_Display_line2(0,'C');
- LCD1602_LUAN_Display_line2(1,'2');
- LCD1602_LUAN_Display_line2(2,':');
- LCD1602_LUAN_Display_line2(4,'.');
- LCD1602_LUAN_Display_line2(6,'V');
- LCD1602_LUAN_Display_line2(7,' ');
-
- LCD1602_LUAN_Display_line2(8,'C');
- LCD1602_LUAN_Display_line2(9,'3');
- LCD1602_LUAN_Display_line2(10,':');
- LCD1602_LUAN_Display_line2(12,'.');
- LCD1602_LUAN_Display_line2(14,'V');
- LCD1602_LUAN_Display_line2(15,' ');
-
- }
- //自己做的穩(wěn)定的不會閃爍的界面2
- void LCD1602_LUAN_Interface_2(void)
- {
- uint8_t i=0;
- //第一行
- LCD1602_LUAN_Display_line1(0,'C');
- LCD1602_LUAN_Display_line1(1,'4');
- LCD1602_LUAN_Display_line1(2,':');
- LCD1602_LUAN_Display_line1(4,'.');
- LCD1602_LUAN_Display_line1(6,'V');
- LCD1602_LUAN_Display_line1(7,' ');
-
- LCD1602_LUAN_Display_line1(8,'C');
- LCD1602_LUAN_Display_line1(9,'5');
- LCD1602_LUAN_Display_line1(10,':');
- LCD1602_LUAN_Display_line1(12,'.');
- LCD1602_LUAN_Display_line1(14,'V');
- LCD1602_LUAN_Display_line1(15,' ');
-
- //第2行
- /*
- LCD1602_Display_line1(0,'C');
- LCD1602_Display_line1(1,'2');
- LCD1602_Display_line1(2,':');
- LCD1602_Display_line1(4,'.');
- LCD1602_Display_line1(6,'V');
- LCD1602_Display_line1(7,' ');
-
- LCD1602_Display_line1(8,'C');
- LCD1602_Display_line1(9,'3');
- LCD1602_Display_line1(10,':');
- LCD1602_Display_line1(12,'.');
- LCD1602_Display_line1(14,'V');
- LCD1602_Display_line1(15,' ');
- */
- //第2行
- LCD1602_LUAN_Write_com(0x80+0x40); //定義第二行
- for(i=0;i<16;i++)//從數(shù)組調(diào)用16個字符
- {
- LCD1602_LUAN_Write_data(tab4_LUAN[i]); //從數(shù)組2調(diào)用16個字符
- delay_ms(5); //延時5毫秒
- }
- }
- //自己做的穩(wěn)定的不會閃爍的界面3
- void LCD1602_LUAN_Interface_3(void)
- {
- //第一行
- LCD1602_LUAN_Display_line1(0,'C');
- LCD1602_LUAN_Display_line1(1,'0');
- LCD1602_LUAN_Display_line1(2,':');
- LCD1602_LUAN_Display_line1(4,'.');
- LCD1602_LUAN_Display_line1(6,'V');
- LCD1602_LUAN_Display_line1(7,' ');
-
- LCD1602_LUAN_Display_line1(8,'C');
- LCD1602_LUAN_Display_line1(9,'1');
- LCD1602_LUAN_Display_line1(10,':');
- LCD1602_LUAN_Display_line1(12,'.');
- LCD1602_LUAN_Display_line1(14,'V');
- LCD1602_LUAN_Display_line1(15,' ');
-
- //第2行
- LCD1602_LUAN_Display_line2(0,'C');
- LCD1602_LUAN_Display_line2(1,'2');
- LCD1602_LUAN_Display_line2(2,':');
- LCD1602_LUAN_Display_line2(4,'.');
- LCD1602_LUAN_Display_line2(6,'V');
- LCD1602_LUAN_Display_line2(7,' ');
-
- LCD1602_LUAN_Display_line2(8,'C');
- LCD1602_LUAN_Display_line2(9,'3');
- LCD1602_LUAN_Display_line2(10,':');
- LCD1602_LUAN_Display_line2(12,'.');
- LCD1602_LUAN_Display_line2(14,'V');
- LCD1602_LUAN_Display_line2(15,' ');
- }
復(fù)制代碼
全部資料51hei下載地址:
LCD1602實(shí)驗(yàn)亂口.7z
(356.21 KB, 下載次數(shù): 19)
2020-10-31 04:00 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|