如何实现12864显示430f149单片机AD采样的波形

如何实现12864显示430f149单片机AD采样的波形,第1张

用msp430g2553+AD电压采集+12864功率显示

提示:msp430g2553+AD10电压采集+12864功率显示做的功率表 显然包括12864驱动和AD采集

//********************************************************************

//ADC12序列通道与D12864液晶模块显示程序

//********************************************************************

#include <msp430x14x.h>

#define CPU_F ((double)8000000)

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))

#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

/*12864应用指令*/

#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H

#define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置

#define CURSE_ADD 0x06 //设定游标移到方向及图像整体右移,

#define FUN_MODE 0x30 //工作模式:8位基本指令集

#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白

#define DISPLAY_OFF 0x08 //显示关

#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1

#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH

#define SET_DD_AC 0x80

#define P50 0

#define P51 1

#define P55 5

#define P56 6

#define P57 7

#define RS_CLR P5OUT &= ~(1 <<P55)//RS置低

#define RS_SET P5OUT |= (1 <<P55) //RS置高

#define RW_CLR P5OUT &= ~(1 <<P56)//RW置低

#define RW_SET P5OUT |= (1 <<P56) //RW置高

#define EN_CLR P5OUT &= ~(1 <<P57)//E置低

#define EN_SET P5OUT |= (1 <<P57) //E置高

#define PSB_CLR P5OUT &= ~(1 <<P50)//PSB置低,串口方式

#define PSB_SET P5OUT |= (1 <<P50) //PSB置高,并口方式

#define RST_CLR P5OUT &= ~(1 <<P51)//RST置低

#define RST_SET P5OUT |= (1 <<P51) //RST置高

#define DataPort P4OUT //P4口为数据口

uint Results[32] //存放ADC的结果

uchar shuzi[] = {"0123456789.V"}

uchar ptr[6]

uint Average

uint Temp

ulong caltmp[4]

//*************************************************************************

//系统时钟初始化

//*************************************************************************

void Clock_Init()

{

uchar i

BCSCTL1&=~XT2OFF//打开XT振荡器

BCSCTL2|=SELM1+SELS //MCLK为8MHZ,SMCLK为8MHZ

do{

IFG1&=~OFIFG //清除震荡标志

for(i=0i<100i++)

_NOP() //延时等待

}

while((IFG1&OFIFG)!=0) //如果标志为1,则继续循环等待

IFG1&=~OFIFG

}

//*************************************************************************

// MSP430内部看门狗初始化

//*************************************************************************

void WDT_Init()

{

WDTCTL = WDTPW + WDTHOLD //关闭看门狗

}

//*************************************************************************

// 初始化IO口子程序

//*************************************************************************

void Port_init()

{

P4SEL = 0x00

P4DIR = 0xFF

P5SEL = 0x00

P5DIR|= BIT0 + BIT1 + BIT5 + BIT6 + BIT7

PSB_SET //液晶并口方式

RST_SET //复位脚RST置高

}

//***********************************************************************

// 显示屏命令写入函数

//***********************************************************************

void LCD_write_com(unsigned char com)

{

RS_CLR

RW_CLR

EN_SET

DataPort = com

delay_ms(5)

EN_CLR

}

//***********************************************************************

// 显示屏数据写入函数

//***********************************************************************

void LCD_write_data(unsigned char data)

{

RS_SET

RW_CLR

EN_SET

DataPort = data

delay_ms(5)

EN_CLR

}

//***********************************************************************

// 显示屏清空显示

//***********************************************************************

void LCD_clear(void)

{

LCD_write_com(0x01)

delay_ms(5)

}

//***********************************************************************

//函数名称:DisplayCgrom(uchar hz)显示CGROM里的汉字

//***********************************************************************

void DisplayCgrom(uchar addr,uchar *hz)

{

LCD_write_com(addr)

delay_ms(5)

while(*hz != '\0')

{

LCD_write_data(*hz)

hz++

delay_ms(5)

}

}

//****************************************************************

// 显示屏初始化函数

//***********************************************************************

void LCD_init(void)

{

LCD_write_com(FUN_MODE) //显示模式设置

delay_ms(5)

LCD_write_com(FUN_MODE) //显示模式设置

delay_ms(5)

LCD_write_com(DISPLAY_ON) //显示开

delay_ms(5)

LCD_write_com(CLEAR_SCREEN) //清屏

delay_ms(5)

}

//*****************************************************************

//*****************************************************************

/*打开ADC*/

void ADC12(void)

{

P6SEL |=0X0f //使能ADC通道

ADC12CTL0=ADC12ON+SHT0_15+MSC//打开ADC,设置采样时间,多次转换

ADC12CTL1=SHP+CONSEQ_3//使用采样定时器多通道转换

ADC12MCTL0 |=INCH_0//通道选择

ADC12MCTL1 |=INCH_1

ADC12MCTL2 |=INCH_2

ADC12MCTL3 |=INCH_10+EOS//以EOS结束此次转换

ADC12IE=0X0F//使能ADC中断

ADC12CTL0 |=ENC+ADC12SC//使能转换开始转换

_EINT()

}

/*ADC中断服务函数,各个通道转换值的存储*/

#pragma vector=ADC_VECTOR

__interrupt void ADC12ISR(void)

{

caltmp[0]=ADC12MEM0

caltmp[1]=ADC12MEM1

caltmp[2]=ADC12MEM2

caltmp[3]=ADC12MEM3

}

//************************************************************************

void xian_shi(void)

{

int i,j,k,l

Temp=(caltmp[0]*3300)/4095//计算十进制的电压值

ptr[0]=Temp/1000

ptr[2]=Temp%1000/100

ptr[3]=Temp%100/10

ptr[4]=Temp%10

ptr[5]=11

ptr[1]=10

LCD_write_com(0x80)

DisplayCgrom(0x80,"一通道电压")

for(i=0i<6i++)

{

delay_ms(10)

LCD_write_data(shuzi[ptr])

}

Temp=(caltmp[1]*3300)/4095

ptr[0]=Temp/1000

ptr[2]=Temp%1000/100

ptr[3]=Temp%100/10

ptr[4]=Temp%10

ptr[5]=11

ptr[1]=10

LCD_write_com(0x90)

DisplayCgrom(0x90,"二通道电压")

for(j=0j<6j++)

{

delay_ms(10)

LCD_write_data(shuzi[ptr[j]])

}

Temp=(caltmp[2]*3300)/4095

ptr[0]=Temp/1000

ptr[2]=Temp%1000/100

ptr[3]=Temp%100/10

ptr[4]=Temp%10

ptr[5]=11

ptr[1]=10

LCD_write_com(0x88)

DisplayCgrom(0x88,"三通道电压")

for(k=0k<6k++)

{

delay_ms(10)

LCD_write_data(shuzi[ptr[k]])

}

Temp=(caltmp[3]*3300)/4095

ptr[0]=Temp/1000

ptr[2]=Temp%1000/100

ptr[3]=Temp%100/10

ptr[4]=Temp%10

ptr[5]=11

ptr[1]=10

LCD_write_com(0x98)

DisplayCgrom(0x98,"四通道电压")

for(l=0l<6l++)

{

delay_ms(10)

LCD_write_data(shuzi[ptr[l]])

}

}

//***********************************************************************

// 主程序

//***********************************************************************

void main(void)

{

WDT_Init() //看门狗设置

Clock_Init()//系统时钟设置

Port_init() //系统初始化,设置IO口属性

delay_ms(100) //延时100ms

LCD_init() //液晶参数初始化设置

LCD_clear()//清屏

delay_ms(100)

while(1)

{

ADC12()

delay_ms(10)

xian_shi()

}

}

RST EQU P2.0

CS2 EQU P2.1

CS1 EQU P2.2

E EQU P2.3

RWEQU P2.4

DIEQU P2.5

*****************************************************

ORG 0000H

LJMP MAIN

*****************************************************

ORG 0050H

MAIN:

MOV SP,#60H

LCALL CHUSH

*****************************************************

NIEXIAO:

LCALL YEXIAN

LJMP NIEXIAO

*****************************************************

YEXIAN:

MOV DPTR,#TAB

SETB CS1

CLR CS2

MOV A,#0C0H

LCALL WING

SETB CS2

CLR CS1

MOV A,#0C0H

LCALL WING

MOV R7,#08

MOV R6,#0B8H

TU1:

SETB CS1

CLR CS2

MOV A,R6

LCALL WING

MOV A,#40H

LCALL WING

MOV R5,#64

TU2:

MOV A,#00H

MOVC A,@A+DPTR

LCALL DING

INC DPTR

DJNZ R5,TU2

TU3:

SETB CS2

CLR CS1

MOV A,R6

LCALL WING

MOV A,#40H

LCALL WING

MOV R5,#64

TU4:

MOV A,#00H

MOVC A,@A+DPTR

LCALL DING

INC DPTR

DJNZ R5,TU4

INC R6

DJNZ R7,TU1

RET

*****************************************************

WING:

LCALL BUSY

CLR E

CLR RW

CLR DI

MOV P0,A

SETB E

CLR E

RET

*****************************************************

DING:

LCALL BUSY

CLR E

CLR RW

SETB DI

MOV P0,A

SETB E

CLR E

RET

*****************************************************

BUSY:

CLR E

SETB RW

CLR DI

MOV P0,#0FFH

SETB E

JB P0.7,BUSY

CLR E

RET

*****************************************************

CLEAR:

MOV A,#3FH

LCALL WING

MOV R7,#08

MOV R6,#0B8H

CLE1:

MOV A,R6

LCALL WING

MOV A,#40H

LCALL WING

MOV R5,#64

CLE2:

MOV A,#00H

LCALL DING

DJNZ R5,CLE2

INC R6

DJNZ R7,CLE1

RET

*****************************************************

CHUSH:

CLR RST

MOV R0,#250

DJNZ R0,$

SETB RST

SETB CS1

CLR CS2

LCALL CLEAR

SETB CS2

CLR CS1

LCALL CLEAR

RET

*****************************************************

TAB:-- 调入了一幅图像:C:\Documents and Settings\Administrator\桌面\波形.bmp --

-- 宽度x高度=128x64 --

END

波形用画图画个然后用取模软件就可以咯

#include <reg52.h>

#include <intrins.h>

#include <math.h>

//------------定义接口-------------//

sbit RS=P2^5

sbit RW=P2^6

sbit E=P2^7

sbit RES=P2^1

#define Lcd_Bus P1

// P1 接 LCM

#define uchar unsigned char

#define FIRST_ADDR 0

//定义字符/汉字显示起始位置

/*------------------检查忙位-----------------------------*/

void chk_busy()

{

RS=0

RW=1

E=1

Lcd_Bus=0xff

while((Lcd_Bus&0x80)==0x80)

E=0

}

/*------------------延时子程序-----------------------------*/

void delay(unsigned int t)

{

unsigned int i,j

for(i=0i<ti++)

for(j=0j<10j++)

}

/*------------------写命令到LCD------------------------------*/

void write_com(unsigned char cmdcode)

{

chk_busy()

RS=0

RW=0

E=1

Lcd_Bus=cmdcode

delay(5)

//------------------在数据写入的时候加入适当的延时

E=0

delay(5)

}

/*-------------------写数据到LCD----------------------------*/

void write_data(unsigned char Dispdata)

{

chk_busy()

RS=1

RW=0

E=1

Lcd_Bus=Dispdata

delay(5)

//------------------在数据写入的时候加入适当的延时

E=0

delay(5)

}

/*------------------初始化LCD屏--------------------------*/

void lcdreset()

{

delay(2000)

write_com(0x30)

delay(10)

//选择基本指令集

write_com(0x30)

//选择8bit数据流

delay(5)

write_com(0x0c)

//开显示(无游标、不反白)

delay(10)

write_com(0x01)

//清除显示,并且设定地址指针为00H

delay(500)

write_com(0x06)

//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位

delay(0)

}

/*------------------显示字符串--------------------------*/

void hzkdis(unsigned char code*s)

{

while(*s>0)

{

write_data(*s)

s++

delay(50)

}

}

/*------------------首屏显示--------------------------*/

void ceshi()

{

write_com(0x01)

//清除显示,并且设定地址指针为00H

delay(5)

write_com(0x80)

//第一行(如果是地址是:80H,即LCD的第一行的第一个位置显示)

hzkdis("中国计量学院")

write_com(0x90)

//第二行(如果是地址是:90H,即LCD的第二行的第一个位置显示)

hzkdis("光电学院")

write_com(0x88)

//第三行(如果是地址是:88H,即LCD的第二行的第一个位置显示)

hzkdis("06光信2")

write_com(0x98)

//第四行(如果是地址是:98H,即LCD的第二行的第一个位置显示)

hzkdis("测试程序")

}

//------------------清整个GDRAM空间----------------------------

void clrgdram()

{

unsigned char x,y

for(y=0y<64y++)

for(x=0x<16x++)

{

write_com(0x34)

write_com(y+0x80)

//行地址

write_com(x+0x80)

//列地址

write_com(0x30)

write_data(0x00)

write_data(0x00)

}

}

//------------------------------------------------------------

void clrscreen()

{

write_com(0x01)

delay(10)

}

unsigned char ReadByte(void)

{

unsigned char byReturnValue

chk_busy()

Lcd_Bus=0xff

RS=1

RW=1

E=0

E=1

byReturnValue=Lcd_Bus

E=0

return byReturnValue

}

//增加画点子程序

void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)

{

unsigned char Row,Tier,Tier_bit

unsigned char ReadOldH,ReadOldL

write_com(0x34)

write_com(0x36)

Tier=X>>4

Tier_bit=X&0x0f

if(Y<32)

{

Row=Y

}

else

{

Row=Y-32

Tier+=8

}

write_com(Row+0x80)

write_com(Tier+0x80)

ReadByte()

ReadOldH=ReadByte()

ReadOldL=ReadByte()

write_com(Row+0x80)

write_com(Tier+0x80)

if(Tier_bit<8)

{

switch(Color)

{

case 0 :

ReadOldH&=(~(0x01<<(7-Tier_bit)))

break

case 1 :

ReadOldH|=(0x01<<(7-Tier_bit))

break

case 2 :

ReadOldH^=(0x01<<(7-Tier_bit))

break

default :

break

}

write_data(ReadOldH)

write_data(ReadOldL)

}

else

{

switch(Color)

{

case 0 :

ReadOldL&=(~(0x01<<(15-Tier_bit)))

break

case 1 :

ReadOldL|=(0x01<<(15-Tier_bit))

break

case 2 :

ReadOldL^=(0x01<<(15-Tier_bit))

break

default :

break

}

write_data(ReadOldH)

write_data(ReadOldL)

}

write_com(0x30)

}

void main(void)

{

uchar i,j,colour=1

// uint ADzhi

RW=0

lcdreset()

// ceshi()

clrgdram()

// delay(5000)

clrscreen()

for(i=4i<124i++)

{

j=36-28*sin((i-8)*3.14)

//正弦波显示

DrawPoint(i,j,colour)

}

delay(5000)

while(1)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7796392.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存