|
- #include <reg52.h>
- #include <intrins.h>
- #include "main.h"
- #define uchar unsigned char
- #define uint unsigned int
- /*LCD12864 端口定義*/
- #define LCD_data P0 //數(shù)據(jù)口
- sbit LCD_RS = P2^5; //寄存器選擇輸入
- sbit LCD_RW = P2^6; //液晶讀/寫控制
- sbit LCD_EN = P2^7; //液晶使能控制
- sbit LCM_RST = P3^2;
- //sbit LCD_PSB = P0^4; //串/并方式控制,部分液晶不需要
- uchar code dis0[]=" IC卡門禁系統(tǒng) ";
- uchar code dis1[]="1.IC卡輸入 ";
- uchar code dis2[]="2.密碼輸入:8位 ";
- uchar code dis3[]="3.IC卡登記 ";
- uchar code dis4[]="4.密碼設(shè)置:8位 ";
- uchar code dis5[]="成功 ";
- uchar code dis6[]="失敗 ";
- void delay(int ms) //延時(shí)xms
- {
- while(ms--)
- {
- uchar i;
- for(i=0;i<250;i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- void delayNOP() //延時(shí)4us
- { _nop_(); _nop_(); _nop_(); _nop_();}
- /*******************************************************************/
- /* */
- /*因?yàn)橐_的定義DB0..DB7是從P1.7...P1.0排列的 */
- /*所以順序需要調(diào)換一下 */
- /* */
- /*******************************************************************/
- INT8U swapbit(INT8U udata)
- {
- INT8U ii,tmp=0;
- for(ii=0;ii<8;ii++)
- {
- tmp<<=1;
- if(udata&0x01)
- {
- tmp|=0x01;
- }
- udata>>=1;
- }
- return tmp;
- }
- /*******************************************************************/
- /* */
- /*檢查L(zhǎng)CD忙狀態(tài) */
- /*lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫指令與數(shù)據(jù)。 */
- /* */
- /*******************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result = (bit)(LCD_data&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************/
- /* */
- /*寫指令數(shù)據(jù)到LCD */
- /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
- /* */
- /*******************************************************************/
- void write_cmd(unsigned char WCLCM,BuysC)
- {
- unsigned int K=20000;
- while(lcd_busy() && K--); //預(yù)防沒插LCD時(shí)候停在這
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- LCD_data = swapbit(WCLCM);
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /*寫顯示數(shù)據(jù)到LCD */
- /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。 */
- /* */
- /*******************************************************************/
- void lcd_wdat(unsigned char WDLCM)
- {
- unsigned int K=20000;
- while(lcd_busy() && K--); //預(yù)防沒插LCD時(shí)候停在這
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- LCD_data= swapbit(WDLCM);
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /* LCD初始化設(shè)定 */
- /* */
- /*******************************************************************/
- void lcd_init()
- {
- // LCD_PSB = 1; //并口方式 ,部分液晶不需要
- // LCM_RST =0;
- write_cmd(0x36); //擴(kuò)充指令操作
- delay(5);
- write_cmd(0x30); //基本指令操
- delay(5);
- write_cmd(0x0C); //顯示開,關(guān)光標(biāo)
- delay(5);
- write_cmd(0x01); //清除LCD的顯示內(nèi)容
- delay(5);
- }
- /*********************************************************/
- /* */
- /* 設(shè)定顯示位置 */
- /* */
- /*********************************************************/
- void lcd_pos(uchar X,uchar Y)
- {
- uchar pos;
- if (X==0)
- {X=0x80;}
- else if (X==1)
- {X=0x90;}
- else if (X==2)
- {X=0x88;}
- else if (X==3)
- {X=0x98;}
- pos = X+Y ;
- write_cmd(pos); //顯示地址
- }
- /*********************************************************/
- /* */
- /* 顯示主程序 */
- /* */
- /*********************************************************/
- void display_all()
- {
- uchar i;
-
- lcd_pos(0,0); //第一行顯示數(shù)字0~9
- i = 0;
- while(dis0[i] != '\0')
- {
- lcd_wdat(dis0[i]); //顯示字母
- i++;
- }
-
- lcd_pos(1,0); //第二行顯示字母
- i = 0;
- while(dis1[i] != '\0')
- {
- lcd_wdat(dis1[i]); //顯示字母
- i++;
- }
- lcd_pos(2,0); //第三行顯示文字
- i = 0;
- while(dis2[i] != '\0')
- {
- lcd_wdat(dis2[i]);
- i++;
- }
- lcd_pos(3,0); //第四行顯示廣工無線電社
- i = 0;
- while(dis3[i] != '\0')
- {
- lcd_wdat(dis3[i]);
- i++;
- }
-
- }
- /*********************************************************/
- /* */
- /* 特定字符顯示主程序 */
- /*
- C:
- 0=" IC卡點(diǎn)臺(tái)燈 ";
- 1="1.讀卡中.... ";
- 2="2.登記.... ";
- 3="成功 ";
- 4="失敗 ";
- /*********************************************************/
- void display(uchar a,uchar b,uchar c)
- {
- uchar i;
- lcd_pos(a,b); //第一行顯示數(shù)字0~9
- i = 0;
- switch(c)
- {
- case 0:
- while(dis0[i] != '\0')
- {
- lcd_wdat(dis0[i]); //顯示字母
- i++;
- }
- break;
- case 1:
- while(dis1[i] != '\0')
- {
- lcd_wdat(dis1[i]); //顯示字母
- i++;
- }
- break;
- case 2:
- while(dis2[i] != '\0')
- {
- lcd_wdat(dis2[i]); //顯示字母
- i++;
- }
- break;
- case 3:
- while(dis3[i] != '\0')
- {
- lcd_wdat(dis3[i]); //顯示字母
- i++;
- }
- break;
-
-
- case 4:
- while(dis4[i] != '\0')
- {
- lcd_wdat(dis4[i]); //顯示字母
- i++;
- }
- break;
- case 5:
- while(dis5[i] != '\0')
- {
- lcd_wdat(dis5[i]); //顯示字母
- i++;
- }
- break;
- case 6:
- while(dis6[i] != '\0')
- {
- lcd_wdat(dis6[i]); //顯示字母
- i++;
- }
- break;
- default :break;
- }
- }
- /*********************************************************/
- /* */
- /* 一般字符顯示主程序 */
- /*
- *p:內(nèi)容
- c:個(gè)數(shù)
- /*********************************************************/
- void display2(uchar a,uchar b,uchar *p,uchar num)
- {
- uchar i;
- lcd_pos(a,b); //第一行顯示數(shù)字0~9
- for(i=0;i<num;i++)
- lcd_wdat(p[i]); //顯示字母
- }
- /********************
- 清除某一行
- *********************/
- void display_clear_line(uchar a)
- {
- uchar i;
- lcd_pos(a,0);
- for(i=0;i<16;i++)
- lcd_wdat(' ');
復(fù)制代碼
|
|