12864液晶不带字库的用C语言和51单片机编程

12864液晶不带字库的用C语言和51单片机编程,第1张

#include<reg51h>

#include<absacch>

#define uchar unsigned char

#define datawr 0x1200 //写数据通道

#define comwr 0x1000 //写控制命令通道

#define datare 0x1300 //读数据通道

#define comre 0x1100 //读忙通道

uchar code disp_data[]={" 浙江大学 " //第一行,第一页

"04级通信工程一班" //第三行

" 宁波理工学院 " //第二行

" 竞赛小组 " //第四行

"128X64液晶显示器" //第一行,第二页

" 测试程序 " //第三行

" 07年07月25日 " //第二行

" Tornado "}; //第四行

void set12864();

void write_command(uchar command);

void write_page(uchar data_add);

void read_page(uchar data_add);

void delays(uchar cont);

void main()

{

while(1)

{

set12864(); //初始化12864

write_page(0); //写入一页数据

read_page(0x30); //读出一页数据到内部RAM

delays(2); //延时2s

write_page(64); //写入下一页数据

delays(2); //延时2s

}

}

//初始化12864子程序

void set12864()

{

write_command(0x30); //功能设定控制字

write_command(0x0c); //显示开关控制字

write_command(0x01); //清除屏幕控制字

write_command(0x06); //进入设定点控制字

}

//写控制命令子程序

void write_command(uchar command)

{

bit flag="1"; //12864空闲标志位

while(flag) //检查12864是否空闲

flag="XBYTE"[comre]&0x80;

XBYTE[comwr]=command; //空闲传送控制字

}

//写一页子程序

void write_page(uchar data_add)

{

bit flag="1"; //12864空闲标志位

uchar num="64"; //64个循环,连续写入32个汉字或是64个西文字符

write_command(0x80);

for(;num>0;num--)

{

while(flag) //检查12864是否空闲

flag="XBYTE"[comre]&0x80;

XBYTE[datawr]=disp_data[data_add++]; //空闲传送数据

}

}

//读一页子程序

void read_page(uchar data_add)

{

bit flag="1"; //12864空闲标志位

uchar num="64"; //64个循环,连续写入32个汉字或是64个西文字符

write_command(0x80);

for(;num>0;num--)

{

while(flag) //检查12864是否空闲

flag="XBYTE"[comre]&0x80;

DBYTE[data_add++]=XBYTE[datare]; //空闲传送数据

}

}

//延时cont秒子程序

void delays(uchar count)

{

unsigned char h,i,j,k;

do

{

for(h=5;h>0;h--)

for(i=4;i>0;i--)

for(j=116;j>0;j--)

for(k=214;k>0;k--);

}while(--count);

}

这是图象显示程序:

#include<reg51h>

#include<absacch>

#define uchar unsigned char

#define uint unsigned int

#define datawr 0x1200 //写数据通道

#define comwr 0x1000 //写控制命令通道

#define datare 0x1300 //读数据通道

#define comre 0x1100 //读忙通道

uchar code disp_data[] = // 数据表

{

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

0x00,0x01,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,

0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00,

0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00,

0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,

0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00,

0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,

0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x80,0x00,0x00,0x00,

0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

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

0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFF,

0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x07,0xFF,0xFF,

0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x0B,0xFF,

0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x1F,

0x01,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,

0x01,0xFF,0xFF,0xFF,0xF3,0x79,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,

0x03,0xFF,0xFF,0xFF,0xE6,0x62,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,0x60,0x00,0x68,

0x01,0xFF,0xFF,0xFE,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,0x00,0x00,0x0E,

0x01,0xFF,0xFF,0xF8,0x00,0x4B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x8E,0x08,0x79,

0x07,0xFF,0xFF,0xF0,0x00,0x41,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE6,0xC0,0x07,0x61,

0xC3,0xFF,0xFE,0xC0,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xED,0xEF,0x3F,

0x83,0xFF,0xFE,0x60,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xC0,0xFF,0xFD,0xFC,0x6C,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xF0,0x7F,0xF3,0xFF,0xFE,0x60,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xF3,0xFF,0xFF,0x50,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9,

0xFB,0xFF,0xF1,0xF8,0x8C,0xD8,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0x6F,0xD9,

0xC2,0x3F,0xF8,0x40,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xDF,0x1E,0xFF,

0xFF,0x7F,0xFC,0x38,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x64,0x2F,0x6F,0xFF,

0xFD,0x7B,0xFC,0x1F,0xE0,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x5F,0x7C,0xEE,0xFF,

0xC7,0xFF,0xBC,0x0F,0xFF,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFE,0xEF,0xFF,

0xFF,0xE7,0xDC,0x07,0xE7,0xF8,0x12,0x7F,0xFF,0xFF,0xFF,0xFF,0x47,0xFF,0xFF,0xFF,

0xFF,0xE7,0x80,0x03,0xF4,0x00,0x00,0x5F,0xFF,0xFF,0xFE,0xFE,0xE3,0xFF,0xFF,0xFF,

0xFF,0xFE,0xC0,0x01,0xC0,0x00,0x00,0x1B,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,

0x7F,0xEE,0xC0,0x00,0xC0,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFE,0x98,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF,

0x20,0x0E,0x60,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,0xFF,

0x05,0x80,0xE0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0x09,0x80,0xA0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,

0x85,0x2A,0xC0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,

0xBF,0xF3,0xC0,0x00,0x00,0x00,0x00,0x00,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,

0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x01,0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,

0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0xFF,0xFF,0xFF,0xFF,0xC0,0x1F,

0xFF,0xFF,0x80,0x00,0x40,0x00,0x00,0x00,0xFF,0x80,0xFF,0xFF,0xFF,0x80,0x07,0xFF,

0xFF,0xFF,0xC0,0x00,0xC0,0x00,0x00,0x01,0xFF,0x01,0xFF,0xFF,0xF8,0x00,0xFF,0xFF,

0xFF,0xFF,0xE0,0x63,0x80,0x00,0x00,0x01,0xFE,0x01,0xFF,0x18,0x00,0x3F,0xFF,0xFF,

0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x01,0xCC,0x01,0xFE,0x00,0x07,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x07,0xA0,0x03,0xFC,0x00,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x05,0xC0,0x03,0xC8,0x00,0x7F,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x19,0x00,0x00,0x88,0x0C,0x07,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFC,0x00,0x0C,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC0,0x7F,0xFF,0xFF,

0xFF,0xFF,0xF8,0x07,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0F,0xFF,0xFE,

0xFF,0xFF,0xD0,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x03,0xFF,0xF8,

0xFF,0xFC,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xC0,

0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xFF,0xF8,

0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x1F,0xFE,

0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,

0xFF,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0x02,0xFF,

0xFE,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,

0xF0,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,

0xE0,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,

0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,

0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,

0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,

0x80,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01

};

void set12864();

void setxy(uchar x,uchar y);

void write_command(uchar command);

void write_16byte(uint data_add);

void delays(uchar count);

void main()

{

uchar x,y,i;

while(1)

{

y="0x80"; //设置液晶上半部分坐标

x="0x80";

delays(2); //延时2s

set12864(); //初始化12864

delays(2);

for(i=0;i<32;i++) //写入液晶上半图象部分

{ //写入坐标

setxy(x,y);

write_16byte(i16); //连续写入16字节数据

y++; //y轴地址加1

}

y="0x80"; //设置液晶下半部分坐标

x="0x88";

for(i=0;i<32;i++) //写入液晶下半图象部分

{

setxy(x,y); //写入坐标

write_16byte((32+i)16);//连续写入16字节数据

y++; //y轴地址加1

}

write_command(0x34); //写入扩充指令命令

write_command(0x36); //显示图象

}

}

//初始化12864子程序

void set12864()

{

write_command(0x30); //功能设定控制字

write_command(0x0c); //显示开关控制字

write_command(0x01); //清除屏幕控制字

write_command(0x06); //进入设定点控制字

}

//设置绘图坐标

void setxy(uchar x,uchar y)

{

write_command(0x34); //写入扩充指令命令

write_command(y); //写入y轴坐标

write_command(x); //写入x轴坐标

write_command(0x30); //写入基本指令命令

}

//写控制命令子程序

void write_command(uchar command)

{

bit flag="1"; //12864空闲标志位

while(flag) //检查12864是否空闲

flag="XBYTE"[comre]&0x80;

XBYTE[comwr]=command; //空闲传送控制字

}

void write_16byte(uint data_add)

{

bit flag="1"; //12864空闲标志位

uchar num="16"; //16个循环,连续写入16个字节

for(;num>0;num--)

{

while(flag) //检查12864是否空闲

flag="XBYTE"[comre]&0x80;

XBYTE[datawr]=disp_data[data_add++]; //空闲传送数据

}

}

//延时count秒子程序

void delays(uchar count)

{

unsigned char h,i,j,k;

do

{

for(h=5;h>0;h--)

for(i=4;i>0;i--)

for(j=116;j>0;j--)

for(k=214;k>0;k--);

}while(--count);

}

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

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

//

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

//

#include <msp430x14xh>

#define CPU_F ((double)8000000)

#define delay_us(x) __delay_cycles((long)(CPU_F(double)x/10000000))

#define delay_ms(x) __delay_cycles((long)(CPU_F(double)x/10000))

#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[] = {"0123456789V"};

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=0;i<100;i++)

_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=0;i<6;i++)

{

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=0;j<6;j++)

{

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=0;k<6;k++)

{

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=0;l<6;l++)

{

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();

}

}

#include <stdioh>

#include <mathh>

#include <reg52h>

#include <stringh>

sbit RS=P2^3; //注意:一定要看12864液晶模块的资料,来确定怎样 *** 作

sbit WRD=P2^4;

sbit E=P2^5;

sbit PSB=P2^0;

sbit RES=P2^2;

void TransferData(char data1,bit DI);

void delayms(unsigned int n);

void delay(unsigned int m);

void lcd_mesg(unsigned char code addr1);

//下面来定义要显示的汉字,84

unsigned char code IC_DAT[]={

"陈 "

" "

" "

" "

};

unsigned char code IC_DAT2[]={

"爱一个人难却还爱"

"交结朋友可路更宽"

"诚实守信加油努力"

"成功做人成功做事"

};

void initinal(void) //初始化,12864有要求的要写上

{

delay(40);

PSB=1; //并口工作模式

delay(1);

RES=0; //复位

delay(1);

RES=1; //复位置高

delay(10);

TransferData(0x30,0);

delay(100);

TransferData(0x30,0);

delay(37);

TransferData(0x08,0);

delay(100);

TransferData(0x10,0);

delay(100);

TransferData(0x0C,0);

delay(100);

TransferData(0x01,0);

delay(10);

TransferData(0x06,0);

delay(100);

}

void main(void) //分两屏来不断显示上面定义的IC_DAT和IC_DAT2汉字

{

while(1)

{

initinal();//调用LCD字库初始化程序

delay(100);

lcd_mesg(IC_DAT);

delayms(240); //延时程序必要的,长与短,自己调节

delayms(240);

initinal();

delay(100);

lcd_mesg(IC_DAT2);

delayms(240);

delayms(240);

}

}

void lcd_mesg(unsigned char code addr1) //显示汉字函数,84=32

{

unsigned char i;

TransferData(0x80,0);

delay(100);

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

{

TransferData(addr1,1);

addr1++;

}

TransferData(0x90,0);

delay(100);

for(i=32;i<64;i++)

{

TransferData(addr1,1);

addr1++;

}

}

void TransferData(char data1,bit DI) //传送数据或是命令,当DI=0时,传送命令,当DI=1时,传送数据

{

WRD=0;

RS=DI;

delay(1);

P0=data1;

E=1;

delay(1);

E=0;

}

void delayms(unsigned int n) //延时子程序

{

unsigned int i,j;

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

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

}

void delay(unsigned int m)

{

unsigned int i,j;

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

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

}

你好 没见你的源程序 显示没变化 可能是你两个子程序中的一个或两个都有问题 再就是在主程序中没有进行循环检测及显示刷新。贴上我的程序 你自己看看吧。老是显示85是上电时18B20没有进入正常状态,读出的数据。把我主程序中对你没有用的删了 自己看着搞吧 硬件接口上须从新对应一下。我的仿真库没有新型的18264 给你贴个老的仿真图

/ds18b20子程序/

#include <REG52H>

#include <intrinsh>

unsigned char week_value[2];

unsigned char TempBuffer[3],temp_value;      //温度值

sbit DQ = P1^0;        //温度传送数据IO口

sbit start = P3^2;     //化成启动按键

sbit led = P3^0;

unsigned char hc_start=0;

/ds18b20延迟子函数(晶振12MHz )/

void delay_18B20(unsigned int i)

{

while(i--);

}

/ds18b20初始化函数/

void Init_DS18B20(void)

{

 unsigned char x=0;

 DQ = 1;          //DQ复位

 delay_18B20(8);  //稍做延时

 DQ = 0;          //单片机将DQ拉低

 delay_18B20(80); //精确延时 大于 480us

 DQ = 1;          //拉高总线

 delay_18B20(14);

 x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

 delay_18B20(20);

}

/ds18b20读一个字节/

unsigned char ReadOneChar(void)

{

uchar i=0;

uchar dat = 0;

for (i=8;i>0;i--)

 {

  DQ = 0; // 给脉冲信号

  dat>>=1;

  DQ = 1; // 给脉冲信号

  if(DQ)

  dat|=0x80;

  delay_18B20(4);

 }

return(dat);

}

/ds18b20写一个字节/

void WriteOneChar(uchar dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

delay_18B20(5);

DQ = 1;

dat>>=1;

}

}

/读取ds18b20当前温度/

void ReadTemp(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

Init_DS18B20();

WriteOneChar(0xCC);     // 跳过读序号列号的 *** 作

WriteOneChar(0x44);  // 启动温度转换

delay_18B20(100);       // this message is wery important

Init_DS18B20();

WriteOneChar(0xCC);  //跳过读序号列号的 *** 作

WriteOneChar(0xBE);  //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

delay_18B20(100);

a=ReadOneChar();     //读取温度值低位

b=ReadOneChar();    //读取温度值高位

temp_value=b<<4;

temp_value+=(a&0xf0)>>4;

}

void temp_to_str()   //温度数据转换成液晶字符显示

{

TempBuffer[0]=temp_value/10+'0';  //十位

TempBuffer[1]=temp_value%10+'0';  //个位

TempBuffer[2]='\0';

}

/

1ms延时子程序

/

void Delay1ms(unsigned int count)

{

unsigned int i,j;

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

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

}

/延时子程序/

void mdelay(uint delay)

{ uint i;

for(;delay>0;delay--)

{for(i=0;i<62;i++) //1ms延时

{;}

}

}

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

按键扫描函数,返回扫描键值

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

void key_scan(void)                               //键盘扫描函数

{

if(start == 0)                             //如果按键按下

{

mdelay(9);                            //延时一段时间,消除键抖

while(start == 0);

    hc_start=1;

TR0=1;

led=0;

lcdreset();                    //初始化LCD屏

}

}

/18264子程序/

#define uchar unsigned char

#define uint unsigned int

//#define TURE 1

//#define FALSE 0

#define Lcd_Bus P0         //MCU P2<------> LCM

#define FIRST_ADDR 0       //定义字符/汉字显示起始位置

uchar xdata sun;

sbit RS = P2^0;

sbit RW = P2^1;

sbit E  = P2^2;

sbit RST= P2^4;

sbit PSB= P2^3;

void chk_busy();

void delay(unsigned int t);

void write_com(unsigned char cmdcode);

void write_data(unsigned char Dispdata);

void lcdreset();

void hzkdis(unsigned char code s);

void clrscreen();

void first();

/检查忙位

函 数 名:chk_busy()

功    能:检查忙位程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void chk_busy()

{  RS=0;

RW=1;

E=1;

Lcd_Bus=0xff;

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

E=0;

}

/延时子程序

函 数 名:delay()

功    能:延时子程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void delay(unsigned int t)

{  unsigned int i,j;

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

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

}

/写命令到LCD

函 数 名:write_com()

功    能:写命令到LCD程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void write_com(unsigned char cmdcode)

{

chk_busy();

RS=0;

RW=0;

E=1;

Lcd_Bus=cmdcode;

delay(5);////////////////////在数据写入的时候加入适当的延时

E=0;

delay(5);

}

/写数据到LCD

函 数 名:write_data()

功    能:写数据到LCD程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void write_data(unsigned char Dispdata)

{

chk_busy();

RS=1;

RW=0;

E=1;

Lcd_Bus=Dispdata;

delay(5);///////////////////在数据写入的时候加入适当的延时

E=0;

delay(5);

}

/

函 数 名:lcdreset()

功    能:初始化LCD屏程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void lcdreset()

{  PSB=1;

RST=0;

delay(0);

RST=1;

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);

}

/显示字符串

函 数 名:hzkdis()

功    能:显示字符串程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

/void hzkdis(unsigned char code s)

{  while(s>0)

{  write_data(s);

s++;

delay(50);

}

}  /

/显示函数

函 数 名:void display(uint a,unsigned char b,unsigned char str)

功    能:显示字符(串)程序

说    明:无

入口参数:无

返 回 值:无

设    计:           日    期:2008-03-19

修    改:                    日    期:

/

void display(uint a,unsigned char b,unsigned char str)        

{    //显示函数  显示位置为第a行第b位 显示c所代表的数

uint disaddr=0x80 ;

if(a==2) disaddr=0x90+b;

else if(a==3) disaddr=0x88+b ;

else if(a==4) disaddr=0x98+b ;

else disaddr=0x80+b ;

write_com(disaddr);

while(str!='\0')

{

write_data(str);

str++;

}

}

/

名称:主程序

论坛:>

编写:Liang yun feng

日期:

修改:无

内容:

/

#include <REG52H>

#include <intrinsh>

#include <12846c>

#include <18b20c>

#define uint unsigned int

#define uchar unsigned char

/

函 数 名:未化成时屏幕显示及时间调整

功    能:

说    明:

调    用:

入口参数:

返 回 值:无

/

void show_time()   //液晶显示程序

{

display(1,2,"欢迎使用");

display(2,1,"蓄电池化成仪");

display(4,0,"按[Star]启动化成");

Delay1ms(100);                 //扫描延时

}

/

函 数 名:化成时屏幕显示

功    能:

说    明:

调    用:

入口参数:

返 回 值:无

/

void show_time_run()   //液晶显示程序

{

time_count();  //获取时钟芯片的时间数据

ReadTemp();                    //开启温度采集程序

temp_to_str();                 //温度数据转换成液晶字符

if(hour==22)

{TR0=0,mcout_z=mcout_f=1;

 display(1,0,"本次化成已完成");

display(2,0,"电池温度");

display(2,5,TempBuffer);       //显示温度液晶字符显示位置

display(2,6,"℃");

display(3,0,"请进行后续 *** 作");

display(4,2,TimeString); //显示时间

 goto output;

}

if(temp_value>45)

{if(TR0==1)

   {TR0=0;

    mcout_f=mcout_z=1;

   }

 display(1,0,"!!电池超温!!");

display(2,0,"电池温度");

display(2,5,TempBuffer);       //显示温度液晶字符显示位置

display(2,6,"℃");

display(3,1,"化成暂停!!!!");

display(4,2,TimeString); //显示时间

}

if(temp_value<45)

{if(TR0==0)

   {TR0=1;}

 display(1,0,"化成中请等侯");

display(2,0,"电池温度");

display(2,5,TempBuffer);       //显示温度液晶字符显示位置

display(2,6,"℃");

display(3,1,"已用化成时间");

display(4,2,TimeString); //显示时间

}

output:  Delay1ms(100);                 //扫描延时

}

/

函 数 名:主程序main()

功    能:

说    明:

调    用:

入口参数:

返 回 值:无

/

main()

{

lcdreset();          //初始化LCD屏

Init_DS18B20( ) ;    //DS18B20初始化

write_com(0x01);     //清除显示,并且设定地址指针为00H

delay(5);

while(1)

{

if(hc_start==0)

{show_time();     //液晶显示数据

key_scan();  //化成启动

   }

 if(hc_start==1)

   {

    show_time_run();  //液晶显示数据

}

}

}

引脚号 引脚名称 方向 功能说明

1 VSS - 模块的电源地

2 VDD - 模块的电源正端

3 V0 - LCD驱动电压输入端

4 RS(CS) H/L 并行的指令/数据选择信号;串行的片选信号

5 R/W(SID) H/L 并行的读/写选择信号;串行的数据口

6 E(CLK) H/L 并行的使能信号;串行的同步时钟

7 DB0 H/L 数据0

8 DB1 H/L 数据1

9 DB2 H/L 数据2

10 DB3 H/L 数据3

11 DB4 H/L 数据4

12 DB5 H/L 数据5

13 DB6 H/L 数据6

14 DB7 H/L 数据7

15 PSB H/L 并/串行接口选择:H-并行;L-串行

16 NC 空脚

17 /RET H/L 复位 低电平有效

18 NC 空脚

19 LED_A (LED+5V) 背光源正极(加int?)

20 LED_K (LED-OV) 背光源负极

以上就是关于12864液晶不带字库的用C语言和51单片机编程全部的内容,包括:12864液晶不带字库的用C语言和51单片机编程、如何实现12864显示430f149单片机AD采样的波形、12864液晶程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9354369.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存