|
|
我給你來(lái)個(gè)程序試試
- #include <pic.h> //調(diào)用PIC16F87XA單片機(jī)的頭文件
- //根據(jù)選項(xiàng),配置字應(yīng)該如下所示:
- //__CONFIG(HS&WRTEN&WDTDIS&BOREN&PWRTDIS&UNPROTECT&DUNPROT&DEBUGDIS&LVPDIS);
- //實(shí)際使用中,這樣太麻煩,對(duì)于默認(rèn)選項(xiàng),我們將其忽略掉:
- __CONFIG(HS&WDTDIS&LVPDIS);
- //---------------------------------------
- //1602液晶相關(guān)I/O設(shè)置
- #define E RB3 //1602液晶的E腳接在RB3口上
- #define RW RB4 //1602液晶的RW腳接在RB4口上
- #define RS RB5 //1602液晶的RS腳接在RB5口上
- //---------------------------------------
- //---------------------------------------
- //A/D轉(zhuǎn)換用寄存器設(shè)置
- unsigned int ADbuf; //10位A/D轉(zhuǎn)換,設(shè)置16位的unsigend int型寄存器用來(lái)暫存A/D轉(zhuǎn)換結(jié)果
- //---------------------------------------
- void Delay1602(unsigned int t)
- {
- unsigned int k; //定義一個(gè)16位寄存器用來(lái)做延時(shí)用
- for(k=0;k<t;k++); //延時(shí)
- }
- void LCD1602_busy(void)
- {
- TRISD7=1; //將RD7口設(shè)置為輸入口,為讀做準(zhǔn)備
- RS=0; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由RD7讀入
- RW=1; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由RD7讀入
- E=1; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由RD7讀入
- while(RD7==1); //由RD7讀入1,表示1602液晶忙,需要等待
- E=0; //讀完以后,恢復(fù)E的電平
- TRISD7=0; //將RD7口設(shè)置為輸出口
- }
- void LCD1602_Write_com(unsigned char combuf)
- {
- RS=0; //選擇指令寄存器
- RW=0; //選擇寫(xiě)狀態(tài)
- PORTD=combuf; //將命令字通過(guò)RD口送至DB
- E=1; //E高電平將命令字寫(xiě)入1602液晶
- asm("NOP"); //添加一個(gè)空操作,使高電平至少維持1us
- E=0; //寫(xiě)完以后,恢復(fù)E的電平
- }
- void LCD1602_Write_com_busy(unsigned char combuf)
- {
- LCD1602_busy(); //調(diào)用忙檢測(cè)函數(shù)
- LCD1602_Write_com(combuf); //調(diào)用忙檢測(cè)函數(shù)
- }
- void LCD1602_Write_data_busy(unsigned char databuf)
- {
- LCD1602_busy(); //調(diào)用忙檢測(cè)函數(shù)
- RS=1; //選擇數(shù)據(jù)寄存器
- RW=0; //選擇寫(xiě)狀態(tài)
- PORTD=databuf; //將命令字通過(guò)RD口送至DB
- E=1; //E高電平將命令字寫(xiě)入1602液晶
- asm("NOP"); //添加一個(gè)空操作,使高電平至少維持1us
- E=0; //寫(xiě)完以后,恢復(fù)E的電平
- }
- void LCD1602_Write_address(unsigned char x,unsigned char y)
- {
- x&=0x0f; //列地址限制在0-15間
- y&=0x01; //行地址限制在0-1間
- if(y==0) //如果是第一行
- LCD1602_Write_com_busy(x|0x80); //將列地址寫(xiě)入
- else //如果是第二行
- LCD1602_Write_com_busy((x+0x40)|0x80); //將列地址寫(xiě)入
- }
- void LCD1602_init(void)
- {
- Delay1602(1500); //調(diào)用延時(shí)函數(shù)
- LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- Delay1602(500); //調(diào)用延時(shí)函數(shù)
- LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- Delay1602(500); //調(diào)用延時(shí)函數(shù)
- LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- LCD1602_Write_com_busy(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- LCD1602_Write_com_busy(0x08); //顯示功能關(guān),無(wú)光標(biāo)
- LCD1602_Write_com_busy(0x01); //清屏
- LCD1602_Write_com_busy(0x06); //寫(xiě)入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動(dòng)
- LCD1602_Write_com_busy(0x0C); //顯示功能開(kāi),無(wú)光標(biāo)
- }
- void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
- {
- LCD1602_Write_address(x,y); //先將地址信息寫(xiě)入
- LCD1602_Write_data_busy(buf); //再寫(xiě)入要顯示的數(shù)據(jù)
- }
- void main(void) //主函數(shù),單片機(jī)開(kāi)機(jī)后就是從這個(gè)函數(shù)開(kāi)始運(yùn)行
- {
- TRISA=0B11111111; //初始化RA5-RA0的輸入輸出方向
- TRISB=0B11000111; //初始化RB7-RB0的輸入輸出方向
- TRISD=0B00000000; //初始化RD7-RD0的輸入輸出方向
- PORTA=0B00000000; //初始化RA5-RA0數(shù)值
- PORTB=0B00000000; //初始化RB7-RB0的數(shù)值
- PORTD=0B00000000; //初始化RD7-RD0的數(shù)值
- LCD1602_init(); //調(diào)用1602液晶初始化函數(shù)
- //****A/D模塊初始化****
- ADCON1=0B10001110; //RA0為A/D輸入口;ADFM=1,轉(zhuǎn)換后數(shù)據(jù)右移,ADRESL為低8位數(shù)據(jù)
- ADIE=0; //禁止A/D中斷
- //*********************
- LCD1602_Disp(2,0,'-');
- LCD1602_Disp(3,0,'-');
- LCD1602_Disp(4,0,'A');
- LCD1602_Disp(5,0,'N');
- LCD1602_Disp(6,0,'0');
-
- LCD1602_Disp(8,0,'T');
- LCD1602_Disp(9,0,'E');
- LCD1602_Disp(10,0,'S');
- LCD1602_Disp(11,0,'T');
- LCD1602_Disp(12,0,'-');
- LCD1602_Disp(13,0,'-');
- while(1) //死循環(huán),單片機(jī)初始化后,將一直運(yùn)行這個(gè)死循環(huán)
- {
- //***啟動(dòng)一次A/D轉(zhuǎn)換***
- ADCON0=0B00000001; //選擇AN0通道準(zhǔn)備進(jìn)行A/D轉(zhuǎn)換,啟動(dòng)A/D模塊
- asm("NOP"); //略做延時(shí)
- asm("NOP"); //略做延時(shí)
- asm("NOP"); //略做延時(shí)
- asm("NOP"); //略做延時(shí)
- ADGO=1; //開(kāi)始進(jìn)行A/D轉(zhuǎn)換
- while(ADGO) continue; //等待A/D轉(zhuǎn)換結(jié)束
- ADbuf=ADRESH*256+ADRESL;//將10位A/D轉(zhuǎn)換結(jié)果暫存在ADbuf
- //*********************
- //*******************************
- LCD1602_Disp(5,1,'A');
- LCD1602_Disp(6,1,'D');
- LCD1602_Disp(7,1,'=');
- //***1602液晶顯示0-255***
- LCD1602_Disp(8,1,(ADbuf/1000)+'0'); //在第2行的第9列顯示百位
- LCD1602_Disp(9,1,((ADbuf%1000)/100)+'0'); //在第2行的第10列顯示百位
- LCD1602_Disp(10,1,(ADbuf%100)/10+'0'); //在第2行的第11列顯示十位
- LCD1602_Disp(11,1,ADbuf%10+'0'); //在第2行的第12列顯示個(gè)位
- //***********************
- }
- }
復(fù)制代碼 |
|