tlc2543 12位AD 12864制作電壓表
單片機源程序如下:
- #include "reg51.h"
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- /********IO引腳定義****************************************/
- sbit LCD_RS=P2^3;
- sbit LCD_RW=P2^4;
- sbit LCD_E=P2^5;
- sbit PSB =P2^6; //PSB腳為12864-12系列的串、并通訊功能切換,我們使用8位并行接口,PSB=1
- sbit CLOCK=P1^0; /*2543時鐘*/
- sbit D_IN=P1^1; /*2543輸入*/
- sbit D_OUT=P1^2; /*2543輸出*/
- sbit _CS=P1^3; /*2543片選*/
- /********宏定義***********************************************************/
- #define LCD_Data P0
- #define Busy 0x80 //用于檢測LCD狀態字中的Busy標識
- unsigned char code a[]={"0123456789 :.-"};
- /********函數聲明*************************************************************/
- void WriteDataLCD(unsigned char WDLCD);
- void WriteCommandLCD(unsigned char WCLCD,BuysC);
- unsigned char ReadDataLCD(void);
- unsigned char ReadStatusLCD(void);
- void LCDInit(void);
- void LCDClear(void);
- void LCDFlash(void);
- void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
- void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
- void DisplayImage (unsigned char code *DData);
- void Delay5Ms(void);
- void Delay400Ms(void);
- void delay(uchar n);
- /********數據定義*************************************************************/
- code unsigned char uctech[] = {"創新實驗室 "};
- code unsigned char net[] = {"AD測試程序 "};
- code unsigned char mcu[] = {"選擇通道:1 "};
- code unsigned char qq[] = {"電壓: "};
- uint read2543(uchar port)
- {
- uint ad=0,i;
- CLOCK=0;
- _CS=0;
- port<<=4;//通道號左移4位
- for(i=0;i<12;i++)//沒有設置控制字,默認輸出數據為12位,高位先送出,輸出數據的格式為2進制
- {
- if(D_OUT) ad|=0x01;//轉換后的值高位先送出
- D_IN=(bit)(port&0x80);//通道值高位先送出
- CLOCK=1;
- delay(1);
- CLOCK=0;
- delay(1);
- port<<=1;
- ad<<=1;
- }
- _CS=1;
- ad>>=1;//循環中多左移了一位
- return ad;
- }
- /***********主函數開始********************************************************/
- void main(void)
- { uint ad=0;
- // Delay400Ms(); //啟動等待,等LCD講入工作狀態
- LCDInit(); //LCD初始化
- Delay5Ms(); //延時片刻(可不要)
- while(1){
- ad=read2543(1);
- ad=ad*1.0/8;
- DisplayListChar(0,1,uctech); //顯示字庫中的中文數字
- DisplayListChar(0,2,net); //顯示字庫中的中文數字
- DisplayListChar(0,3,mcu); //顯示字庫中的中文
- DisplayListChar(0,4,qq); //顯示字庫中的中文數字
- DisplayOneChar(7,4,a[ad%10]); //顯示字庫中的中文數字
- DisplayOneChar(6,4,a[ad%100/10]); //顯示字庫中的中文數字
- DisplayOneChar(5,4,a[12]); //顯示字庫中的中文數字
- DisplayOneChar(4,4,a[ad/100%10]); //顯示字庫中的中文數字
- DisplayOneChar(3,4,a[ad/1000]); //顯示字庫中的中文數字
- }
- }
- /***********寫數據********************************************************/
- void WriteDataLCD(unsigned char WDLCD)
- {
- ReadStatusLCD(); //檢測忙
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_Data = WDLCD;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 0;
- }
- /***********寫指令********************************************************/
- void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC為0時忽略忙檢測
- {
- if (BuysC) ReadStatusLCD(); //根據需要檢測忙
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_Data = WCLCD;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 0;
- }
- /***********讀數據********************************************************/
- unsigned char ReadDataLCD(void)
- {
- unsigned char LCDDA;
- LCD_RS = 1;
- LCD_RW = 1;
- LCD_E = 1;
- LCD_E = 1;
- LCDDA=LCD_Data;
- LCD_E = 0;
- return(LCDDA);
- }
- /***********讀狀態*******************************************************/
- unsigned char ReadStatusLCD(void)
- {
- LCD_Data = 0xFF;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_E = 1;
- LCD_E = 1;
- while (LCD_Data & Busy); //檢測忙信號
- LCD_E = 0;
- return(1);
- }
- /***********初始化********************************************************/
- void LCDInit(void)
- {
- WriteCommandLCD(0x30,1); //顯示模式設置,開始要求每次檢測忙信號
- WriteCommandLCD(0x01,1); //顯示清屏
- WriteCommandLCD(0x06,1); // 顯示光標移動設置
- WriteCommandLCD(0x0C,1); // 顯示開及光標設置
- }
- /***********清屏********************************************************/
- void LCDClear(void)
- {
- WriteCommandLCD(0x01,1); //顯示清屏
- WriteCommandLCD(0x34,1); // 顯示光標移動設置
- WriteCommandLCD(0x30,1); // 顯示開及光標設置
- }
- /***********閃爍效果********************************************************/
- void LCDFlash(void)
- {
- WriteCommandLCD(0x08,1); //顯示清屏
- Delay400Ms();
- WriteCommandLCD(0x0c,1); // 顯示開及光標設置
- Delay400Ms();
- WriteCommandLCD(0x08,1); //顯示清屏
- Delay400Ms();
- WriteCommandLCD(0x0c,1); // 顯示開及光標設置
- Delay400Ms();
- WriteCommandLCD(0x08,1); //顯示清屏
- Delay400Ms();
- }
- /***********按指定位置顯示一個字符*******************************************/
- void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
- {
- if(Y<1)
- Y=1;
- if(Y>4)
- Y=4;
- X &= 0x0F; //限制X不能大于16,Y不能大于1
- switch(Y){
- case 1:X|=0X80;break;
- case 2:X|=0X90;break;
- case 3:X|=0X88;break;
- case 4:X|=0X98;break;
- }
- WriteCommandLCD(X, 0); //這里不檢測忙信號,發送地址碼
- WriteDataLCD(DData);
- }
- /***********按指定位置顯示一串字符*****************************************/
- void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
- {
- unsigned char ListLength,X2;
- ListLength = 0;
- X2=X;
- if(Y<1)
- Y=1;
- if(Y>4)
- Y=4;
- X &= 0x0F; //限制X不能大于16,Y在1-4之內
- switch(Y){
- case 1:X2|=0X80;break; //根據行數來選擇相應地址
- case 2:X2|=0X90;break;
- case 3:X2|=0X88;break;
- case 4:X2|=0X98;break;
- }
- WriteCommandLCD(X2, 1); //發送地址碼
- while (DData[ListLength]>=0x20){ //若到達字串尾則退出
- if (X <= 0x0F){ //X坐標應小于0xF
- WriteDataLCD(DData[ListLength]);
- ListLength++;
- X++;
- delay(10);
- }
- }
- }
- /***********短延時********************************************************/
- void Delay5Ms(void)
- {
- unsigned int TempCyc = 5552;
- while(TempCyc--);
- }
- /***********長延時********************************************************/
- void Delay400Ms(void)
- {
- unsigned char TempCycA = 5;
- unsigned int TempCycB;
- while(TempCycA--){
- TempCycB=7269;
- while(TempCycB--);
- }
- }
- void delay(uchar n)
- {
- uchar i;
- for(i=0;i<n;i++)
- {
- _nop_();
- }
- }
復制代碼
所有資料51hei提供下載:
119128631ADtlc2543P12864.zip
(33.83 KB, 下載次數: 61)
2019-5-4 19:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|