找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3214|回复: 2
收起左侧

AD tlc2543+12864电压表单片机程序

[复制链接]
ID:467275 发表于 2019-5-4 19:10 | 显示全部楼层 |阅读模式
tlc2543  12位AD 12864制作电压表

单片机源程序如下:
  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时钟*/
  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 //用于检测LCD状态字中的Busy标识
  17. unsigned char code a[]={"0123456789 :.-"};
  18. /********函数声明*************************************************************/
  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. /********数据定义*************************************************************/
  33. code unsigned char  uctech[] = {"创新实验室   "};
  34. code unsigned char  net[] = {"AD测试程序  "};
  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;//通道号左移4位
  43. for(i=0;i<12;i++)//没有设置控制字,默认输出数据为12位,高位先送出,输出数据的格式为2进制
  44. {
  45.   if(D_OUT) ad|=0x01;//转换后的值高位先送出
  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;//循环中多左移了一位
  56. return ad;
  57. }

  58. /***********主函数开始********************************************************/
  59. void main(void)
  60. {        uint ad=0;
  61. //        Delay400Ms();         //启动等待,等LCD讲入工作状态
  62.         LCDInit();                 //LCD初始化
  63.         Delay5Ms();         //延时片刻(可不要)
  64.         while(1){
  65.             ad=read2543(1);
  66.                 ad=ad*1.0/8;
  67.                 DisplayListChar(0,1,uctech);        //显示字库中的中文数字
  68.                 DisplayListChar(0,2,net);                //显示字库中的中文数字
  69.                 DisplayListChar(0,3,mcu);                //显示字库中的中文
  70.                 DisplayListChar(0,4,qq);                //显示字库中的中文数字

  71.         DisplayOneChar(7,4,a[ad%10]);                //显示字库中的中文数字
  72.                 DisplayOneChar(6,4,a[ad%100/10]);                //显示字库中的中文数字
  73.         DisplayOneChar(5,4,a[12]);                //显示字库中的中文数字
  74.         DisplayOneChar(4,4,a[ad/100%10]);                //显示字库中的中文数字
  75.                 DisplayOneChar(3,4,a[ad/1000]);                //显示字库中的中文数字

  76.         }


  77. }

  78. /***********写数据********************************************************/
  79. void WriteDataLCD(unsigned char WDLCD)
  80. {
  81.         ReadStatusLCD(); //检测忙
  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. /***********写指令********************************************************/
  91. void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
  92. {
  93.         if (BuysC) ReadStatusLCD(); //根据需要检测忙
  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. /***********读数据********************************************************/
  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. /***********读状态*******************************************************/
  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); //检测忙信号       
  123.         LCD_E = 0;
  124.         return(1);
  125. }

  126. /***********初始化********************************************************/
  127. void LCDInit(void)
  128. {
  129.         WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
  130.         WriteCommandLCD(0x01,1); //显示清屏
  131.         WriteCommandLCD(0x06,1); // 显示光标移动设置
  132.         WriteCommandLCD(0x0C,1); // 显示开及光标设置
  133. }

  134. /***********清屏********************************************************/       
  135. void LCDClear(void)
  136. {
  137.         WriteCommandLCD(0x01,1); //显示清屏
  138.         WriteCommandLCD(0x34,1); // 显示光标移动设置
  139.         WriteCommandLCD(0x30,1); // 显示开及光标设置
  140. }

  141. /***********闪烁效果********************************************************/
  142. void LCDFlash(void)
  143. {
  144.         WriteCommandLCD(0x08,1); //显示清屏
  145.         Delay400Ms();
  146.         WriteCommandLCD(0x0c,1); // 显示开及光标设置
  147.         Delay400Ms();
  148.         WriteCommandLCD(0x08,1); //显示清屏
  149.         Delay400Ms();
  150.         WriteCommandLCD(0x0c,1); // 显示开及光标设置
  151.         Delay400Ms();
  152.         WriteCommandLCD(0x08,1); //显示清屏
  153.         Delay400Ms();
  154. }

  155. /***********按指定位置显示一个字符*******************************************/       
  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); //这里不检测忙信号,发送地址码
  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之内
  183.         switch(Y){
  184.         case 1:X2|=0X80;break;        //根据行数来选择相应地址
  185.         case 2:X2|=0X90;break;
  186.         case 3:X2|=0X88;break;
  187.         case 4:X2|=0X98;break;
  188.         }
  189.         WriteCommandLCD(X2, 1);         //发送地址码
  190.           while (DData[ListLength]>=0x20){ //若到达字串尾则退出
  191.                    if (X <= 0x0F){                         //X坐标应小于0xF
  192.                      WriteDataLCD(DData[ListLength]);
  193.                      ListLength++;
  194.                          X++;
  195.                          delay(10);
  196.             }
  197.           }
  198. }


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

  205. /***********长延时********************************************************/
  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. }
复制代码

所有资料51hei提供下载:
119128631ADtlc2543P12864.zip (33.83 KB, 下载次数: 61)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:464705 发表于 2019-5-8 01:54 来自手机 | 显示全部楼层
数据稳定吗
回复

使用道具 举报

ID:82419 发表于 2019-6-5 12:32 来自手机 | 显示全部楼层
这个有验证过哦?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表