|
樓主的問題不在逆序函數(shù),在于判忙函數(shù),修改一下就好了。注:仿真不完全代表實(shí)際電路有效!
- /*********************************************************************************
- * 【外部晶振】: 11.0592mhz
- * 【主控芯片】: STC89C52
- * 【編譯環(huán)境】: Keil μVisio3
- * 【程序功能】: LCD1602顯示
- * 【使用說明】: 正確接上LCD1602液晶并調(diào)節(jié)好對比度
- * 說明:免費(fèi)開源,不提供源代碼分析.
- **********************************************************************************/
- #include <reg52.h>
- /*=================================================
- *自定義數(shù)據(jù)類型
- =================================================*/
- typedef unsigned char uchar;
- typedef unsigned int uint;
- #define LCD1602_DB P0 //LCD1602數(shù)據(jù)總線
- //<font color="#ff0000">
- sbit LCD1602_RS = P2^5; //RS端
- sbit LCD1602_RW = P2^6; //RW端
- sbit LCD1602_EN = P2^7; //EN端</font>
- //sbit DU = P2^6;//
- //sbit WE = P2^7;//數(shù)碼管位選段選用于關(guān)閉數(shù)碼管顯示
- unsigned char swapbit(unsigned char udata) //<font color="#ff0000">逆位顯示</font>
- {
- unsigned char ii,tmp=0;
- for(ii=0;ii<8;ii++)
- {
- tmp<<=1;
- if(udata&0x01)
- {
- tmp|=0x01;
- }
- udata>>=1;
- }
- return tmp;
- }
- /*=================================================
- *函數(shù)名稱:Read_Busy
- *函數(shù)功能:判斷1602液晶忙,并等待
- =================================================*/
- bit Read_Busy()
- {
- unsigned char LCD_Status;
- LCD1602_RS = 0;
- LCD1602_RW = 1;
- LCD1602_EN = 1;
- LCD_Status = swapbit(LCD1602_DB);
- LCD1602_EN = 0;
- return LCD_Status;
- }
- /*
- void Read_Busy()
- {
- uchar busy;
- LCD1602_DB = 0xff;//復(fù)位數(shù)據(jù)總線
- LCD1602_RS = 0; //拉低RS
- LCD1602_RW = 1; //拉高RW讀
- do
- {
- LCD1602_EN = 1;//使能EN
- busy = swapbit(LCD1602_DB);//讀回?cái)?shù)據(jù)
- LCD1602_EN = 0; //拉低使能以便于下一次產(chǎn)生上升沿
- }while(busy); //判斷狀態(tài)字BIT7位是否為1,為1則表示忙,程序等待
- }*/
- /*=================================================
- *函數(shù)名稱:LCD1602_Write_Cmd
- *函數(shù)功能:寫LCD1602命令
- *調(diào)用:Read_Busy();
- *輸入:cmd:要寫的命令
- =================================================*/
- void LCD1602_Write_Cmd(uchar cmd)
- {
- // Read_Busy(); //判斷忙,忙則等待
- while((Read_Busy()&0x80)==0x80);//判忙
- LCD1602_RS = 0;
- LCD1602_RW = 0; //拉低RS、RW操作時(shí)序情況1602課件下中文使用說明基本操作時(shí)序章節(jié)
- LCD1602_DB = swapbit(cmd);//寫入命令
- LCD1602_EN = 1; //拉高使能端 數(shù)據(jù)被傳輸?shù)絃CD1602內(nèi)
- LCD1602_EN = 0; //拉低使能以便于下一次產(chǎn)生上升沿
- }
- /*=================================================
- *函數(shù)名稱:LCD1602_Write_Dat
- *函數(shù)功能:寫LCD1602數(shù)據(jù)
- *調(diào)用:Read_Busy();
- *輸入:dat:需要寫入的數(shù)據(jù)
- =================================================*/
- void LCD1602_Write_Dat(uchar dat)
- {
- // Read_Busy();
- while((Read_Busy()&0x80)==0x80);//判忙
- LCD1602_RS = 1;
- LCD1602_RW = 0;
- LCD1602_DB = swapbit(dat);
- LCD1602_EN = 1;
- LCD1602_EN = 0;
- }
- /*=================================================
- *函數(shù)名稱:LCD1602_Dis_OneChar
- *函數(shù)功能:在指定位置顯示一個(gè)字符
- *調(diào)用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
- *輸入:x:要顯示的橫坐標(biāo)取值0-40,y:要顯示的行坐標(biāo)取值0-1(0為第一行,1為第二行)
- dat:需要顯示的數(shù)據(jù)以ASCLL形式顯示
- =================================================*/
- /*
- void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
- {
- if(y) x |= 0x40;
- x |= 0x80;
- LCD1602_Write_Cmd(x);
- LCD1602_Write_Dat(dat);
- }
- */
- /*=================================================
- *函數(shù)名稱:LCD1602_Dis_Str
- *函數(shù)功能:在指定位置顯示字符串
- *調(diào)用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
- *輸入:x:要顯示的橫坐標(biāo)取值0-40,y:要顯示的行坐標(biāo)取值0-1(0為第一行,1為第二行)
- *str:需要顯示的字符串
- =================================================*/
- void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
- {
- if(y) x |= 0x40;
- x |= 0x80;
- LCD1602_Write_Cmd(x);
- while(*str != '\0')
- {
- LCD1602_Write_Dat(*str++);
- }
- }
- /*=================================================
- *函數(shù)名稱:Init_LCD1602
- *函數(shù)功能:1602初始化
- *調(diào)用: LCD1602_Write_Cmd();
- =================================================*/
- void Init_LCD1602()
- {
- LCD1602_Write_Cmd(0x38); //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
- LCD1602_Write_Cmd(0x0c); //開顯示
- LCD1602_Write_Cmd(0x06); //讀寫一字節(jié)后地址指針加1
- LCD1602_Write_Cmd(0x01); //清除顯示
- }
- void main()
- {
- // int n;
- uchar TestStr[] = {"welcome!"};
- uchar str[] = {"LCD1602 display"};
- //DU = 0;
- //WE = 0;//關(guān)閉數(shù)碼管顯示
- Init_LCD1602();//1602初始化
- LCD1602_Dis_Str(0, 0,TestStr); //顯示字符串
- LCD1602_Dis_Str(0, 1,str); //顯示字符串
- // LCD1602_Dis_OneChar(15, 1, 0xff); //顯示一個(gè)黑方格 請查表
- while(1);
- }
復(fù)制代碼
|
|