找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3661|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

AD tlc2543+12864電壓表單片機(jī)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:467275 發(fā)表于 2019-5-4 19:10 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
tlc2543  12位AD 12864制作電壓表

單片機(jī)源程序如下:
  1. #include "reg51.h"
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. /********IO引腳定義****************************************/
  6. sbit LCD_RS=P2^3;
  7. sbit LCD_RW=P2^4;
  8. sbit LCD_E=P2^5;
  9. sbit PSB =P2^6;                //PSB腳為12864-12系列的串、并通訊功能切換,我們使用8位并行接口,PSB=1

  10. sbit CLOCK=P1^0; /*2543時(shí)鐘*/
  11. sbit D_IN=P1^1; /*2543輸入*/
  12. sbit D_OUT=P1^2; /*2543輸出*/
  13. sbit _CS=P1^3; /*2543片選*/
  14. /********宏定義***********************************************************/
  15. #define LCD_Data P0
  16. #define Busy    0x80 //用于檢測(cè)LCD狀態(tài)字中的Busy標(biāo)識(shí)
  17. unsigned char code a[]={"0123456789 :.-"};
  18. /********函數(shù)聲明*************************************************************/
  19. void WriteDataLCD(unsigned char WDLCD);
  20. void WriteCommandLCD(unsigned char WCLCD,BuysC);
  21. unsigned char ReadDataLCD(void);
  22. unsigned char ReadStatusLCD(void);
  23. void LCDInit(void);
  24. void LCDClear(void);
  25. void LCDFlash(void);
  26. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  27. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  28. void DisplayImage (unsigned char code *DData);
  29. void Delay5Ms(void);
  30. void Delay400Ms(void);
  31. void delay(uchar n);

  32. /********數(shù)據(jù)定義*************************************************************/
  33. code unsigned char  uctech[] = {"創(chuàng)新實(shí)驗(yàn)室   "};
  34. code unsigned char  net[] = {"AD測(cè)試程序  "};
  35. code unsigned char  mcu[] = {"選擇通道:1 "};
  36. code unsigned char  qq[] = {"電壓:  "};

  37. uint read2543(uchar port)
  38. {
  39. uint ad=0,i;
  40. CLOCK=0;
  41. _CS=0;
  42. port<<=4;//通道號(hào)左移4位
  43. for(i=0;i<12;i++)//沒(méi)有設(shè)置控制字,默認(rèn)輸出數(shù)據(jù)為12位,高位先送出,輸出數(shù)據(jù)的格式為2進(jìn)制
  44. {
  45.   if(D_OUT) ad|=0x01;//轉(zhuǎn)換后的值高位先送出
  46.   D_IN=(bit)(port&0x80);//通道值高位先送出
  47.   CLOCK=1;
  48.   delay(1);
  49.   CLOCK=0;
  50.   delay(1);
  51.   port<<=1;
  52.   ad<<=1;
  53. }
  54. _CS=1;
  55. ad>>=1;//循環(huán)中多左移了一位
  56. return ad;
  57. }

  58. /***********主函數(shù)開(kāi)始********************************************************/
  59. void main(void)
  60. {        uint ad=0;
  61. //        Delay400Ms();         //啟動(dòng)等待,等LCD講入工作狀態(tài)
  62.         LCDInit();                 //LCD初始化
  63.         Delay5Ms();         //延時(shí)片刻(可不要)
  64.         while(1){
  65.             ad=read2543(1);
  66.                 ad=ad*1.0/8;
  67.                 DisplayListChar(0,1,uctech);        //顯示字庫(kù)中的中文數(shù)字
  68.                 DisplayListChar(0,2,net);                //顯示字庫(kù)中的中文數(shù)字
  69.                 DisplayListChar(0,3,mcu);                //顯示字庫(kù)中的中文
  70.                 DisplayListChar(0,4,qq);                //顯示字庫(kù)中的中文數(shù)字

  71.         DisplayOneChar(7,4,a[ad%10]);                //顯示字庫(kù)中的中文數(shù)字
  72.                 DisplayOneChar(6,4,a[ad%100/10]);                //顯示字庫(kù)中的中文數(shù)字
  73.         DisplayOneChar(5,4,a[12]);                //顯示字庫(kù)中的中文數(shù)字
  74.         DisplayOneChar(4,4,a[ad/100%10]);                //顯示字庫(kù)中的中文數(shù)字
  75.                 DisplayOneChar(3,4,a[ad/1000]);                //顯示字庫(kù)中的中文數(shù)字

  76.         }


  77. }

  78. /***********寫(xiě)數(shù)據(jù)********************************************************/
  79. void WriteDataLCD(unsigned char WDLCD)
  80. {
  81.         ReadStatusLCD(); //檢測(cè)忙
  82.         LCD_RS = 1;
  83.         LCD_RW = 0;
  84.         LCD_Data = WDLCD;
  85.         LCD_E = 1;
  86.         LCD_E = 1;
  87.         LCD_E = 1;
  88.         LCD_E = 0;
  89. }

  90. /***********寫(xiě)指令********************************************************/
  91. void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC為0時(shí)忽略忙檢測(cè)
  92. {
  93.         if (BuysC) ReadStatusLCD(); //根據(jù)需要檢測(cè)忙
  94.         LCD_RS = 0;
  95.         LCD_RW = 0;
  96.         LCD_Data = WCLCD;
  97.         LCD_E = 1;
  98.         LCD_E = 1;
  99.         LCD_E = 1;
  100.         LCD_E = 0;  
  101. }

  102. /***********讀數(shù)據(jù)********************************************************/
  103. unsigned char ReadDataLCD(void)
  104. {
  105.         unsigned char LCDDA;
  106.         LCD_RS = 1;
  107.         LCD_RW = 1;
  108.         LCD_E = 1;
  109.         LCD_E = 1;
  110.         LCDDA=LCD_Data;
  111.         LCD_E = 0;
  112.         return(LCDDA);
  113. }

  114. /***********讀狀態(tài)*******************************************************/
  115. unsigned char ReadStatusLCD(void)
  116. {
  117.         LCD_Data = 0xFF;
  118.         LCD_RS = 0;
  119.         LCD_RW = 1;
  120.         LCD_E = 1;
  121.         LCD_E = 1;
  122.         while (LCD_Data & Busy); //檢測(cè)忙信號(hào)       
  123.         LCD_E = 0;
  124.         return(1);
  125. }

  126. /***********初始化********************************************************/
  127. void LCDInit(void)
  128. {
  129.         WriteCommandLCD(0x30,1); //顯示模式設(shè)置,開(kāi)始要求每次檢測(cè)忙信號(hào)
  130.         WriteCommandLCD(0x01,1); //顯示清屏
  131.         WriteCommandLCD(0x06,1); // 顯示光標(biāo)移動(dòng)設(shè)置
  132.         WriteCommandLCD(0x0C,1); // 顯示開(kāi)及光標(biāo)設(shè)置
  133. }

  134. /***********清屏********************************************************/       
  135. void LCDClear(void)
  136. {
  137.         WriteCommandLCD(0x01,1); //顯示清屏
  138.         WriteCommandLCD(0x34,1); // 顯示光標(biāo)移動(dòng)設(shè)置
  139.         WriteCommandLCD(0x30,1); // 顯示開(kāi)及光標(biāo)設(shè)置
  140. }

  141. /***********閃爍效果********************************************************/
  142. void LCDFlash(void)
  143. {
  144.         WriteCommandLCD(0x08,1); //顯示清屏
  145.         Delay400Ms();
  146.         WriteCommandLCD(0x0c,1); // 顯示開(kāi)及光標(biāo)設(shè)置
  147.         Delay400Ms();
  148.         WriteCommandLCD(0x08,1); //顯示清屏
  149.         Delay400Ms();
  150.         WriteCommandLCD(0x0c,1); // 顯示開(kāi)及光標(biāo)設(shè)置
  151.         Delay400Ms();
  152.         WriteCommandLCD(0x08,1); //顯示清屏
  153.         Delay400Ms();
  154. }

  155. /***********按指定位置顯示一個(gè)字符*******************************************/       
  156. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  157. {
  158.         if(Y<1)
  159.                 Y=1;
  160.         if(Y>4)
  161.                 Y=4;
  162.         X &= 0x0F;                         //限制X不能大于16,Y不能大于1
  163.         switch(Y){
  164.         case 1:X|=0X80;break;
  165.         case 2:X|=0X90;break;
  166.         case 3:X|=0X88;break;
  167.         case 4:X|=0X98;break;
  168.         }
  169.         WriteCommandLCD(X, 0); //這里不檢測(cè)忙信號(hào),發(fā)送地址碼
  170.         WriteDataLCD(DData);
  171. }

  172. /***********按指定位置顯示一串字符*****************************************/
  173. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  174. {
  175.         unsigned char ListLength,X2;
  176.         ListLength = 0;
  177.         X2=X;
  178.         if(Y<1)
  179.                 Y=1;
  180.         if(Y>4)
  181.                 Y=4;
  182.         X &= 0x0F;                                 //限制X不能大于16,Y在1-4之內(nèi)
  183.         switch(Y){
  184.         case 1:X2|=0X80;break;        //根據(jù)行數(shù)來(lái)選擇相應(yīng)地址
  185.         case 2:X2|=0X90;break;
  186.         case 3:X2|=0X88;break;
  187.         case 4:X2|=0X98;break;
  188.         }
  189.         WriteCommandLCD(X2, 1);         //發(fā)送地址碼
  190.           while (DData[ListLength]>=0x20){ //若到達(dá)字串尾則退出
  191.                    if (X <= 0x0F){                         //X坐標(biāo)應(yīng)小于0xF
  192.                      WriteDataLCD(DData[ListLength]);
  193.                      ListLength++;
  194.                          X++;
  195.                          delay(10);
  196.             }
  197.           }
  198. }


  199. /***********短延時(shí)********************************************************/
  200. void Delay5Ms(void)
  201. {
  202.         unsigned int TempCyc = 5552;
  203.         while(TempCyc--);
  204. }

  205. /***********長(zhǎng)延時(shí)********************************************************/
  206. void Delay400Ms(void)
  207. {
  208.         unsigned char TempCycA = 5;
  209.         unsigned int TempCycB;
  210.         while(TempCycA--){
  211.                   TempCycB=7269;
  212.                   while(TempCycB--);
  213.         }
  214. }
  215. void delay(uchar n)
  216. {
  217. uchar i;
  218. for(i=0;i<n;i++)
  219. {
  220.    _nop_();
  221. }
  222. }
復(fù)制代碼

所有資料51hei提供下載:
119128631ADtlc2543P12864.zip (33.83 KB, 下載次數(shù): 61)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:464705 發(fā)表于 2019-5-8 01:54 來(lái)自手機(jī) | 只看該作者
數(shù)據(jù)穩(wěn)定嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:82419 發(fā)表于 2019-6-5 12:32 來(lái)自手機(jī) | 只看該作者
這個(gè)有驗(yàn)證過(guò)哦?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表