
#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液晶程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)