1602液晶顯示成功程序:
- #include<reg52.h> //頭文件
- #include<intrins.h>
- #include "math.h"
- #define uchar unsigned char //宏定義
- #define uint unsigned int //宏定義
- #define LCD1602_dat P0 //LCD1602的數據傳輸IO口
- sbit LCD1602_rs=P3^5;//LCD1602命令數據控制IO
- sbit LCD1602_rw=P3^6; //LCD1602讀寫IO控制
- sbit LCD1602_e=P3^4; //數據脈沖輸入
- sbit DIN = P2^0; //串行數據輸入端
- sbit DCLK = P2^1; //I/O時鐘輸入
- sbit DOUT = P2^5; //串行數據輸出端
- sbit CS = P3^7; //片選腳IO
- #define AD_CH3 0xe4
- float zhi; //暫存讀取的輸入變量
- int temp; //讀取熱敏溫度計的溫度數據
- void delay(uint T) //系統延時程序
- {
- while(T--);
- }
- /*=========================================
- 函數 :SPI_Write(uchar DAT)
- 參數 :DAT需要發送的數據
- 返回值 :無
- 描述 :發送一個字節數據
- ==========================================*/
- void SPI_Write(uchar DAT)
- {
- uchar i;
- for(i=0;i<8;i++) //分別寫8次,每次寫一位
- {
- DCLK = 0; //拉低時鐘總,允許DIN變化
- if(DAT & 0x80) //先寫數據最高位
- DIN = 1; //寫1
- else
- DIN = 0; //寫0
- DCLK = 1; //拉高時鐘,讓從位機讀取DIN
- DAT <<=1;
- }
- }
- /*========================================
- 函數 :ReadByte()
- 參數 :無
- 返回值 :返回讀出的數據
- =========================================*/
- uint SPI_Read()
- {
- uchar i;
- uint DAT;
- for(i=0;i<12;i++) //分別讀12次,每次讀一位
- {
- DAT <<=1; //數據左移一位,準備接收一位
- DCLK = 1; //拉高時鐘總線,讀取SDA上的數據
- DCLK = 0; //拉低時鐘總線,允許從機控制SDA變化
- if(DOUT)
- DAT |= 0x01; //為1則寫1,否則不執行寫1,通過左移補零
- }
- return(DAT); //返回讀出的數據
- }
- /*=======================================
- 返回值 :AD轉出的數字量
- 描述 :讀指定通道的輸入的模擬量轉為數字量
- ========================================*/
- uint ReadAD(uchar cmd)
- {
- uint DAT;
- CS = 0;
- SPI_Write(cmd);
- DCLK = 0; //拉低時鐘總線
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- DAT = SPI_Read();
- CS = 1;
- return(DAT); //返回讀出數據
- }
- /********************************************************************
- * 名稱 : LCD1602_write(uchar order,dat)
- * 功能 : 1602寫如數據函數
- * 輸入 : 輸入的命令值
- * 輸出 : 無
- ***********************************************************************/
- void LCD1602_write(uchar order,dat) //1602 一個字節 處理
- {
- LCD1602_e=0;
- LCD1602_rs=order;
- LCD1602_dat=dat;
- LCD1602_rw=0;
- LCD1602_e=1;
- delay(1);
- LCD1602_e=0;
- }
- /********************************************************************
- * 名稱 : LCD1602_writebye(uchar *prointer)
- * 功能 : 1602寫入數據函數 指針式
- * 輸入 : 輸入的命令值
- ***********************************************************************/
- void LCD1602_writebyte(uchar *prointer) //1602 字符串 處理
- {
- while(*prointer!='\0')
- {
- LCD1602_write(1,*prointer);
- prointer++;
- }
- }
- /********************************************************************
- * 名稱 : LCD1602_cls()
- * 功能 : 初始化1602液晶
- ***********************************************************************/
- void LCD1602_cls() //1602 初始化
- {
- LCD1602_write(0,0x01); //1602 清屏 指令
- delay(1500);
- LCD1602_write(0,0x38); // 功能設置 8位、5*7點陣
- delay(1500);
- LCD1602_write(0,0x0c); //設置 光標 不顯示開關、不顯示光標、字符不閃爍
- LCD1602_write(0,0x06);
- LCD1602_write(0,0xd0);
- delay(1500);
- }
- /********************************************************************
- * 名稱 : show()
- * 功能 : LCD1602液晶顯示程序
- ***********************************************************************/
- void show() //顯示數據
- {
- LCD1602_write(0,0x80); //顯示位置設定
- {
- LCD1602_write(1,0x30+temp/1000%10);
- LCD1602_write(1,0x30+temp/100%10);
- LCD1602_write(1,0x30+temp/10%10);
- }
- LCD1602_write(1,0xdf);
- LCD1602_writebyte("C ");
- }
- /********************************************************************
- * 名稱 : float TempCalculate(float Rx,float B,float Revise,float BasicRx)
- * 功能 : 根據當前熱敏電阻的阻值、以及參數、通過Sin曲線求出當前系統的溫度值 并返回浮點型的溫度值
- ***********************************************************************/
- float TempCalculate(float Rx,float B,float Revise,float BasicRx)
- {
- /*
- Rx: 熱敏電阻當前阻值
- B: 熱敏電阻參數B值
- Revise: 校正溫度
- BasicRx: 熱敏電阻25度時電阻(標稱電阻數值)
- 返回: 攝氏度
- */
- Rx = Rx / BasicRx;
- Rx = log(Rx);
- Rx = (Rx) / B;
- Rx = Rx + 0.003356;
- Rx = 1 / Rx;
- Rx = Rx - 273.13;
- Rx = Rx + Revise;
- return Rx;
- }
- /********************************************************************
- * 名稱 : void main()
- * 功能 : 系統主程序
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void main()
- {
- float Rad; //生成運算暫存變量
- LCD1602_cls(); //LCD1602初始化程序調用
- while(1)
- {
- zhi=(float)ReadAD(AD_CH3)/819.0; //計算電壓值
- Rad=zhi/((5.0-zhi)/10000.0); //計算熱敏電阻當前阻值
- temp=(int)((temp * 0.5) + (TempCalculate(Rad,3950.0,0,10000.0) * 0.5)*10);//求出當前系統的當前溫度
- show(); //顯示函數
- }
- }
復制代碼
段碼屏程序(不能顯示對應的溫度):
- #include <reg52.h>
- //#include <intrins.h> //為了使用NOP
- #define NOP _nop_()
- #define uchar unsigned char
- #define uint unsigned int
- #define ComMode 0x52 //4COM,1/3bias 1000 010 1001 0
- #define RCosc 0x30 //內部RC振蕩器(上電默認)1000 0011 0000
- #define LCD_on 0x06 //打開LCD顯示 偏壓發生器1000 0000 0 11 0
- #define LCD_off 0x04 //關閉LCD顯示(上電默認)
- #define Sys_en 0x02 //系統振蕩器開 1000 0000 0010
- #define Ctrl_cmd 0x80 //寫控制命令 1000
- #define Data_cmd 0xa0 //寫數據命令 1010
- //定義HT1621端口
- #define SEG_NUM 27 //段碼數字個數,即Seg數量/2
- sbit CS1=P1^0;
- sbit WR1=P1^1;
- sbit DATA1=P1^2;
- /**-------------------------------------------------------------------------
- Name: SendBit_1621(送數據程序)
- ---------------------------------------------------------------------------*/
- void SendBit_1621(uchar sdata,uchar cnt) //sdata 的高cnt 位寫入HT1621,高位在前
- {
- uchar i;
- for(i=0;i<cnt;i++)
- {
- WR1=0;
- if(sdata&0x80) DATA1=1;
- else DATA1=0;
- WR1=1;
- sdata<<=1;
- }
- }
- /**-------------------------------------------------------------------------
- Name: SendCmd(送命令)
- ---------------------------------------------------------------------------*/
- void SendCmd_1621(uchar command)
- {
- CS1=0;
- SendBit_1621(0x80,4); //寫入標志碼“100”和9 位command 命令,由于
- SendBit_1621(command,8); //沒有使有到更改時鐘輸出等命令,為了編程方便
- CS1=1; //直接將command 的最高位寫“0”
- }
- /**-------------------------------------------------------------------------
- Name: Write_1621(送數據和命令程序)
- ---------------------------------------------------------------------------*/
- void Write_1621(uchar addr,uchar sdata,uchar len)
- {
- addr<<=2;
- CS1=0;
- SendBit_1621(0xa0,3); //寫入標志碼“101”
- SendBit_1621(addr,6); //寫入addr 的高6位
- SendBit_1621(sdata,len); //寫入data 的高len位
- CS1=1;
- }
- /**-------------------------------------------------------------------------
- Name: all_off(清除1621顯示)
- ---------------------------------------------------------------------------*/
- void HT1621_all_off(void)
- {
- uchar i;
- uchar addr=0;
- for(i=0;i<SEG_NUM;i++)
- {
- Write_1621(addr,0x00,8);
- addr+=2;
- }
- }
- /**-------------------------------------------------------------------------
- Name: Init_1621(初始化1621)
- -------------------------------------------------------------------------*/
- void Init_1621(void)
- {
- SendCmd_1621(Sys_en);
- SendCmd_1621(RCosc);
- SendCmd_1621(ComMode);
- SendCmd_1621(LCD_on);
- }
- 主程序:
- #include<reg52.h> //頭文件
- #include<intrins.h>
- #include "math.h"
- #include "HT1621.h"
- #define uchar unsigned char //宏定義
- #define uint unsigned int //宏定義
- sbit DIN = P2^0; //串行數據輸入端
- sbit DCLK = P2^1; //I/O時鐘輸入
- sbit DOUT = P2^5; //串行數據輸出端
- sbit CS = P3^7; //片選腳IO
- uchar code tab1[10]= {0xF0,0x00,0xD0,0x90,0x20,0xB0,0xF0,0x10,0xF0,0xB0};
- uchar code tab2[10]= {0xA0,0xA0,0x60,0xE0,0xE0,0xC0,0xC0,0xA0,0xE0,0xE0};
- #define AD_CH3 0xe4
- float zhi; //暫存讀取的輸入變量
- int temp; //讀取熱敏溫度計的溫度數據
- void delay(uint T) //系統延時程序
- {
- while(T--);
- }
- /*=========================================
- 函數 :SPI_Write(uchar DAT)
- 參數 :DAT需要發送的數據
- 返回值 :無
- 描述 :發送一個字節數據
- ==========================================*/
- void SPI_Write(uchar DAT)
- {
- uchar i;
- for(i=0;i<8;i++) //分別寫8次,每次寫一位
- {
- DCLK = 0; //拉低時鐘總,允許DIN變化
- if(DAT & 0x80) //先寫數據最高位
- DIN = 1; //寫1
- else
- DIN = 0; //寫0
- DCLK = 1; //拉高時鐘,讓從位機讀取DIN
- DAT <<=1;
- }
- }
- /*========================================
- 函數 :ReadByte()
- 參數 :無
- 返回值 :返回讀出的數據
- =========================================*/
- uint SPI_Read()
- {
- uchar i;
- uint DAT;
- for(i=0;i<12;i++) //分別讀12次,每次讀一位
- {
- DAT <<=1; //數據左移一位,準備接收一位
- DCLK = 1; //拉高時鐘總線,讀取SDA上的數據
- DCLK = 0; //拉低時鐘總線,允許從機控制SDA變化
- if(DOUT)
- DAT |= 0x01; //為1則寫1,否則不執行寫1,通過左移補零
- }
- return(DAT); //返回讀出的數據
- }
- /*=======================================
- 函數 :PCF8591Read(uchar cmd)
- 參數 :cmd XPT2046控制字節
- 返回值 :AD轉出的數字量
- 描述 :讀指定通道的輸入的模擬量轉為數字量
- ========================================*/
- uint ReadAD(uchar cmd)
- {
- uint DAT;
- CS = 0;
- SPI_Write(cmd);
- DCLK = 0; //拉低時鐘總線
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- DAT = SPI_Read();
- CS = 1;
- return(DAT); //返回讀出數據
- }
- /********************************************************************
- * 名稱 : show()
- * 功能 : 液晶段碼屏顯示程序
- ***********************************************************************/
- void show() //顯示數據
- {
- Write_1621(15,tab1[temp/100],4);
- Write_1621(16,tab2[temp/100],4);
- Write_1621(17,tab1[temp/10%10],4);
- Write_1621(18,tab2[temp/10%10],4);
- Write_1621(19,tab1[temp%10],4);
- Write_1621(20,tab2[temp%10],4);
- }
- /********************************************************************
- * 名稱 : float TempCalculate(float Rx,float B,float Revise,float BasicRx)
- * 功能 : 根據當前熱敏電阻的阻值、以及參數、通過Sin曲線求出當前系統的溫度值 并返回浮點型的溫度值***********************************************************************/
- float TempCalculate(float Rx,float B,float Revise,float BasicRx)
- {
- /*
- Rx: 熱敏電阻當前阻值
- B: 熱敏電阻參數B值
- Revise: 校正溫度
- BasicRx: 熱敏電阻25度時電阻(標稱電阻數值)
- 返回: 攝氏度
- */
- Rx = Rx / BasicRx;
- Rx = log(Rx);
- Rx = (Rx) / B;
- Rx = Rx + 0.003356;
- Rx = 1 / Rx;
- Rx = Rx - 273.13;
- Rx = Rx + Revise;
- return Rx;
- }
- /********************************************************************
- * 名稱 : void main()
- * 功能 : 系統主程序
- ***********************************************************************/
- void main()
- {
- float Rad; //生成運算暫存變量
- Init_1621();
- HT1621_all_off();
- while(1)
- {
- zhi=(float)ReadAD(AD_CH3)/819.0; //計算電壓值
- Rad=zhi/((5.0-zhi)/10000.0); //計算熱敏電阻當前阻值
- temp=(int)((temp * 0.5) + (TempCalculate(Rad,3950.0,0,10000.0) * 0.5)*10);//求出當前系統的當前溫度
- show(); //顯示函數
- }
- }
復制代碼
|