关于verilog的12864程序

关于verilog的12864程序,第1张

你的LCM是用什么控制IC的?COB还是COG? 不清楚你驱动IC所以不能帮你看了,只要初始化没问题就行了,我给你发个常用的COB 三星0108的驱动 程序,跟 COG的7565R的程序,你参考下

// MASTER IC: S6B0108 X3 SLAVE IC: S6B0107

// VDD= 5v,Vop=100V 1/64DUTY 1/9BIAS

// PARALLEL 6800-SERIES

// 2003712 by ZHM

#include <mreg52h>

#define Uchar unsigned char

#define Uint unsigned int

unsigned char code Pic[8128];

unsigned char code image[8128];

void ComWrite(Uchar com);

void DatWrite(Uchar dat);

void Initial(void);

void Disp(Uchar dot1,Uchar dot2);

void DispBmp(void);

void DispB(void);

void block(Uchar dot1,Uchar dot2);

void delay(unsigned int d)

{

int d3;

for(;d!=0;d--)

{

for(d3=50;d3!=0;d3--)

{}

}

}

void main(void)

{

Initial();

while(1)

{

DispBmp();

Disp(0x0ff,0x0ff);

delay(3000);

Disp(0x00,0x00);

delay(3000);

Disp(0x55,0x55);

delay(3000);

Disp(0xaa,0xaa);

delay(3000);

Disp(0xff,0x00);

delay(3000);

Disp(0x00,0xff);

delay(3000);

Disp(0xaa,0x55);

delay(3000);

Disp(0x55,0xaa);

delay(3000);

block(0x00,0xff);

delay(3000);

DispB();

}

}

void block(Uchar dot1,Uchar dot2)

{

Uchar cnt,cnt2;

register Uchar cnt1;

CS1=1;CS2=0; //SELECT ALL SEG IC

for(cnt=0;cnt<4;cnt++)

{

ComWrite(0x0b8+cnt+cnt); //Set Page Address 0~7

ComWrite(0x40);

for(cnt2=0;cnt2<4;cnt2++)

{

for(cnt1=8;cnt1>0;--cnt1){ DatWrite(dot1);}

for(cnt1=8;cnt1>0;--cnt1){ DatWrite(dot2);}

}

ComWrite(0x0b8+cnt+cnt+1); //Set Page Address 0~7

ComWrite(0x40);

for(cnt2=0;cnt2<4;cnt2++)

{

for(cnt1=8;cnt1>0;--cnt1){ DatWrite(dot2);}

for(cnt1=8;cnt1>0;--cnt1){ DatWrite(dot1);}

}

}

CS1=0;CS2=1;

for(cnt=0;cnt<8;cnt++)

{

ComWrite(0x0b8+cnt); //Set Page Address 0~7

ComWrite(0x40);

for(cnt2=0;cnt2<4;cnt2++)

{

for(cnt1=8;cnt1>0;--cnt1){ DatWrite(dot1);}

for(cnt1=8;cnt1>0;--cnt1){ DatWrite(dot2);}

}

cnt++;

ComWrite(0x0b8+cnt); //Set Page Address 0~7

ComWrite(0x40);

for(cnt2=0;cnt2<4;cnt2++)

{

for(cnt1=8;cnt1>0;--cnt1){ DatWrite(dot2);}

for(cnt1=8;cnt1>0;--cnt1){ DatWrite(dot1);}

}

}

delay(10);

}

void DispBmp(void)

{

Uchar cnt;

register Uchar cnt1;

for(cnt=0; cnt<8; cnt++)

{

CS1=1; CS2=0; // CS3=1;

ComWrite(0x0b8+cnt); //Set Page Address 0~7

ComWrite(0x40);

for(cnt1=64; cnt1>0; cnt1--) DatWrite(image[128cnt+64-cnt1]);

CS1=0; CS2=1; // CS3=1;

ComWrite(0x0b8+cnt); //Set Page Address 0~7

ComWrite(0x40);

for(cnt1=128; cnt1>64; cnt1--) DatWrite(image[128cnt+192-cnt1]);

/ CS1=1; CS2=1; // CS3=0;

ComWrite(0x0b8+cnt); //Set Page Address 0~7

ComWrite(0x40);

for(cnt1=0; cnt1<64; cnt1++) DatWrite(bmp++);

/ }

delay(5000);

Disp(0x00,0x00);

}

void DispB(void)

{

Uchar cnt;

register Uchar cnt1;

for(cnt=0; cnt<8; cnt++)

{

CS1=1; CS2=0; // CS3=1;

ComWrite(0x0b8+cnt); //Set Page Address 0~7

ComWrite(0x40);

for(cnt1=64; cnt1>0; cnt1--) DatWrite(Pic[128cnt+64-cnt1]);

CS1=0; CS2=1; // CS3=1;

ComWrite(0x0b8+cnt); //Set Page Address 0~7

ComWrite(0x40);

for(cnt1=128; cnt1>64; cnt1--) DatWrite(Pic[128cnt+192-cnt1]);

/

CS1=1; CS2=1; // CS3=0;

ComWrite(0x0b8+cnt); //Set Page Address 0~7

ComWrite(0x40);

for(cnt1=0; cnt1<64; cnt1++) DatWrite(bmp++); /

}

delay(10000);

Disp(0x00,0x00);

}

void Disp(Uchar dot1,Uchar dot2)

{

Uchar cnt;

register Uchar cnt1;

CS1=1;CS2=1; //SELECT ALL SEG IC

for(cnt=0;cnt<8;cnt++)

{

ComWrite(0x0b8+cnt); //Set Page Address 0~7

ComWrite(0x40); //Set Y address

for(cnt1=0;cnt1<32;cnt1++)

{

DatWrite(dot1);

DatWrite(dot2);

}

}

CS1=0;CS2=0;

for(cnt=0;cnt<8;cnt++)

{

ComWrite(0x0b8+cnt); //Set Page Address 0~7

ComWrite(0x40); //Set Y address

for(cnt1=0;cnt1<32;cnt1++)

{

DatWrite(dot1);

DatWrite(dot2);

}

}

delay(10);

}

void Initial()

{

CS1=1; CS2=1;

RES =0;

delay(500);

RES =1;

delay(100);

ComWrite(0x0C0); // start line 00

ComWrite(0x3f); //Display ON

CS1=0; CS2=0; // CS3=1; // CLOSE IC

ComWrite(0x3f); //Display ON

}

void DatWrite(Uchar dat)

{

RS = 1;

RW = 0;

P1=dat;

E = 1;

//P1 = dat;

E = 0;

RW = 1;

}

void ComWrite(Uchar com)

{

RS = 0;

RW = 0;

P1=com;

E = 1;

//P1 = com;

E = 0;

RW =1;

}

unsigned char code Pic[8128]={

/-- 调入了一幅图像:C:\Documents and Settings\liuminglai\桌面\ebmp --/

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

0xFF,0xFF,0x83,0x83,0x83,0xC3,0xC3,0xC3,0x43,0x43,0x63,0x63,0xE3,0xE3,0xE3,0xE3,

0xA3,0xA3,0xA3,0xA3,0xA3,0xA3,0xA3,0xA3,0x83,0x43,0x43,0x43,0x43,0x43,0x43,0x43,

0x43,0xC3,0xC3,0xC3,0x83,0x83,0x83,0x83,0x83,0x83,0x03,0x03,0x03,0x03,0x03,0x03,

0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,

0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,

0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,

0x03,0x83,0x83,0xC3,0x43,0xC3,0x43,0x63,0xE3,0x63,0x23,0x23,0xF3,0x33,0x93,0x93,

0x5B,0x2B,0xAB,0x9B,0xCB,0xCB,0xEB,0xEB,0x63,0x73,0xF3,0xF3,0xE3,0xC3,0xFF,0xFF,

0xFF,0xFF,0x0D,0x18,0x38,0x28,0x68,0x48,0xC8,0xC8,0xC8,0x88,0x8C,0x8C,0x8C,0x8C,

0x8C,0x8C,0x84,0x84,0x84,0xC4,0xC4,0xC4,0xC4,0xC4,0xC4,0x44,0x44,0x44,0x45,0x45,

0x45,0x45,0x40,0x48,0xF6,0x22,0x27,0xFD,0x2D,0x0B,0x07,0x11,0x5B,0x53,0xF3,0x23,

0x22,0x66,0x66,0x6C,0xCC,0x88,0x18,0x10,0x30,0x20,0x60,0xC0,0xC0,0x80,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0x30,0x10,0xF8,0x0C,0x8C,0x3E,0x03,

0xE1,0x07,0x00,0x20,0x84,0xC1,0x70,0x2E,0xD3,0xF8,0x3E,0x1D,0x0E,0x0F,0x06,0x06,

0x07,0x03,0x07,0x07,0x07,0x05,0x01,0x03,0x03,0x06,0x06,0x04,0x01,0x03,0xFF,0xFF,

0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,

0x03,0x03,0x04,0x0C,0x08,0x18,0x30,0x20,0x68,0x68,0x60,0x44,0x44,0x44,0x44,0xC4,

0xC4,0xC4,0x84,0xA4,0xA4,0x25,0x26,0x5A,0x57,0x7D,0x55,0xF5,0xD5,0x85,0xE3,0x9D,

0x11,0x75,0xF5,0x14,0x14,0xFF,0x4B,0x42,0x54,0x50,0xF8,0x50,0x50,0x61,0xA3,0x06,

0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x80,0x80,0x80,0xC0,0x40,0xE0,0xF8,0x3C,0x0E,

0x07,0x03,0x03,0x33,0x91,0x99,0x89,0x0B,0xE3,0xF2,0xFC,0xF8,0xF0,0xE7,0xE8,0xCC,

0xCC,0x8C,0x8F,0xF6,0x39,0x1C,0x0E,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0

/

EY1206E3 IC: ST7565R

Parallel Interface: 6800 systeml

Duty = 1/65; Bias = 1/9; Vdd =30; Vop = 97v

20080811 by Arrow Du

/

#include <reg52h> //Port Pin included

#include <delayc>

#define Uchar unsigned char

#define Uint unsigned int

void DispBmp(Uchar bmp[]);

void DispDat(Uchar dat1, dat2);

void ComWrite(Uchar COM);

void DatWrite(Uchar DAT);

void INITIAL(void);

sbit RES = P3^7;

sbit CS1 = P3^1;

sbit RD1 = P3^5;

sbit WR1 = P3^0;

sbit A0 = P3^6;

Uchar Ratio=0x27;//调节LCD电压参数

Uchar Refer=0x30; //调节LCD电压参数

extern char code zft[]; //显示

void MAIN(void)

{

EA=1;

EX1=1;

PX1=1;

IT1=1;

WR=0;

delay(200);

INITIAL();

delay(200);

while(1)

{

DispBmp(zft);

delay(20000);

DispDat(0x55, 0x55);

DispDat(0xaa, 0xaa);

DispDat(0xff, 0x00);

DispDat(0x00, 0xff);

DispDat(0x00, 0x00);

}

}

void INITIAL()

{

delay(100);

CS1 =0;

RES=0;

delay(50);

RES=1;

delay(50);

ComWrite(0x02e);

delay(50);

ComWrite(02); // 1/9 bias

ComWrite(00); // ADC(segment driver direction select):reverse

ComWrite(0x0c8); // Common Output Mode Select: 1/64duty, COM63->COM0

ComWrite(0x2f); // Power Controller Set

ComWrite(0x2f); // Power Controller Set

delay(50);

ComWrite(0x0f8);

ComWrite(0x00); //Booster Ratio Select

ComWrite(Ratio);

ComWrite(0x81);

ComWrite(Refer);

ComWrite(0f); // Display ON

ComWrite(0x40); // Display Start Line Set: 00

}

void DispBmp(Uchar bmp[])

{

Uchar cnt, cnt1;

for(cnt=0; cnt<8; cnt ++)

{

ComWrite(0xb0 + cnt);

ComWrite(0x10);

ComWrite(0x00);

for(cnt1=0; cnt1<128; cnt1 ++)

{

DatWrite(bmp ++);

// delay(50);

}

}

delay(20000);

}

void DispDat(Uchar dat1, dat2)

{

Uchar cnt,cnt1;

for(cnt=0; cnt<8; cnt++)

{

ComWrite(0xb0 + cnt);

ComWrite(0x10);

ComWrite(0x00);

for(cnt1=0; cnt1<128 ; cnt1++)

{

DatWrite(dat1);

DatWrite(dat2);

}

}

delay(20000);

}

/void ComWrite(Uchar COM)

{

;

A0=0;

delay(1);

P1=COM;

delay(1);

E=0;

delay(1);

E=1;

}

void DatWrite(Uchar DAT)

{

A0=1;

delay(1);

P1=DAT;

delay(1);

E=0;

delay(1);

E=1;

} /

/

void ComWrite(unsigned char com)

{

unsigned char count;

CS1=1;

A0=0;

for (count = 0; count < 8; count++)

{

SCL=0;

SDA=(bit)(com&0x80);

SCL=1;

com=com<<1;

}

delay(10);

}

void DatWrite(unsigned char dat)

{

unsigned char count;

CS1=0;

A0=1;

for (count = 0; count < 8; count++)

{

SCL=0;

SDA=(bit)(dat&0x80);

SCL=1;

dat=dat<<1;

}

delay(10);

}

/

void DatWrite(Uchar dat)//80

{

A0 = 1;

RD1=1;

WR1=0;

P1=dat;

WR1=1;

}

void ComWrite(Uchar com)

{

A0 = 0;

RD1=1;

WR1=0;

P1=com;

WR1=1;

}

里面有128564显示汉字的程序,自己研究下,不过是用msp430控制的,你改改端口i就可以了。

#include "msp430x26xh"

#define uchar unsigned char

#define uint unsigned int

#define iDat 1 //数据标志

#define iCmd 0 //指令标志

#define LCDb_RS 0x20 //定义四个控制引脚

#define LCDb_RW 0x40

#define LCDb_E 0x80

#define LCDb_RST 0x04

#define LCDb_L1 0x80 //第一行的地址

#define LCDb_L2 0x90 //第二行的地址

#define LCDb_L3 0x88 //第三行的地址

#define LCDb_L4 0x98 //第四行的地址

#define LCDb_SET_RS P1OUT|=LCDb_RS //四个控制管脚的控制 *** 作

#define LCDb_SET_RW P1OUT|=LCDb_RW

#define LCDb_SET_E P1OUT|=LCDb_E

#define LCDb_SET_RST P8OUT|=LCDb_RST

#define LCDb_CLR_RS P1OUT&=~LCDb_RS

#define LCDb_CLR_RW P1OUT&=~LCDb_RW

#define LCDb_CLR_E P1OUT&=~LCDb_E

#define LCDb_CLR_RST P8OUT&=~LCDb_RST

#define LCDb_DO P4OUT //输出数据总线端口定义

#define LCDb_FUNCTION 0x38 // 液晶模式为8位,2行,58字符

#define LCDb_BASCMD 0x30 // 基本指令集

#define LCDb_CLS 0x01 // 清屏

#define LCDb_HOME 0x02 // 地址返回原点,不改变DDRAM内容

#define LCDb_ENTRY 0x06 // 设定输入模式,光标加,屏幕不移动

#define LCDb_C2L 0x10 // 光标左移

#define LCDb_C2R 0x14 // 光标右移

#define LCDb_D2L 0x18 // 屏幕左移

#define LCDb_D2R 0x1C // 屏幕又移

#define LCDb_ON 0x0C // 打开显示

#define LCDb_OFF 0x08 // 关闭显示

unsigned char RXData;

unsigned char Seg_Data[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //数码管编码

unsigned char Result[5]; //整数转化成字符串,给LCD显示

void Delayms(uint MS)

{

uint i,j;

for( i=0;i<MS;i++)

for(j=0;j<1141;j++);

}

void Delayus(uint US)

{

uint i;

US=US5/4;

for( i=0;i<US;i++);

}

void LCD12864_portini()

{

P1DIR=0xFF;

P4DIR=0xFF;

P5DIR=0xFF;

P8DIR=0xFF;

P8OUT |=LCDb_RST;

// P1OUT=0xFF;

}

/函数名称: LCD12864_sendbyte

功 能: 向12864液晶写入一个字节数据或者指令

/

void LCD12864_sendbyte(uchar DatCmd, uchar dByte)

{

if (DatCmd == iCmd) //指令 *** 作

LCDb_CLR_RS;

else

LCDb_SET_RS;

LCDb_CLR_RW; //写 *** 作

LCDb_SET_E;

LCDb_DO = dByte; //写入数据

//Delayus(500);

Delayms(1);

LCDb_CLR_E;

}

/函数名称: LCD12864_sendstr

功 能: 向12864液晶写入一个字符串

参 数: ptString--字符串指针

返回值 : 无

/

void LCD12864_sendstr(uchar ptString)

{

while((ptString)!='\0') //字符串未结束一直写

{

LCD12864_sendbyte(iDat, ptString++);

}

}

/函数名称: LCD12864_clear

功 能: 12864液晶清屏

参 数: 无

返回值 : 无

/

void LCD12864_clear(void)

{

LCD12864_sendbyte(iCmd,LCDb_CLS);

Delayms(2);// 清屏指令写入后,2ms 的延时是很必要的!!!

}

/

函数名称: LCD12864_gotoXY

功 能: 移动到指定位置

参 数: Row--指定的行

Col--指定的列

返回值 : 无

/

void LCD12864_gotoXY(uchar Row, uchar Col)

{

switch (Row) //选择行

{

case 2:

LCD12864_sendbyte(iCmd, LCDb_L2 + Col); break; //写入第2行的指定列

case 3:

LCD12864_sendbyte(iCmd, LCDb_L3 + Col); break; //写入第3行的指定列

case 4:

LCD12864_sendbyte(iCmd, LCDb_L4 + Col); break; //写入第4行的指定列

default:

LCD12864_sendbyte(iCmd, LCDb_L1 + Col); break; //写入第1行的指定列

}

}

/

函数名称: LCD12864_initial

功 能: 12864液晶初始化

/

void LCD12864_initial(void)

{

Delayms(100); // 等待内部复位

LCD12864_portini(); //端口初始化

LCD12864_sendbyte(iCmd, LCDb_FUNCTION); //功能、模式设定

LCD12864_sendbyte(iCmd, LCDb_ON); //打开显示

LCD12864_clear(); //清屏

LCD12864_sendbyte(iCmd, LCDb_ENTRY); // 输入模式设定

}

void Int_char(int data)

{

if(data/1000)

{

Result[0]=data/1000+'0';

Result[1]=data/100%10+'0';

Result[2]=data/10%10+'0';

Result[3]=data%10+'0';

Result[4]=0;

}

else if(data/100)

{

Result[0]=data/100+'0';

Result[1]=data/10%10+'0';

Result[2]=data%10+'0';

Result[3]=0;

}

else if(data/10)

{

Result[0]=data/10%10+'0';

Result[1]=data%10+'0';

Result[2]=0;

}

else

{

Result[0]=data%10+'0';

Result[1]=0;

}

}

unsigned char Key_Press(void)

{

P7OUT=0xF0;

if((P7IN&0x10)&&(P7IN&0x20)&&(P7IN&0x40)&&(P7IN&0x80)) return 0x00;

else return 0xFF;

}

unsigned char Get_Keycode(void)

{

while(1)

{

P7OUT=0xFE; //扫描第一列

if((P7IN&0x10)==0) return 0;

else if((P7IN&0x20)==0) return 4;

else if((P7IN&0x40)==0) return 8;

else if((P7IN&0x80)==0) return 12;

P7OUT=0xFD; //扫描第二列

if((P7IN&0x10)==0) return 1;

else if((P7IN&0x20)==0) return 5;

else if((P7IN&0x40)==0) return 9;

else if((P7IN&0x80)==0) return 13;

P7OUT=0xFB; //扫描第三列

if((P7IN&0x10)==0) return 2;

else if((P7IN&0x20)==0) return 6;

else if((P7IN&0x40)==0) return 10;

else if((P7IN&0x80)==0) return 14;

P7OUT=0xF7; //扫描第四列

if((P7IN&0x10)==0) return 3;

else if((P7IN&0x20)==0) return 7;

else if((P7IN&0x40)==0) return 11;

else if((P7IN&0x80)==0) return 15;

}

}

void Init_compa()

{

CACTL1 = CAON+CAREF_2+CARSEL; // Enable Comp, ref = 05Vcc = Vin-

CACTL2 = P2CA0; // Pin to CA0

P1DIR |= 0x01; // P10 = o/p direction(CAOUT - LED)

P1SEL |= 0x01; // P10 - CAOUT, option select

}

/

函数名称:初始化函数

/

void Init_IIC(void)

{

P3SEL |= 0x06; // Assign I2C pins to USCI_B0

UCB0CTL1 |= UCSWRST; // Enable SW reset

UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode

UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset

UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz

UCB0BR1 = 0;

UCB0I2CSA = 0x50; // Slave Address is 048h

UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation

IE2 |= UCB0RXIE; // Enable RX interrupt

_BIS_SR(GIE);

// RXCompare = 0x0; // Used to check incoming data

}

/ 函数名称:字节写函数

/

void EEPROM_Write(unsigned char high_Address,unsigned char low_Address,unsigned char Word)

{

while (UCB0CTL1 & UCTXSTP); // 确定总线空闲

UCB0CTL1 |= UCTXSTT + UCTR; // 发送起始位,确定为发送模式

UCB0TXBUF = high_Address; // 发送高位地址

while((IFG2 & UCB0TXIFG)==0); // 判断是否发送完毕

UCB0TXBUF = low_Address; // 发送低位地址

while((IFG2 & UCB0TXIFG)==0); // 判断是否发送完毕

UCB0TXBUF = Word; // 发送数据

while((IFG2 & UCB0TXIFG)==0); // 判断是否发送完毕

UCB0CTL1 |= UCTXSTP; // 发送停止位

while((UCB0CTL1 & UCTXSTP)==1); // 判断停止位是否发送完毕

}

/

函数名称:字节读函数

/

void EEPROM_readmore()

{

UCB0CTL1 &= ~UCTR; // 确定为读

while (UCB0CTL1 & UCTXSTP); // 总线是否空闲

UCB0CTL1 |= UCTXSTT; // 发送开始位

}

/

函数名称:字节写函数

/

void EEPROM_read(unsigned char high_Address,unsigned char low_Address)

{

while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent

UCB0CTL1 |= UCTXSTT + UCTR; // 发送起始位,确定为写

UCB0TXBUF = high_Address; // 发送地址位高位

while((IFG2 & UCB0TXIFG)==0); // 判断是否发送完毕

UCB0TXBUF = low_Address; // 发送地址位低位

while((IFG2 & UCB0TXIFG)==0); // 判断是否发送完毕

UCB0CTL1 &= ~UCTR; // 确定为接收

while (UCB0CTL1 & UCTXSTP); //

UCB0CTL1 |=UCTXSTT ;

while((UCB0CTL1 & UCTXSTT)==1);

for(unsigned char i=0x0;i<0x2f;i++); // 延时确定数据已经被发送出去

UCB0CTL1 |=UCTXSTP + UCTXNACK; // 发送停止位和NACK位

}

/

函数名称:接收中断函数

/

// USCI_B0 Data ISR

#pragma vector = USCIAB0TX_VECTOR

__interrupt void USCIAB0TX_ISR(void)

{

RXData = UCB0RXBUF; // Get RX data

Int_char(RXData);

LCD12864_gotoXY(2,0); //第2行,第1列显示

LCD12864_sendstr(Result);

/

key_code[0]=RXData%10+'0';

key_code[1]=0;

LCD12864_gotoXY(1,0); //第1行,第1列显示

LCD12864_sendstr(key_code);

/

// __bic_SR_register_on_exit(CPUOFF); // Exit LPM0

}

void Init_UART()

{

P3OUT &= ~(BIT4+BIT5+BIT6+BIT7);

P3SEL = 0xF0; // P34,5,6,7 = USCI_A0 TXD/RXD USCI_A1 TXD/RXD

UCA0CTL1 |= UCSSEL_1; // CLK = ACLK

UCA0BR0 = 0x03; // 32kHz/9600 = 341

UCA0BR1 = 0x00; //

UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3

UCA0CTL1 &= ~UCSWRST; // Initialize USCI state machine

IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt

UCA1CTL1 |= UCSSEL_1; // CLK = ACLK

UCA1BR0 = 0x03; // 32kHz/9600 = 341

UCA1BR1 = 0x00; //

UCA1MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3

UCA1CTL1 &= ~UCSWRST; // Initialize USCI state machine

UC1IE |= UCA1RXIE; // Enable USCI_A0 RX interrupt

_BIS_SR(GIE); //使能中断

}

void Init_ADC()

{

ADC12CTL0 = SHT0_2 + ADC12ON; // Set sampling time, turn on ADC12

ADC12CTL1 = SHP; // Use sampling timer

ADC12IE = 0x01; // Enable interrupt

ADC12CTL0 |= ENC; // Conversion enabled

P6DIR &= 0x01; // P60, i/p

P6SEL |= 0x01; // P60-ADC option select

_BIS_SR(GIE); //使能中断

}

void Start_ADC()

{

ADC12CTL0 |= ADC12SC; // Start convn, software controlled

}

#pragma vector=USCIAB0RX_VECTOR

__interrupt void USCI0RX_ISR(void)

{

while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready

UCA0TXBUF = UCA0RXBUF; // TX -> RXed character

LCD12864_sendbyte(iDat,UCA0RXBUF);

}

#pragma vector=USCIAB1RX_VECTOR

__interrupt void USCI1RX_ISR(void)

{

while (!(UC1IFG&UCA1TXIFG)); // USCI_A0 TX buffer ready

UCA1TXBUF = UCA1RXBUF; // TX -> RXed character

LCD12864_sendbyte(iDat,UCA0RXBUF);

//UCA1TXBUF = 'z';

}

// ADC12 interrupt service routine

#pragma vector=ADC12_VECTOR

__interrupt void ADC12_ISR (void)

{

int i=ADC12MEM0;

Int_char(i);

LCD12864_gotoXY(2,0); //第1行,第1列显示

LCD12864_sendstr(Result);

/

key_code[0] =i/1000+'0';

key_code[1] =i/100%10+'0';

key_code[2] =i/10%10+'0';

key_code[3] =i%10+'0';

key_code[4] =0;

LCD12864_gotoXY(1,0); //第1行,第1列显示

LCD12864_sendstr(key_code);

/

}

void Init_all()

{

LCD12864_initial(); //LCD初始化,包含了数码管和LED灯初始化

P7DIR=0x0F; //键盘扫描初始化

P7REN=0xF0; //输入上下拉电阻使能,输出上下拉不使能

P7OUT=0xF0; //输入上拉

Init_UART(); //串口初始化

Init_compa(); //比较器初始化

Init_ADC(); //ADC初始化

Init_IIC(); //IIC初始化

}

void Test_Led()

{

unsigned char i=0;

LCD12864_gotoXY(1,0); //第1行,第1列显示

LCD12864_sendstr("1Test_LED");

for(;i<16;i++)

{

P8OUT=0xF0|i;

Delayms(50);

}

}

void Test_Seg()

{

int i;

LCD12864_gotoXY(1,0); //第1行,第1列显示

LCD12864_sendstr("2Test_SEG");

for(i=0;i<500;i++)

{

//4,3,2,1

P1OUT&=~0x02;

P1OUT|=0x10|0x08|0x04;

P5OUT=Seg_Data[9]; //清楚数码管显示

Delayms(1);

P1OUT&=~0x04;

P1OUT|=0x10|0x08|0x02;

P5OUT=Seg_Data[8]; //清楚数码管显示

Delayms(1);

P1OUT&=~0x08;

P1OUT|=0x10|0x04|0x02;

P5OUT=Seg_Data[7]; //清楚数码管显示

Delayms(1);

P1OUT&=~0x10;

P1OUT|=0x08|0x04|0x02;

P5OUT=Seg_Data[6]; //清楚数码管显示

Delayms(1);

}

P5OUT=0x00; //熄灭所有数码管

}

void Test_Key()

{

unsigned char i=0;

LCD12864_gotoXY(1,0); //第1行,第1列显示

LCD12864_sendstr("3Test_KEY");

LCD12864_gotoXY(2,0); //第2行,第1列显示

LCD12864_sendstr("按键:");

for(;i<16;i++)

{

Int_char(Get_Keycode());

LCD12864_gotoXY(2,3);

LCD12864_sendstr(" ");

LCD12864_gotoXY(2,3);

LCD12864_sendstr(Result);

Delayms(100); //防抖

}

}

void Test_Uart()

{

LCD12864_gotoXY(1,0); //第1行,第1列显示

LCD12864_sendstr("4Test_UART");

LCD12864_gotoXY(2,0); //第2行,第1列显示

}

void Test_Compa()

{

LCD12864_gotoXY(1,0); //第1行,第1列显示

LCD12864_sendstr("5Test_COMPA");

}

void Test_ADC()

{

int i=0;

LCD12864_gotoXY(1,0); //第1行,第1列显示

LCD12864_sendstr("6Test_ADC");

for(;i<200;i++)

{

Start_ADC();

Delayms(10);

}

}

void Test_IIC()

{

LCD12864_gotoXY(1,0); //第1行,第1列显示

LCD12864_sendstr("7Test_IIC");

EEPROM_Write(0x00,0x40,7); // 字节写

Delayms(10);

EEPROM_read(0x00,0x40);

}

void main( void )

{

// Stop watchdog timer to prevent time out reset

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

Init_all();

while(1){

Test_Led(); //1测试LED

LCD12864_gotoXY(2,0); //第1行,第1列显示

LCD12864_sendstr("请按16键!");

while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子

LCD12864_clear();

Test_Seg(); //2测试数码管

LCD12864_gotoXY(2,0); //第1行,第1列显示

LCD12864_sendstr("请按16键!");

while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子

LCD12864_clear();

Test_Key(); //3测试按键扫描

LCD12864_gotoXY(2,0); //第1行,第1列显示

LCD12864_sendstr("请按16键!");

while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子

LCD12864_clear();

LCD12864_gotoXY(3,0); //第3行,第1列显示

LCD12864_sendstr("请按16键!");

Test_Uart(); //4测试串口

while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子

LCD12864_clear();

Test_Compa(); //5测试比较器

LCD12864_gotoXY(2,0); //第2行,第1列显示

LCD12864_sendstr("请按16键!");

while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子

LCD12864_clear();

Test_ADC(); //6测试ADC

LCD12864_gotoXY(3,0); //第3行,第1列显示

LCD12864_sendstr("请按16键!");

while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子

LCD12864_clear();

Test_IIC(); //7测试IIC

Delayms(100);

LCD12864_gotoXY(3,0); //第3行,第1列显示

LCD12864_sendstr("测试完成");

while(!(Get_Keycode()==15)); //按下最后一键测试下一个例子

LCD12864_clear();

}

}

//1062液晶双行显示

// bravey 1127

#include<reg52h>

#define uint unsigned int

#define uchar unsigned char

sbit en=P2^7; //这些管脚要看原理图的,或许我的单片机和你的不一样。

sbit rs=P2^6;

sbit rw=P2^5;

uchar code d1[]={填入你要现实的字的码值,用取模软件 };

uchar code d2[]={填入你要现实的字的码值,用取模软件 };

void delay(uint z)//延迟函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=0;y<110;y++);

}

void write_com(uchar com) //送地址函数定义

{

rs=0;

rw=0;

P0=com;

delay(5);

en=1;

delay(5);

en=0;

}

void write_datt(uchar datt) //送数据

{

rs=1;

rw=0;

P0=datt;

delay(5);

en=1;

delay(5);

en=0;

}

void lcd_init() //初始化

{

en=0;

write_com(0x0c);//整体显示,无光标,不反白

write_com(0x07);//地址指针加一设置,且整体左移

write_com(0x01);//清屏

}

void main()

{

uchar i;

lcd_init();

write_com(0x80);//地址指针初始化,第一行显示拼音名字

for(i=0;i<13;i++)

{

write_datt(d1[i]);

delay(20);

}

write_com(0x90);

for(i=0;i<9;i++)

{

write_datt(d1[i]);//高位

write_datt(d2[i]);//低位

delay(20);

}

while(1);

}

这是一个简单的12864显示字的程序。LZ可以参考参考

12864要看液晶屏的驱动IC是什么,不同的话,肯定不通用。

另外,它的指令多,因为复位的时候,大多指令都会自动设到默认值。程序初始化的时候,只需要更改其中几个。

比如显示指令,复位后,默认值是 显示关闭。初始化就要,显示打开。

我看你的命令像是,ST7920这款IC控制的(猜测),带中文字库的吧?网上驱动很多,有串并口都有。

检查液晶屏控制器的时序 *** 作命令码初始化过程,还有硬件,上下拉电阻,既然决定用并口,那么PSB就直接VDD,这样还能省一个IO口 注意下面的程序中RS=0,RW=0,能同时为低吗 void write_command(uchar cmd)

{

check_busy();

rs=0;

rw=0;

en=0;

P2=cmd;

delay_4us();

en=1;

delay_4us();

en=0;

}

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

//--------------液晶 *** 作------------------//

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

void busycheck()//忙检测

{

uchar temp;

rs=0;

rw=1;

busy=1;

do

{

e=1;

temp=busy&1;

e=0;

}

while(temp);

}

void wr_com(uint com)//写指令

{

busycheck();

P1=com;

rs=0;

rw=0;

e=1;

e=0;

}

void wr_dat(uint dat)//写数据

{

busycheck();

P1=dat;

rs=1;

rw=0;

e=1;

e=0;

}

void init()//初始化

{

wr_com(0x0B);

wr_com(0x0C);

wr_com(0x30);

wr_com(0x02);

wr_com(0x01);

}

参加电子设计大赛刚学会的,还需要的话可以教你打点画图,可以在液晶屏上显示点,线,画

以上就是关于关于verilog的12864程序全部的内容,包括:关于verilog的12864程序、谁有用51单片机控制12864显示数字时钟的程序!急求!不用ds1302;简单一点就好。有好的答案加分!、求一个12864的测试程序。单片机是89C52RC型号的,显示屏是FM-12864M-12L型号的。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/zz/9300449.html

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

发表评论

登录后才能评论

评论列表(0条)

保存