MSP430各系列单片机串行控制LCD12864显示头文件

合集下载

msp430程序12864头文件

msp430程序12864头文件

#ifndef __CRY12864_H__#define __CRY12864_H__#include"delay.h"extern const unsigned char shuzi_table[];#define Busy 0x80#define LCD_DataIn P5DIR=0x00 //数据口方向设置为输入#define lcd_dataout P5DIR=0XFF#define mcu2lcd_data P5OUT#define LCD2MCU_Data P5IN#define lcd_cmdout P3DIR|=0X07#define rs_h P3OUT|=BIT0#define rs_l P3OUT&=~BIT0#define rw_h P3OUT|=BIT1#define rw_l P3OUT&=~BIT1#define en_h P3OUT|=BIT2#define en_l P3OUT&=~BIT2uint i,x;/*void ifbusy() //读忙状态{uchar lcdtemp = 0;while(1){ LCD_DataIn;rs_l;rw_h;en_h;_NOP();lcdtemp = LCD2MCU_Data;en_l;if((lcdtemp&Busy)==0)break;}}*/void write_cmd(uchar cmd){//ifbusy();lcd_dataout;rs_l;rw_l;//lcd_dataout;mcu2lcd_data=cmd;delayms(5);en_h;delayms(5);en_l;}void write_data(uchar dat){lcd_dataout;//ifbusy();rs_h;mcu2lcd_data=dat;delayms(5);en_h;delayms(5);en_l;}/******************************************* 函数名称:Ini_Lcd功能:初始化液晶模块参数:无返回值:无********************************************/ /*void Ini_Lcd(void){LCD_CMDOut; //液晶控制端口设置为输出// Delay_Nms(500);Write_Cmd(0x30); //基本指令集Delay_1ms();Write_Cmd(0x02); // 地址归位Delay_1ms();Write_Cmd(0x0c); //整体显示打开,游标关闭Delay_1ms();Write_Cmd(0x01); //清除显示Delay_1ms();Write_Cmd(0x06); //游标右移Delay_1ms();Write_Cmd(0x80); //设定显示的起始地址}*/void init(){en_l;write_cmd(0x30);write_cmd(0x0c);write_cmd(0x01);}void initina2(void) //LCD显示图片(扩展)初始化程序{write_cmd(0x36); //Extended Function Set RE=1: extended instructiondelayms(1); //大于100uS的延时程序write_cmd(0x36); //Extended Function Set:RE=1: extended instruction setdelayms(1); ////大于37uS的延时程序write_cmd(0x3E); //EXFUNCTION(DL=8BITS,RE=1,G=1)delayms(1); //大于100uS的延时程序write_cmd(0x01); //CLEAR SCREENdelayms(1); //大于100uS的延时程序}/*******************************************函数名称:Clear_GDRAM功能:清除液晶GDRAM中的随机数据参数:无返回值:无********************************************/void Clear_GDRAM(void){uchar i,j,k;write_cmd(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){write_cmd(i++);write_cmd(0x80);for(k = 0;k < 16;k++){write_data(0x00);}}i = 0x80;for(j = 0;j < 32;j++){write_cmd(i++);write_cmd(0x88);for(k = 0;k < 16;k++){write_data(0x00);}}write_cmd(0x30); //回到基本指令集}/*******************************************函数名称:Disp_HZ功能:控制液晶显示汉字参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示字符个数返回值:无********************************************/void Disp_HZ(uchar addr,const uchar * pt,uchar num){uchar i;write_cmd(addr);for(i = 0;i < (num*2);i++){write_data(*(pt++));delayms(1);}}/*******************************************函数名称:Draw_TX功能:显示一个16*16大小的图形参数:Yaddr--Y地址Xaddr--X地址dp--指向图形数据存放地址的指针返回值:无********************************************/void Draw_TX(uchar Yaddr,uchar Xaddr,const uchar * dp) {uchar j;uchar k=0;// Write_Cmd(0x01); //清屏,只能清除DDRAMwrite_cmd(0x34); //使用扩展指令集,关闭绘图显示for(j=0;j<16;j++){write_cmd(Yaddr++); //Y地址write_cmd(Xaddr); //X地址write_data(dp[k++]);write_data(dp[k++]);}write_cmd(0x36); //打开绘图显示// Write_Cmd(0x30); //回到基本指令集模式}/*******************************************函数名称:DisplayGraphic功能:在整个液晶屏幕上画图参数:无返回值:无********************************************/void DisplayGraphic(const uchar *adder){int i,j;//*******显示上半屏内容设置for(i=0;i<32;i++) //{write_cmd(0x80 + i); //SET 垂直地址VERTICAL ADDwrite_cmd(0x80); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}//*******显示下半屏内容设置for(i=0;i<32;i++) //{write_cmd((0x80 + i)); //SET 垂直地址VERTICAL ADDwrite_cmd(0x88); //SET 水平地址HORIZONTAL ADDfor(j=0;j<16;j++){write_data(*adder);adder++;}}write_cmd(0x36); //打开绘图显示}#endif。

实验三 LCD12864液晶显示

实验三  LCD12864液晶显示

实验三 LCD12864液晶显示参赛序号实验题目LCD12864液晶显示实验成组员左虎博杨颂王志鹏指导教师赵勇报告日期2014年7月16日-2014年7月18日摘要:本设计以超低功耗MSP430单片机为微控制器,以4位/8位并行,2线或3线串行多种接口方式的LCD12864为输出显示器。

通过对MSP430单片机进行编程,在LCD12864上显示8×4行16×16点阵的汉字。

关键字:MSP430 LCD12864目录一.方案论证 (4)液晶显示器的论证与选择 (4)二.LCD12864的工作原理 (4)1.引脚功能说明 (4)LCD12864采用20接口,各引脚接口说明如表3所示: (4)2. 指令说明 (5)三.实验框图和电路图 (7)1. 系统框图 (7)2. 电路原理图 (7)四.实验程序设计 (7)五.系统测试 (11)1. 测试方案 (11)2. 测试结果 (11)3. 测试分析与结论 (12)一.方案论证液晶显示器的论证与选择方案一:采用带中文字库的LCD12864。

LCD12864具有4 位/8 位并行、2 线或3 线串行多种接口方式,可以显示8×4 行16×16 点阵的汉字。

也可完成图形显示。

低电压低功耗是其一显著特点。

方案二:采用LCD1602。

LCD1602显示内容为16X2,即可以显示两行,每行16个字符液晶模块,只能显示字符和数字。

通过论证可知LCD12864显示内容多,功能多,低电压低功耗,因此选用方案一。

二.LCD12864的工作原理1.引脚功能说明LCD12864采用20接口,各引脚接口说明如表1所示:表1 引脚说明表管脚号管脚名称电平管脚功能描述1 VSS 0V 电源地2 VCC 3.0+5V 电源正3 V0 - 对比度(亮度)调整4 RS(CS)H/LRS=“H”,表示DB7——DB0为显示数据RS=“L”,表示DB7——DB0为显示指令数据5 R/W(SID)H/LR/W=“H”,E=“H”,数据被读到DB7——DB0R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR6 E(SCLK) H/L 使能信号7 DB0 H/L 三态数据线表1 引脚说明表注释1:如在实际应用中仅使用串口通讯模式,可将PSB 接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。

MSP430程序库(三)12864液晶程序库

MSP430程序库(三)12864液晶程序库
6 E(SCL I Enable Signal,高电平有效 K)
7 DB0 I/O 数据0
8 DB1 I/O 数据1
9 DB2 I/O 数据2
10 DB3 I/O 数据3
11 DB4 I/O 数据4
12 DB5 I/O 数据5
13 DB6 I/O 数据6
14 DB7 I/O 数据7
15 PSB I H:Parallel Mode L:Serial Mode
voidmain( void) {
// Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; ClkInit(); LcdInit(); LcdWriteString(0x90,"1 abcd 你好啊");
}
这个函数运行后,将在第二行显示源自1 abcd 你好啊 字符串,如果把1后面的空格去掉,中 文部分将是乱码。ClkInit(); 这个函数和前面一个里面调用的一样,把主系统时钟设为 8MHz,SMCLK 设为1MHz。 有关详细内容参见程序库,mian.c。
SET_EN; _NOP(); CLR_EN;
} 同样,调用这个函数也可以向其他 RAM 写入数据,完成相应操作。
o 写入命令: 向模块写入命令。
写入命令可以通过液晶的指令集,控制液晶完成相应的功能。程序如下: voidLcdWriteComm(charcmd) { WaitForEnable(); //检测忙信号?
变回0(内部空闲,可以接受命令)。 o 写入数据: 向模块内部 RAM 写入数据。
写入数据到 DDRAM 即可显示到液晶,写入函数: voidLcdWriteData(chardata) { WaitForEnable();

MSP430单片机驱动12864液晶程序

MSP430单片机驱动12864液晶程序

MSP430单片机驱动12864液晶程序#include <msp430g2553.h>typedef unsigned char uchar;typedef unsigned int uint;#define LCD_PORT_DIR P2DIR //定义P2口#define LCD_PORT_OUT P2OUT#define CS BIT0#define SID BIT1#define SCLK BIT2#define LCD_OUT LCD_PORT_DIR |= CS + SID + SCLK //定义P2.0~2.2为输出#define CS_H LCD_PORT_OUT |= CS#define CS_L LCD_PORT_OUT &= ~CS#define SID_H LCD_PORT_OUT |= SID#define SID_L LCD_PORT_OUT &= ~SID#define SCLK_H LCD_PORT_OUT |= SCLK#define SCLK_L LCD_PORT_OUT &= ~SCLKvoid Delay_1ms(void);void Delay_Nms(uint n);void Write_1byte(uint RW,uint RS,uchar data);void Write_8bits(uchar bit);void Write_Cmd(uchar cmd);void Write_Dat(uchar dat);void Write_Datas(uchar *s);void Disp_Img(uchar *img);void Lcd_Init(void);void Locat_XY(uint x,uint y);void Write_Str(uint x,uint y,uchar *s);void Write_Str1(uint x,uint y, uchar q);//unsigned int SZ_bl[]={48,49,50,51,52,53,54,55,56,57};/*******************************************函数名称:Delay_1ms功能:延时约1ms的时间参数:无返回值:无********************************************/ void Delay_1ms(void){uchar i;for(i = 150;i > 0;i--);}/*******************************************函数名称:Delay_Nms功能:延时约N个1ms的时间参数:n--延时长度返回值:无********************************************/ void Delay_Nms(uint n){uint i;for(i = n;i > 0;i--) Delay_1ms();}/*******************************************函数名称:Write_1byte功能:向LCD写1byte数据参数:RW--读写控制,RS--数据命令控制data--数据RW:0为写,1为读RS:0为命令,1为数据返回值:无********************************************/ void Write_1byte(uint RW,uint RS,uchar data){uchar H_data,L_data,ID = 0xf8;if(RW == 1) ID = ID + 0x04;if(RS == 1) ID = ID + 0x02;H_data = data;H_data &= 0xf0;L_data = data;L_data &= 0x0f;L_data <<= 4;Write_8bits(ID);Delay_1ms();Write_8bits(H_data);Delay_1ms();Write_8bits(L_data);Delay_1ms();}/*******************************************函数名称:Write_8bits功能:向LCD连续写8bits数据参数:bit--数据返回值:无********************************************/ void Write_8bits(uchar bit){uint i;for(i=0;i<8;i++){if(bit & 0x80) SID_H;else SID_L;SCLK_H;bit <<= 1;SCLK_L;}}/*******************************************函数名称:Write_Cmd功能:向LCD写控制命令参数:cmd--控制命令返回值:无********************************************/ void Write_Cmd(uchar cmd){CS_L;_NOP();CS_H;_NOP();Write_1byte(0,0,cmd);Delay_1ms();CS_L;}/*******************************************函数名称:Write_Dat功能:向LCD写显示数据参数:dat--显示数据返回值:无********************************************/void Write_Dat(uchar dat){CS_L;_NOP();CS_H;_NOP();Write_1byte(0,1,dat);Delay_1ms();CS_L;_NOP();}/*******************************************函数名称:Lcd_Init功能:液晶初始化参数:无返回值:无********************************************/void Lcd_Init(void){Delay_Nms(500);Write_Cmd(0x30); //基本指令集Delay_1ms();Write_Cmd(0x02); //地址归位Delay_1ms();Write_Cmd(0x0c); //整体显示打开,游标关闭Delay_1ms();Write_Cmd(0x01); //清除显示Delay_1ms();Write_Cmd(0x06); //游标右移Delay_1ms();Delay_1ms();}/*******************************************函数名称:Locat_XY功能:设置液晶显示地址参数:x--行地址,y--列地址0<=x<=3,0<=y<=7返回值:无********************************************/ void Locat_XY(uint x,uint y){switch(y){case 0:Write_Cmd(0x80+x);break;case 1:Write_Cmd(0x90+x);break;case 2:Write_Cmd(0x88+x);break;case 3:Write_Cmd(0x98+x);break;default:break;}}/*******************************************函数名称:Write_Datas功能:写字符串数据参数:*s--字符串数组返回值:无********************************************/ void Write_Datas(uchar *s){char i;while(*s>0){Write_Dat(*s);s++;for(i=10;i>0;i--);}}/*******************************************函数名称:Write_Str功能:向指定起始坐标写字符串参数:x--行地址,y--列地址,*s--字符串数组0<=x<=3,0<=y<=7返回值:无********************************************/void Write_Str(uint x,uint y, uchar *s){Locat_XY(x,y);Write_Datas(s);}/*******************************************函数名称:Write_Str1功能:向指定起始坐标写变量参数:x--行地址,y--列地址,q--字符串数组ASCll码值0<=x<=3,0<=y<=7返回值:无********************************************/void Write_Str1(uint x,uint y, uchar q){Locat_XY(x,y);Write_Dat(q);}/*******************************************函数名称:Disp-Img功能:显示图片参数:*img--图片数组返回值:无********************************************/void Disp_Img(uchar *img){uint j=0;uchar x,y;for(y=0;y<32;y++) //垂直坐标32位for(x=0;x<8;x++) //水平坐标16字{Write_Cmd(0x36); //开启扩展指令集Write_Cmd(y+0x80); //先写入垂直坐标Write_Cmd(x+0x80); //再写入水平坐标Write_Cmd(0x30); //基本指令集Write_Dat(img[j++]);Write_Dat(img[j++]);}for(y=0;y<32;y++) //垂直坐标32位for(x=0;x<8;x++) //水平坐标16字{Write_Cmd(0x36); //开启扩展指令集Write_Cmd(y+0x80); //先写入垂直坐标Write_Cmd(x+0x88); //在写入水平坐标Write_Cmd(0x30); //基本指令集Write_Dat(img[j++]);Write_Dat(img[j++]);}}。

MSP430F149四路输出12864显示

MSP430F149四路输出12864显示

#include <msp430f149.h>#define Num_of_Results 8#define BIT(x) (1 << (x))#define uchar unsigned char#define uint unsigned intuchar shuzi[] = {"0123456789."};const uchar *ptr[10];static uint results[Num_of_Results]; //保存ADC转换结果的数组static uint results1[Num_of_Results]; //保存ADC转换结果的数组static uint results2[Num_of_Results]; //保存ADC转换结果的数组static uint results3[Num_of_Results]; //保存ADC转换结果的数组void Trans_val(uint Hex_Val);void Trans_val1(uint Hex_V al);void Trans_val2(uint Hex_V al);void Trans_val3(uint Hex_V al);extern const unsigned char shuzi_table[];void Send(uchar type,uchar transdata);/**********液晶控制IO的宏定义*************/#define cyCS 0 //P3.0,片选信号#define cySID 1 //P3.1,串行数据#define cyCLK 2 //P3.2,同步时钟#define cyPORT P3OUT#define cyDDR P3DIR/*******************************************函数名称:delay_Nus功能:延时N个us的时间参数:n--延时长度返回值:无********************************************/void delay_Nus(uint n){uchar i;for(i = n;i > 0;i--)_NOP();}/*******************************************函数名称:delay_1ms功能:延时约1ms的时间参数:无返回值:无********************************************/void delay_1ms(void){uchar i;for(i = 150;i > 0;i--) _NOP();}/*******************************************函数名称:delay_Nms功能:延时N个ms的时间参数:无返回值:无********************************************/void delay_Nms(uint n){uint i = 0;for(i = n;i > 0;i--)delay_1ms();}/*******************************************函数名称:Ini_Lcd功能:初始化液晶模块参数:无返回值:无********************************************/void Ini_Lcd(void){cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS); //相应的位端口设置为输出delay_Nms(100); //延时等待液晶完成复位Send(0,0x30); /*功能设置:一次送8位数据,基本指令集*/delay_Nus(72);Send(0,0x02); /*DDRAM地址归位*/delay_Nus(72);Send(0,0x0c); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/delay_Nus(72);Send(0,0x01); /*清屏,将DDRAM的位址计数器调整为“00H”*/delay_Nus(72);Send(0,0x06); /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/ delay_Nus(72);}/*******************************************函数名称:Send功能:MCU向液晶模块发送1一个字节的数据参数:type--数据类型,0--控制命令,1--显示数据transdata--发送的数据返回值:无********************************************/void Send(uchar type,uchar transdata){uchar firstbyte = 0xf8;uchar temp;uchar i,j = 3;if(type) firstbyte |= 0x02;cyPORT |= BIT(cyCS);cyPORT &= ~BIT(cyCLK);while(j > 0){if(j == 3) temp = firstbyte;else if(j == 2) temp = transdata&0xf0;else temp = (transdata << 4) & 0xf0;for(i = 8;i > 0;i--){if(temp & 0x80) cyPORT |= BIT(cySID);else cyPORT &= ~BIT(cySID);cyPORT |= BIT(cyCLK);temp <<= 1;cyPORT &= ~BIT(cyCLK);}//三个字节之间一定要有足够的延时,否则易出现时序问题if(j == 3) delay_Nus(600);else delay_Nus(200);j--;}cyPORT &= ~BIT(cySID);cyPORT &= ~BIT(cyCS);}/*******************************************函数名称:Clear_GDRAM功能:清除液晶GDRAM内部的随机数据参数:无返回值:无********************************************/void Clear_GDRAM(void){uchar i,j,k;Send(0,0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x80);for(k = 0;k < 16;k++){Send(1,0x00);}}i = 0x80;for(j = 0;j < 32;j++){Send(0,i++);Send(0,0x88);for(k = 0;k < 16;k++){Send(1,0x00);}}Send(0,0x30); //回到基本指令集}/*******************************************函数名称:Disp_HZ功能:显示汉字程序参数:addr--显示位置的首地址pt--指向显示数据的指针num--显示数据的个数返回值:无********************************************/void Disp_HZ(uchar addr,const uchar * pt,uchar num){uchar i;Send(0,addr);for(i = 0;i < (num*2);i++)Send(1,*(pt++));}/*********************************************************** *名称:LCD_pos()*功能:设置液晶的显示位置*入口参数:x:第几行,1~4对应第1行~第4行* y:第几列,0~15对应第1列~第16列*出口参数:无*范例:LCD_pos(2,3) //第二行,第四列***********************************************************/ void LCD_pos(uchar x,uchar y){uchar pos;switch(y){case 1:pos=0x80;break;case 2:pos=0x90;break;case 3:pos=0x88;break;case 4:pos=0x98;break;default:pos=0x80;}pos += x;Send(0,pos);}void Write_pos(uchar y,uchar x) //写地址等效LCD_pos(){LCD_pos(y,x);}void Set_pos(uchar y,uchar x) //按自然习惯设置行列位置{LCD_pos(y,x);}/*******************************************函数名称:Disp1Char功能:在某个位置显示一个字符参数:x--位置的列坐标y--位置的行坐标data--显示的字符数据返回值:无********************************************/void Disp1Char(uchar x,uchar y,uchar data){LCD_pos( x, y );Send( 1,data );}/************************主函数****************************/ void main(void){WDTCTL = WDTPW+WDTHOLD; //关闭看门狗/*下面六行程序关闭所有的IO口*/P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;P3DIR = 0XFF;P3OUT = 0XFF;P4DIR = 0XFF;P4OUT = 0XFF;P5DIR = 0XFF;P5OUT = 0XFF;P6DIR = 0XFF;P6OUT = 0XFF;Ini_Lcd();delay_Nms(100);Clear_GDRAM();delay_Nms(100);P6SEL |= 0x0f; // 使能ADC通道ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打开ADC,设置采样时间ADC12CTL1 = SHP+CONSEQ_3; // 使用采样定时器ADC12MCTL0 = INCH_0;ADC12MCTL1 = INCH_1;ADC12MCTL2 = INCH_2;ADC12MCTL3 = INCH_3+EOS;ADC12IE = 0x08; // 使能ADC中断ADC12IFG = 0x08;ADC12CTL0 |= ENC; // 使能转换ADC12CTL0 |= ADC12SC; // 开始转换_EINT();_BIS_SR(LPM0_bits+GIE);}/*******************************************函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算P6.0口的模拟电压数值参数:无返回值:无********************************************/#pragma vector=ADC_VECTOR__interrupt void ADC12ISR (void){static uint index = 0;results[index++] = ADC12MEM0; // Move resultsif(index == Num_of_Results){uchar i;unsigned long sum = 0;index = 0;for(i = 0; i < Num_of_Results; i++){sum += results[i];}sum >>= 3; //除以8Trans_val(sum);}static uint index1 = 0;results1[index1++] = ADC12MEM1; // Move results if(index1 == Num_of_Results){uchar i1;unsigned long sum1 = 0;index1 = 0;for(i1 = 0; i1 < Num_of_Results; i1++){sum1 += results1[i1];}sum1>>= 3; //除以8Trans_val1(sum1);}static uint index2 = 0;results2[index2++] = ADC12MEM2; // Move results if(index2 == Num_of_Results){uchar i2;unsigned long sum2 = 0;index2 = 0;for(i2 = 0; i2 < Num_of_Results; i2++){sum2 += results2[i2];}sum2>>= 3; //除以8Trans_val2(sum2);}static uint index3 = 0;results3[index3++] = ADC12MEM3; // Move resultsif(index3 == Num_of_Results){uchar i3;unsigned long sum3 = 0;index3 = 0;for(i3 = 0; i3 < Num_of_Results; i3++){sum3 += results3[i3];}sum3>>=3; //除以8Trans_val3(sum3);}}/*******************************************函数名称:Trans_val功能:将16进制ADC转换数据变换成三位10进制真实的模拟电压数据,并在液晶上显示参数:Hex_V al--16进制数据n--变换时的分母等于2的n次方返回值:无********************************************/void Trans_val(uint Hex_Val){unsigned long caltmp;uint Curr_Volt;uchar t,i;uchar ptr[4];caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_V al * 33 caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_V olt = caltmp / 2^n ptr[0] = Curr_V olt / 100; //Hex->Dec变换t = Curr_V olt - (ptr[0] * 100);ptr[2] = t / 10;ptr[3] = t - (ptr[2] * 10);ptr[1] = 10; //shuzi表中第10位对应符号"."//在液晶上显示变换后的结果for(i = 0;i < 4;i++)Disp1Char((0+i),1,shuzi[ptr[i]]);}void Trans_val1(uint Hex_V al){unsigned long caltmp;uint Curr_Volt;uchar t1,i;uchar ptr[4];caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_V al * 33caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_V olt = caltmp / 2^nptr[0] = Curr_V olt / 100; //Hex->Dec变换t1 = Curr_Volt - (ptr[0] * 100);ptr[2] = t1 / 10;ptr[3] = t1 - (ptr[2] * 10);ptr[1] = 10; //shuzi表中第10位对应符号"."//在液晶上显示变换后的结果for(i = 0;i < 4;i++)Disp1Char((0+i),2,shuzi[ptr[i]]);}void Trans_val2(uint Hex_V al){unsigned long caltmp;uint Curr_Volt;uchar t2,i;uchar ptr[4];caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_V al * 33caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_V olt = caltmp / 2^nptr[0] = Curr_V olt / 100; //Hex->Dec变换t2 = Curr_Volt - (ptr[0] * 100);ptr[2] = t2 / 10;ptr[3] = t2 - (ptr[2] * 10);ptr[1] = 10; //shuzi表中第10位对应符号"."//在液晶上显示变换后的结果for(i = 0;i < 4;i++)Disp1Char((0+i),3,shuzi[ptr[i]]);}void Trans_val3(uint Hex_V al){unsigned long caltmp;uint Curr_Volt;uchar t3,i;uchar ptr[4];caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_V al * 33caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_V olt = caltmp / 2^nptr[0] = Curr_V olt / 100; //Hex->Dec变换t3 = Curr_Volt - (ptr[0] * 100);ptr[2] = t3 / 10;ptr[3] = t3 - (ptr[2] * 10);ptr[1] = 10; //shuzi表中第10位对应符号"."//在液晶上显示变换后的结果for(i = 0;i < 4;i++)Disp1Char((0+i),4,shuzi[ptr[i]]);}。

LCD12864并行头文件

LCD12864并行头文件
/***************************************************************
lcd12864par头文件
LCD12864并口操作函数声明
作者:天道酬勤,2012、2、14整理
修改:2012、2、15
添加条件编译命令
#define __NUMASC__ //显示数字需要的宏定义
#ifndef __LCD12864PAR_H__
#define __LCD12864PAR_H__
#include <REGX52.H>
#include <math.h>
#include "mytypedef.h"
#include "delay.h"
//普中开发板
//#define io12864 P0
//LCD字符串处理函数
extern void Dis12864Str (u8 addr,u8 *str);
//LCD整形数据显示函数 (2012、8、10修改添加)
extern void Dis12864int2 (u8 addr,u8 int2);
extern void Dis12864int4 (u8 addr,u16 int4);
extern void Dis12864float_2_2 (u8 addr,float f_dat,u8 space);
extern void Dis12864float2_3 (u8 addr,float f_dat);
extern void Dis12864float3_1_ (u8 addr,float f_dat,u8 space);

LCD12864串行显示文件

LCD12864串行显示文件1、LCD12864.c文件//===================================== ==========================#include "LCD12864.h"#include/**** 串行控制 *****************/sbit RS = P1^0;sbit RW = P1^1;sbit EN = P1^2;/*-----LCD12864相关声明---------*/#define com_byte 0#define dat_byte 1uchar lcdPosX, lcdPosY; //X,Y坐标uchar halfScr, halfLineCnt, basicBlock; //半屏,半屏行数,N*8块/************************************************************** 函数名称:void LCD12864_Delay_Ms (uchar ms)函数功能: LCD12864延时函数**************************************************************/ void LCD12864_Delay_Ms (uchar ms){uchar i;while (--ms){for (i = 0; i < 125; i++);}/************************************************************** 函数名称:void LCD12864_Write_Byte(uchar byte)函数功能: 写字节**************************************************************/ void LCD12864_Write_Byte(uchar byte){uchar i;for(i = 0; i < 8; i++){EN = 0;byte <<= 1;RW = CY;EN = 1;}}/************************************************************** 函数名称:uchar LCD12864_Read_Byte(void)函数功能: 读字节*************************************************************** /uchar LCD12864_Read_Byte(void){uchar i,temp1,temp2;temp1 = 0;temp2 = 0;for(i = 0; i < 8; i++)temp1 = temp1 << 1;EN = 0;EN = 1;EN = 0;if(RW) temp1++;}for(i=0;i<8;i++){temp2=temp2<<1;EN = 0;EN = 1;EN = 0;if(RW) temp2++;}return ((0xf0 & temp1) + (0x0f & temp2));}/************************************************************** 函数名称:void LCD12864_Is_Busy( void )函数功能: 检测忙函数**************************************************************/ void LCD12864_Is_Busy( void ){doLCD12864_Write_Byte(0xfc); //11111,RW(1),RS(0),0while(0x80 & LCD12864_Read_Byte());}/**************************************************************函数名称:void LCD12864_Write(bit dat_byte_com_byte,uchar byt)函数功能: 写入函数*************************************************************** /void LCD12864_Write(bit dat_byte_com_byte, uchar byt){uchar temp;if(dat_byte_com_byte == 0) //为零,写入指令temp = 0xf8; //11111,RS(0),RW(0),0else //否则,写入数据temp = 0xfa; //11111,RS(1),RW(0),0RS = 1;LCD12864_Is_Busy();LCD12864_Write_Byte(temp);LCD12864_Write_Byte(byt & 0xf0); //写入高四位LCD12864_Write_Byte(byt << 4); //写入低四位RS = 0;}/************************************************************** 函数名称:void LCD12864_Clear_Display (void)函数功能: LCD12864 显示清屏*************************************************************** /void LCD12864_Clear_Display (void){LCD12864_Write(com_byte,0x01);}/**************************************************************函数名称:void LCD12864_Write_Position (void)函数功能: LCD12864 显示位置*************************************************************** /void LCD12864_Write_Position (void){LCD12864_Write(com_byte,0x34);LCD12864_Write(com_byte,lcdPosY);LCD12864_Write(com_byte,lcdPosX);LCD12864_Write(com_byte,0x30);}/************************************************************** 函数名称:void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls)函数功能: LCD12864 显示一张图片*************************************************************** /void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls) {lcdPosX = 0x80;halfScr = 2;for (; halfScr != 0; halfScr--){lcdPosY = 0x80;halfLineCnt = 32;for (; halfLineCnt != 0; halfLineCnt--){basicBlock = 16;LCD12864_Write_Position();for (; basicBlock != 0; basicBlock--){if (bmpCls == 0){LCD12864_Write(dat_byte, *bmp++);}else if (bmpCls == 1){LCD12864_Write(dat_byte, 0x00);}}lcdPosY++;}lcdPosX = 0x88;}LCD12864_Write(com_byte, 0x36);LCD12864_Write(com_byte, 0x30);}/************************************************************** 函数名称:void convertChar (uchar CX, CY, width)* 字符反白显示* 输入参数:CX=要反白字符的行(0-3)* CY=要反白字符的列(0-7)* width=要反白字符的长度(1-16)函数功能: 转换成字符*************************************************************** /void convertChar (uchar CX, CY, width){LCD12864_DisplayPhoto(0,1);lcdPosY = 0x80;if (CX == 0){CX = 0x80;halfLineCnt = 16;}else if (CX == 1){CX = 0x80;halfLineCnt = 32;}else if (CX == 2){CX = 0x88;halfLineCnt = 16;}else if (CX == 3){CX = 0x88;halfLineCnt = 32;}lcdPosX = CX + CY;for (; halfLineCnt != 0; halfLineCnt--){basicBlock = width;LCD12864_Write_Position();for (; basicBlock != 0; basicBlock--){if (halfLineCnt > 16){LCD12864_Write(dat_byte, 0x00);}else{LCD12864_Write(dat_byte, 0xff);}}lcdPosY++;}LCD12864_Write(com_byte, 0x36);LCD12864_Write(com_byte, 0x30);}/************************************************************** 函数名称:void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg)函数功能: LCD12864 显示字符串/void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg){if (X == 0){X = 0x80;}else if (X == 1){X = 0x90;}else if (X == 2){X = 0x88;}else if (X == 3){X = 0x98;}Y = X + Y;LCD12864_Write(com_byte, Y);while (*msg){LCD12864_Write(dat_byte, *msg++);LCD12864_Delay_Ms(speed);}}函数名称:void init_12864(void)函数功能:初始化12864*************************************************************** /void init_12864(void){LCD12864_Write(com_byte, 0x30); //基本指令功能.LCD12864_Write(com_byte, 0x0c); //显示打开,关光标,反白关.LCD12864_Write(com_byte, 0x01); //清屏指令.LCD12864_Write(com_byte, 0x06); //AC自动加一LCD12864_Write(com_byte, 0x80);}2、LCD12864.h文件//===================================== ==========================#ifndef __LCD12864_H__#define __LCD12864_H__#define uchar unsigned char#define uint unsigned int/************************************************************** 函数名称:void LCD12864_Write(bit dat_byte_com_byte,uchar byt)函数功能: 写入函数*************************************************************** /void LCD12864_Write(bit dat_byte_com_byte, uchar byt);/************************************************************** 函数名称:void LCD12864_Clear_Display (void)函数功能: LCD12864 显示清屏*************************************************************** /void LCD12864_Clear_Display (void);/************************************************************** 函数名称:void LCD12864_Write_Position (void)函数功能: LCD12864 显示位置*************************************************************** /void LCD12864_Write_Position (void);/************************************************************** 函数名称:void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls)函数功能: LCD12864 显示一张图片*************************************************************** /void LCD12864_DisplayPhoto (uchar *bmp, uchar bmpCls);/************************************************************** 函数名称:void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg)函数功能: LCD12864 显示字符串*************************************************************** /void LCD12864_Display_String(uchar X, uchar Y, uchar speed, uchar *msg);/************************************************************** 函数名称:void init_12864(void)函数功能:初始化12864*************************************************************** /void init_12864(void);#endif。

LCD模块SMG12864与MSP430的接口及应用[1]

LCD 模块SMG 12864与MSP430的接口及应用刘 莉1,钟 金2,王 维1(1.长沙理工大学 湖南长沙 410076;2.中南大学 湖南长沙 410083)摘 要:介绍了一种显示终端的设计方法,并根据SM G 12864点阵液晶显示模块的特点,结合MSP430超低功耗单片机,论述了点阵液晶显示的编程方法,给出了SM G 12864与MSP430F149的硬件接口电路和显示程序流程图。

此终端具有硬件电路简单、紧凑的特点。

实践证明,他比一般数码显示终端功耗降低幅度较大,运行可靠,在智能人工腿系统中得到了很好的应用。

关键词:液晶显示;MSP430微处理器;SM G 12864;接口中图分类号:TN87 文献标识码:B 文章编号:1004373X (2007)0716903Interface of SMG 12864LCD Module with MSP430and Its ApplicationL IU Li 1,ZHON G Jin 2,WAN G Wei 1(1.Changsha University of Science and Technology ,Changsha ,410076,China ;2.Central South University ,Changsha ,410083,China )Abstract :This paper presents a design method for a kind of display terminal and explains the programming method of dot -matrix LCD according to characteristics of SMG 12864LCD module and MSP430F149single chip.The hardware interface circuit of SMG 12864LCD module with MSP430F149and the display program flow chart are given.The terminal makes the connection scheme easy and brief.C ompared with those common digital display method ,the system has many definite advantages such as lower power consume ,higher reliability and it is applied successfully in the intelligent artificial leg system.K eywords :L CD ;MSP430microprocessor ;SM G 12864L CD ;interface收稿日期:200609261 引 言作为仪器仪表的信息显示及人机交互的界面,LCD 液晶显示器件具有低压、低功耗、信息显示量大以及使用寿命长等特点。

MSP430单片机与液晶显示器的串行接口方案设计(一)

MSP430单片机与液晶显示器的串行接口方案设计(一) 1概述点阵式液晶与外部的硬件接口简单,能以点阵或图形方式显示出各种信息,因此在电子设计中得到广泛应用。

但是,对它的接口设计必须遵循一定的硬件和时序规范,不同的液晶显示驱动器,可能需要采用不同的接口方式和控制指令才能够实现所需信息的显示。

某些液晶显示驱动器与外部的接口必须采用串行方式,而其串行接口往往不是标准的串行接口,这就为这类液晶显示驱动器的设计带来了困难。

针对上述问题,本文提出一种利用微控制器(MCU)的I/O端口,通过软件设计模拟与所使用的液晶显示驱动器规范相符的串行总线的设计思想,实现MCU对液晶显示驱动器的控制,从而建立起一套不但可以显示各种字符,而且可以动态显示曲线的游人显示系统。

2系统设计本文所建立的液晶显示系统,选用美国德州仪器(TI)公司的MSP430F149微控制器来控制液晶显示驱动器uPD16682A,从而实现各种信息的显示。

2.1MSP430F14X微控制器简介TI公司的MSP430F14X微控制器与其它MSP430系列微控制器相同,均甚至一个真正的正交16位RISCCPU内核:具有16个可单周期全寻址的16位寄存器,仅27条的精简指令集以及7种均采用双重取数据技术(DDFT)的一致性寻址方式。

DDFT技术利用每个时钟脉冲对存储器进行两次数据存取操作。

从而不再需要复杂的时钟乘法和指令流水线方案。

MSP430F14X系列MCU片内不但包括60多KB的Flash、2KB的RAM、一个看门狗时钟、12位16通道的A/D转换器、定时器、高精度比较器、PWM以及高速的USART控制器等常用资源,还在某些型号中集成了LCD控制器。

其I/O资源丰富,且每个输入/输出(I/O)引脚上都提供了矢量中断功能,每个外围器件都支持复杂的事件驱动型操作。

同其它微控制器相,带片内Flash的微控制器可将系统功耗降低5倍,并且减小了硬件线路板空间,与现代程序设计技术(如计算分支以及高级语言(如C语言)结合使用,使得MSP430的体系结构更为高效。

用430-spi控制的12864程序

#include <msp430x14x.h>//#define RSH P3OUT|=BIT0 //P5.0//#define RSL P3OUT&=~BIT0 //P5.0//#define RWH P3OUT|=BIT1 //P5.1//#define RWL P3OUT&=~BIT1 //P5.1//#define EH P3OUT|=BIT2 //P5.2//#define EL P3OUT&=~BIT2 //P5.2unsigned char ee[]={0xFF,0xFF,0xFF,0xff,0xFF,0xFF,0xff,0x18,0xbd,0xDB,0xDB,0xD7,0xE7,0xEF,0xEF,0x1F,0xFF,0xFF,0xFF,0x3F,0xBF,0xBF,0xBF,0xA3,0x9D,0xBD,0xBD,0xBD, 0xBD,0x18,0xFF,0xFF};// FFH FFH FFH FFH FFH FFH FFH 18H BDH DBH DBH D7H E7H EFH EFH 1FH;"y",0// DB FFH FFH FFH 3FH BFH BFH BFH A3H 9DH BDH BDH BDH BDH 18H FFH FFH;void delay(char t)// 延时函数{ unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<15;j++);}//测忙//void chk_busy()//{// P3OUT |= 0x01;// TXBUF0 = 0xfc;// delay(1);// TXBUF0 = 0x00;// delay(1);// TXBUF0 =0x00;// delay(1);//P3OUT &= ~0x01; // Latch data into 'HC165// P3OUT |= 0x01;// P4DIR=0X00;// RSL;/// RWH;// EH;// _NOP();// while((P4IN&0x80)==0x80);// / EL;// P4DIR=0XFF;//}void lcd_enable(char x)//LCD显示设置{P3OUT |= 0x01;//chk_busy();TXBUF0 = 0xf8;delay(1);TXBUF0 = 0xf0&x;delay(1);TXBUF0 = x<<4;delay(1);}void write(char x)//写一个字节数据函数{P3OUT |= 0x01;TXBUF0 = 0xfa;delay(1);TXBUF0 = 0xf0&x;delay(1);TXBUF0 = x<<4;delay(1);}void init()//LCD初始化函数{lcd_enable(0x30);//八位、基本指令lcd_enable(0x0c); //打开显示开关lcd_enable(0x01); //清除显示// lcd_enable(0x02);//地址归零// lcd_enable(0x14);//游标右移lcd_enable(0x06); //右移// lcd_enable(0x46);//右移// lcd_enable(0x81);}void write_0(int x,int y,char* s){lcd_enable(0x02);//地址归零char address;switch(x){ case 0: address = 0x80 + y; break;case 1: address = 0x90 + y; break;case 2: address = 0x88 + y; break;case 3: address = 0x98 + y; break;default: return;}lcd_enable(address);while (*s){write(*s++);}}void fan(){lcd_enable(0x34); //打开扩展指令集lcd_enable(0x05);lcd_enable(0x30); //回到基本指令集}void Clear_GDRAM(void){char i,j,k;lcd_enable(0x34); //打开扩展指令集i = 0x80;for(j = 0;j < 32;j++){lcd_enable(i++);lcd_enable(0x80);for(k = 0;k < 16;k++){write(0x00);}}i = 0x80;for(j = 0;j < 32;j++){lcd_enable(i++);lcd_enable(0x88);for(k = 0;k < 16;k++){write(0x00);}}lcd_enable(0x30); //回到基本指令集}void Draw_TX(unsigned char Yaddr,unsigned char Xaddr,const unsigned char * dp) {char j;char k = 0;lcd_enable(0x34); //使用扩展指令集,关闭绘图显示for(j = 0;j < 16;j++){lcd_enable(Yaddr++); //Y地址lcd_enable(Xaddr); //X地址write(dp[k++]); //送两个字节的显示数据write(dp[k++]);}lcd_enable(0x36); //打开绘图显示lcd_enable(0x30); //回到基本指令集模式}void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;/*下面六行程序关闭所有的IO口*/P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;P3DIR = 0XFF;P3OUT = 0XFF;P4DIR = 0XFF;P4OUT = 0XFF;P5DIR = 0XFF;P5OUT = 0XFF;P6DIR = 0XFF;P6OUT = 0XFF;ME1 |= USPIE0; // Enable USART0 SPI modeUCTL0 |= CHAR + SYNC + MM; // 8-bit SPI Master **SWRST** UTCTL0 |= CKPH + SSEL1 + SSEL0 + STC; // SMCLK, 3-pin mode,P3.1,3-SID,SCLK UBR00 = 0x02; // UCLK/2UBR10 = 0x00; // 0UMCTL0 = 0x00; // no modulationUCTL0 &= ~SWRST; // Initialize USART state machineP3SEL |= 0x0E; // P3.1-3 SPI option selectP3DIR |= 0x01; // P3.0 output directioninit();Clear_GDRAM();Draw_TX(0x81,0x81,ee);write_0(0,3,"你好");fan();write_0(1,3,"你好");write_0(2,1,"欢迎使用123");write_0(3,3,"你好");while(1);/* P1=0x00;write_0(1,3,"你好");write_0(2,1,"欢迎使它");while(1){if(P1&0x01)write_0(2,4,"对了");if(P1&0x02){lcd_enable(0x01); //清除显示lcd_enable(0x02);//地址归零write_0(2,3,"已清空");}}*/}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档