标题:
AD tlc2543+12864电压表单片机程序
[打印本页]
作者:
艰难018jin
时间:
2019-5-4 19:10
标题:
AD tlc2543+12864电压表单片机程序
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
作者:
归墟小兽
时间:
2019-5-8 01:54
数据稳定吗
作者:
583703056A
时间:
2019-6-5 12:32
这个有验证过哦?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1