📄 8952_cpld.c
字号:
#include <AT89X51.H>
#include <math.h>
#include <intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar reg[100];
/************************************************************
LCD引脚与变量定义
*************************************************************/
#define RS P1_5
#define RW P1_6
#define E P1_7
#define flag P1_2
#define RD XBYTE[0xff5f] //读操作
#define WR XBYTE[0xff7f] //写操作
uchar com,dat; //全局变量写控制字和数据
/************************************************************
LCD函数函数声明
*************************************************************/
void delay50us(uchar time);
void initialization(void);
void chk_busy(void);
void writecom(uchar com);
void writedat(uchar dat);
void initi_chinese(void);
void Char_Set_XY(uchar x, uchar y, uchar *p);
void Delay(uint ms);
/************************************************************
主函数
*************************************************************/
void main(void)
{
uchar d1,d2;
uint d3;
unsigned long dat;
initi_chinese();
Delay(2000);
Char_Set_XY(0,0,"读取数据为:");
writecom(0x01); //写指令:清除显示
while(flag==0);
d1=RD; //高八位数据
d2=RD; //低二位数据
d3=d1*4+d2; //十位数据
dat=(unsigned long)(d3*50000/1023);
writecom(0x9e); //数据显示
writedat((dat/10000)+0x30);
writedat(0x2e);
writedat((dat/1000%10)+0x30);
writedat((dat/100%10)+0x30);
writedat((dat/10%10)+0x30);
writedat((dat%10)+0x30);
//while(1); //程序停在此处
}
/*=========================LCD程序区===========================
/************************************************************
延时函数1:延时50us
*************************************************************/
void delay50us(uchar time)
{
uchar i,j;
for(i=0;i<time;i++)
for(j=0;j<10;j++); //50us
}
/*************************************************
延时函数2:延时ms毫秒
*************************************************/
void Delay(uint ms)
{
uint j;
for(; ms>0; ms--)
for(j=100; j>0; j--)
{
_nop_();
_nop_();
}
}
/************************************************************
测忙函数
*************************************************************/
void chk_busy(void)
{
uchar sign;
RS=0;
RW=1;
E=1;
for(;;)
{ P0=0xff; //P1口置高,准备读数
E=1;
sign=P0; //读忙信号
E=0; //产生一个下降延
if(sign<0x80) //不忙则跳出循环
break;
}
E=0;
}
/************************************************************
写控制字
*************************************************************/
void writecom(uchar com)
{
chk_busy();
RS=0;
RW=0; //写数据
P0=com;
E=1;
E=0;
}
/************************************************************
写数据与地址
*************************************************************/
void writedat(uchar dat)
{
chk_busy();
RS=1;
RW=0; //写数据
P0=dat;
E=1;
E=0;
}
/************************************************************
初始化写汉字程序
*************************************************************/
void initi_chinese(void)
{
writecom(0x30); //写指令:功能设置 8位数据,基本指令
writecom(0x0c); //写指令:显示状态 ON,游标OFF,反白OFF
writecom(0x01); //写指令:清除显示
writecom(0x02); //写指令:地址归位
writecom(0x80); //写指令:设置DDRAM地址
delay50us(200); //10ms
}
/*************************************************
置x,y坐标函数___写汉字
*************************************************/
void Char_Set_XY(uchar x, uchar y, uchar *p)
{
if(y == 0)
writecom((0x80+x));
if(y == 1)
writecom((0x90+x));
if(y == 2)
writecom((0x88+x));
if(y == 3)
writecom((0x98+x));
while(*p != 0)
writedat(*p++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -