MSP430控制段式液晶
- 格式:doc
- 大小:25.00 KB
- 文档页数:2
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++]);}}。
6th International Conference on Sensor Network and Computer Engineering (ICSNCE 2016)Design of LCD Electric Circuit Segments Basic on MSP430Jian HuangXijing University, Xi'an 710123, ChinaKeywords: Segments LCD; MSP430; Display memory; 4-MUXAbstract. Display device is very important equipment in the instrument. LED display have limited in complex driving circuit, high dissipation, big size. In order to resolve this problem, a segments LCD drive circuit is introduced, which based on ultra-low-power MSP430, using the built-in LCD controller, can drive the 160 segment LCD. The segments LCD’s type is EDS826, it has 6 bits 8 segments LCD, display principle and 4-MUX driving methods of segments LCD is given in detail. It has design drive circuit and give software flow chart. The test results show that the device can clearly display letters and numbers, have low power dissipation, simplifies design of drive circuit, can be used in the instrument to display temperature, humidity and pressure message. IntroductionCode of LCD, or a liquid crystal screen, generally called pattern type LCD screen, each segment of the electrode includes 7 segments and a back electrode BP (or COM), you can display numbers and simple characters, digit and character corresponding to its corresponding [1-3]. Compared with the digital tube segment code, the price is basically the same, the performance and the driving principle is quite different. Compare to LED, it’s display more clear, more realistic and has lower power consumption, the contents of the display will be more abundant. So it is often used as a display unit in the instrument and meter. Produced by TI company ultra low power MSP430 microcontroller, the built-in code segment LCD driver, is the best driver code segment LCD control unit, this paper focus on the principle and method for driving code segment LCD, and accordingly gives the hardware circuit design and software driver display program.Segment Code LCD Display Principle and Its MSP430 Liquid Crystal Driving MethodLiquid crystal display often has many parameters, but the driving parameters related to the only two: one is "bias", refers to the liquid crystal display / does not show and display the signal amplitude ratio; another is duty cycle that is ratio of each segment LCD display time and display cycle [2]. MSP430F4619 has its own segment LCD driver module, including four kinds of driving module, that is static type, 2-MUX type, 3-MUX type and 4-MUX type. MSP430F4619 by setting different COM to achieve the choice of driving mode, because designers often want to use the least pin to drive the LCD segment, and therefore more use of 4-MUX drive mode.Among 4-MUX LCD driver mode, every four stroke in parallel with one common pin. As shown in Fig. 1, a, b, c, h share a root tube feet, d, e, f, g sharing another single pin, driving every digital only need 2 root segment drive pin (Fig. 1 driven by S0 and S1, number 2, driven by the S2 and S3.). 4-MUX LCD has 4 common COM3 to COM0 respectively, and the MCU connected to COM3 to COM0. In addition to V1 and V5, the 4-MUX mode driver waveform requires two intermediate voltage V2 and V4, generally by three equivalent value resistance R1, R2, R3 series making voltage divider.Figure 1. 4-MUX LCD defineDrive Circuit DesignThe driving hardware circuit mainly includes MSP430 and its peripheral circuit and liquid crystal EDS826 module. The EDS826 can display 6 digits, so MSP430 only need to select S0 ~ S11 pins. We can use the button to adjust the display contents of the LCD liquid crystal.MSP430 Introduce. The main control unit is MSP430 single chip microcomputer, because the 430 single chip microprocessor is a high performance single chip microcomputer, its power consumption is low, the interface is rich, especially suitable for the main control unit in the instrument. Because MSP430 microcontroller internal LCD controller can automatically produce all the timing of LCD through the hardware, we only need to operate the LCD control register to select the LCD driver mode [4-6]. In software design, we need to write the display buffer, it can directly control the LCD light off or light on.LCD Module EDS826. LCD module uses EDS826, it can display six digits one time, each figure and its corresponding segment code shown in Fig. 2, the LCD module using 4-MUX drive [7-8]. In the design of the hardware circuit, the actual connection diagram is shown in Fig. 3. EDS826 COM0~ COM3 connected to MSP430 COM0 ~ COM3, all other pins are connected in sequence to S0 ~ S11, according to 4-MUX driving principle, S0 and S1 driving the first tube, S2 and S3 driving the second tube, by analogy, S10, S11 drive the sixth tube. The relationship between the memory and the segment code referring to the front of this paper [7].Figure 2. EDS826 pinsFigure 3. EDS826 connected to MCUSoftware ProgramSoftware Flow Chart. Software flow chart as shown in Fig. 4, first initialization LCD, then according to the above macro definition to display 0 to 5, finally we can change the display numbers through the button.Figure 4. Software flow chartPart Code. Code below can display number 0 to 5. Compiler development environment is IAR5.0.LCDACTL = LCDON+LCD4MUX+LCDFREQ_128; // 4mux LCD,LCDAPCTL0 =LCDS0+LCDS4+LCDS8; //Segments 0-11for (i=1;i<7;i++){LCDMEM[i] = char_gen[i];}Test ResultsAccording to the above description,we design the hardware circuit and software program[9], display the results as shown in Fig. 5 and Table 1Figure 5. Display resultTable 1 The code of number 0~9ConclusionThis paper describes the principle and method of the segment code LCD in detail, using MSP430F4619 to drive the segment code LCD screen EDS826, drawing the schematic and the PCB board, using c language to program the code. Experimental results show that the digital 0 to 9 can be display clearly. According to the driving method [10], the LCD can be driven more segments, and can be used to display important information in the instrument and meter equipment. References[1]Lin Fanqiang, Ma Xiaoming. Design of the segment type LCD driver, liquid crystal anddisplay [J].2012,27 (4): 523-528[2]Li Yujie. The design of the logistics safety data recorder based on MSP430 MCU [J] displaydesign.2013,32, logistics technology LCD (4): 100-102[3]Ge Huamin, Zheng Jing, Yang Liqing. Design of LCD display module based on ARM-Linux[J], instrument technology and sensor.2009,7:75-77[4]Su peace, Chi Ke. A design method for direct driven character type [J] LCD, instrumenttechnology and sensor.2004,2:35-37[5]Xie Zhao, Zhao Jian.MSP430 Series MCU system engineering design and practice [M].Machinery Industry Press, 2009[6]Texas Instruments.MSP430x4xx Family [6] s User Guide [M]. January 2010[7]EDS826 sheet. DALIAN data GOOD DISPLAY CO. LTD,, 2012[8]Tang Sichao. Embedded system software design based on Embedded Workbench [M]. IARBeijing: Beihang University press, 2010[9]Zhang Yongbin, Hu Jingao. Control and design of LCD display based on [J]. DSP LCD anddisplay.2011, 26 (5): 626-630.[10]Wang Xinxin, Xu Jiangwei, et al. Research on TFT-LCD defect detection system [J]. Journalof electronic measurement and instrument.2014, 28 (3): 278-284.[11]Y.G. Sun, W.L. Li, D.S. Dong, X. Mei, H.Y. Qiang, “Dynamics Analysis and Active Control ofa Floating Crane”, Tehnicki Vjesnik-Technical Gazette, vol.22, no. 6, pp. 1383-1391, 2015.。
MSP430F413单片机段式LCD设计中遇到的晶振、LCD驱动等问题2011-08-11 17:40这次设计所用到的微控制器为德州仪器(TI)的16位单片机 MSP430F413。
单从价格上面来说,这个是单片机也算是TI里面的最便宜的可以直接驱动段式96段 LCD 的单片机了,当时设计之初也是奔着价位而来的,由于在工作中用到过MSP430单片机做过低功耗类的产品,所以对单片机的外围以及硬件结构还是略知一二的。
相对于stc单片机的开发工具来说 430的开发工具也只是个JTAG接口,但是这个接口的价格嘛也得60元左右,由于以前做过MSP430的项目,所以开发工具是现成的!好了,言归正传,这次所用的LCD是淘宝上买的,详细资料如图所示:是个四位的 lcd,以前确实没有接触过段式LCD ,数码管倒是接触的不少,所以自己由好奇心的趋势,自己就做了一块开发板,想试试LCD的感觉。
首先开发板打样回来之后,元器件焊好,随便写了个定时器的程序进去,发现程序在10秒钟之内是运行正常的(此时还没有安装LCD,只是个指示灯在跑),不过也有偶尔程序不运行的情况,后来自己就找原因;1、mcu焊接不好?2、复位电路焊接不好?3、晶振焊接不好?逐一排查,发现前两项是很正常的,虽然PQFP的封装还是焊接的不多,但是自己的焊功还是过的去的,于是就找晶振的问题。
但是如果是晶振自身的问题的话,可能就不起振或者起振频率不对,以至于系统根本就无法定时启动。
所以疑点越来越在晶振上面,后来发现晶振自身是没有问题的,主要是原因是因为晶振的管脚焊接位置距离单片机的 XIN XOUT 管脚的距离着实有点远,大概20mm的样子,加上线走的比较细0.26mm,所以晶振启动异常,或者有时候根本不起振。
问题处在第3了。
没有办法只好用刻刀将晶振的线从单片机管脚出来大概3mm的地方划断,剥去丝印层,露出黄铜线,将晶振管脚直接焊接在黄铜线上,然后用硅胶枪将晶振和单片机封好,就是下面的样子(很丑但是很温柔)!凑合着先用一下,等实验好了的话,如果有需要就重新打样了。
基于MSP430单片机的液晶LCD048应用程序TI公司系列是一种超低功耗的混合信号控制器,其中包括一系列器件,它们针对不用的应用由不同的模块组成。
其中FLASH系列使高效系统变得轻便,FLASH存储器也具有很强的灵便性。
同时为了在低频率的驱动下得到较高的稳定频率,某些MSP430器件上用法了锁频技术FLL或增加型锁频环技术FLL+。
如MSP430F425的时钟模块中用法了FLL+技术,这样可以得到稳定的频率。
液晶驱动MSP430器件上的液晶的控制/驱动将简化液晶显示器的显示。
不同型号的液晶驱动能力不同,我们采纳 MSP430的F42X系列,有128段驱动能力。
液晶的驱动有4种办法:静态,2MUX或1/2占空比,3MUX或1/3占空比, 4MUX或1/4占空比。
对于不同系列、不同型号的液晶驱动原理,控制办法都是一样的,不同点在于驱动液晶段数不一样,或可显示信息的多少不一样。
我们采纳4MUX,这种方式也最容易。
其中需要注重以下两点:(1)液晶的偏压。
因为液晶驱动用法沟通,所以必需按照液晶的工作模MSP430举行偏压设置,详细的操作是:STATIC模式下,R33开路,R03-R23接地,2MUX模式下,分离在R33、R13以及R13、R03之间接上 10K的;3/4MUX模式下,分离在R33、R23之间,R23、R13以及R13、R03之间接上10K的电阻,这样就能保证COM0-COM3 出来供应液晶块的电压符合要求。
(2)频率的设置。
MSP430有三种时钟ACLK(辅助时钟)、MCLK(主时钟)、SMCLK(子时钟),其中液晶的驱动频率FCLK来自ACLK。
在XTIN和XTOUT之间接上振荡频率为32KHz的晶振,Fclk可以按照需要选为1024Hz、512Hz、256Hz、128Hz等。
由FRFQ0和FRFQ1的设置可以满足不同液晶对频率的要求,其中Flcd=2*MUX(rate)*F(framing)。
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的体系结构更为高效。
MSP430单片机控制1602液晶显示字符型 LCD1602 通常有 14 条引脚线或 16 条引脚线的 LCD ,多出来的 2 条线是背光电源线 VCC(15 脚 ) 和地线 GND(16 脚 ) ,其控制原理与 14 脚的 LCD 完全一样,引脚定义如下表所示:在这里要特别注意了:MSP430端口输出电压是3.3v的,不是5v的,所以2和15脚要另找5伏电压接上,否那么虽然能显示但不清楚而且会出现乱码。
2脚相当于清晰度调节,一般接地就可以,但最好接上可变电阻调节一下。
下面是端口连接:不多解释了,接上线就行了,下面是C语言程序:#include <msp430x14x.h>/*必要操作:正确连接1602*/#define uint unsigned int //定义常用数据类型替代码#define uchar unsigned char#define dat P2OUT //定义LCD1602的数据口为P2#define CLR_RS P1OUT&=~BIT0; //置零P1.0位,也就是置零RS #define SET_RS P1OUT|=BIT0; //置壹P1.0位,也就是置壹RS #define CLR_RW P1OUT&=~BIT1; //置零P1.1位,也就是置零RW #define SET_RW P1OUT|=BIT1; //置壹P1.1位,也就是置壹RW #define CLR_EN P1OUT&=~BIT2; //置零P1.2位,也就是置零EN #define SET_EN P1OUT|=BIT2; //置壹P1.2位,也就是置壹EN uchar busy; //1602判忙标志void delay_1ms(void); //延时程序void delay_1s(void); //延时程序void display(void); //显示程序void busy_1602(void); //液晶查忙程序void shj_1602(uchar a); //液晶写数据程序void init_1602(void); //液晶初始化void zhl_1602(uchar a); //液晶写指令程序void main(void) //主程序开始WDTCTL=WDTPW+WDTHOLD;P1DIR=0xff;P2DIR=0xff;while(1){display(); //在大循环调用显示函数,一直显示}}void delay_1ms(void) //延时程序{uchar i,j;for(i=0;i<10;i++)for(j=0;j<20;j++);}void delay_1s(void) //延时程序{int i,j;for(i=0;i<10;i++)for(j=0;j<1000;j++);}void display(void) //液晶显示程序{uchar i; //定义计数值uchar table0[16]={"What do you want"}; //定义LCD1602显示2行的字符uchar table1[16]={"I want you now.."};init_1602(); //初始化1602zhl_1602(0x80); //写指令for(i=0;i<16;i++) //发送数据第一行{shj_1602(table0[i]);}zhl_1602(0xc0);for(i=0;i<16;i++) //发送数据第二行{shj_1602(table1[i]);}}void busy_1602(void) //查询忙碌标志信号程序{{CLR_EN;SET_RW;CLR_RS;SET_EN;busy=dat;CLR_EN;delay_1ms();}while(busy&&0x10==1);}void zhl_1602(uchar a) //写指令到LCM程序{busy_1602();CLR_EN;CLR_RW;CLR_RS;SET_EN;dat=a;CLR_EN;}void shj_1602(uchar a) //写数据到LCM程序{busy_1602();CLR_EN;CLR_RW;SET_RS;SET_EN;dat=a;CLR_EN;}void init_1602(void) //启动LCM程序{zhl_1602(0x38);zhl_1602(0x0c);zhl_1602(0x06);}。
单片机原理及应用第九讲 MSP430单片机液晶控制器和ADC报告人:实验内容实验一:段码LCD循环显示0到6实验二:DAC输出正弦波实验三:基础:使DAC0输出正弦波频率为300Hz,在LCD上显示频率。
提高:用按键控制DAC0输出正弦波频率为在100Hz—1000Hz循环输出,步进值为100Hz,并在LCD上显示频率。
实验步骤步骤:(1) 将PC 和板载仿真器通过USB 线相连;(2) 打开CCS 集成开发工具,选择样例工程或自己新建一个工程,修改代码;(3) 选择对该工程进行编译链接,生成.out 文件。
然后选择,将程序下载到实验板中。
程序下载完毕之后,可以选择全速运行程序,也可以选择单步调试程序,选择F3 查看具体函数。
也可以程序下载之后,按下,软件界面恢复到原编辑程序的画面。
再按下实验板的复位键,运行程序。
(调试方式下的全速运行和直接上电运行程序在时序有少许差别,建议上电运行程序)。
关键代码:实验一:int main(){int i,j;WDTCTL = WDTPW + WDTHOLD;// Stop WDTInit_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2 Init_lcd(); // LCD初始化Backlight_Enable(); // 打开背光LcdGo(1); // 打开液晶模块LCD_Clear(); // 清屏while(1){for (i=0; i<6; i++) // Display "0123456"{for(j=0;j<6;j++){LCDMEM[j] = char_gen[i];}delay_ms(1000);}}}实验二:#include<msp430f6638.h>#include<math.h>#define PI 3.1415926int sin_table[360];int *sin_data_pr;double i=0;int j;void main(void){WDTCTL = WDT_MDLY_0_064; // WDT ~61us interval timer SFRIE1 = WDTIE; // Enable WDT interruptfor(j=0;j<360;j++){i+=PI/180;sin_table[j]=(int)((sin(i)+1)*2048);}sin_data_pr=&sin_table[0];DAC12_0CTL0 = DAC12IR + DAC12SREF_0 + DAC12AMP_5 + DAC12ENC +DAC12CALON+DAC12OPS;P5DIR=BIT1;//打开扬声器的运放P5OUT&=~BIT1;for (;;){__bis_SR_register(CPUOFF + GIE); // Enter LPM0DAC12_0DAT=*sin_data_pr++;if (sin_data_pr >= &sin_table[360]){sin_data_pr = &sin_table[0];}// Positive rampDAC12_0DAT &= 0xFFF; // Modulo 4096}}#pragma vector=WDT_VECTOR__interrupt void watchdog_timer (void){__bic_SR_register_on_exit(CPUOFF); // Clear LPM0 bits from 0(SR) }实验三:基础:int main(void) {WDTCTL = WDT_MDLY_0_064; // WDT ~61us interval timerInit_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2Init_lcd(); // LCD初始化Backlight_Enable(); // 打开背光LcdGo(1); // 打开液晶模块LCD_Clear(); // 清屏LCDMEM[0] = char_gen[3];LCDMEM[1] = char_gen[0];LCDMEM[2] = char_gen[0];SFRIE1 = WDTIE; // Enable WDT interruptfor(j=0;j<52;j++){i+=PI/26;sin_table[j]=(int)((sin(i)+1)*2048);}sin_data_pr=&sin_table[0];DAC12_0CTL0 = DAC12IR + DAC12SREF_0 + DAC12AMP_5 + DAC12ENC + DAC12CALON+DAC12OPS;P5DIR=BIT1;//打开扬声器的运放P5OUT&=~BIT1;for (;;){__bis_SR_register(CPUOFF + GIE); // Enter LPM0DAC12_0DAT=*sin_data_pr++;if (sin_data_pr >= &sin_table[52]){sin_data_pr = &sin_table[0];}// Positive rampDAC12_0DAT &= 0xFFF; // Modulo 4096}}#pragma vector=WDT_VECTOR__interrupt void watchdog_timer (void){__bic_SR_register_on_exit(CPUOFF); // Clear LPM0 bits from 0(SR)}提高:#define circnt100 1388#define circnt200 694#define circnt300 462#define circnt400 348#define circnt500 278#define circnt600 232#define circnt700 198#define circnt800 174#define circnt900 154#define circnt1000 138int sin_table[180];int *sin_data_pr;double i=0;int j;const int cnt_table[] ={circnt100,circnt200,circnt300,circnt400,circnt500,circnt600,circnt700,circ nt800,circnt900,circnt1000};int cnt_flg = 0;void SetVcoreUp (unsigned int);void main(void){WDTCTL = WDTPW + WDTHOLD; // close watchdog//---------p2.6--------------P2REN |= BIT6; // Enable P2.6 internal resistanceP2OUT |= BIT6; // Set P2.6 as pull‐Up resistanceP2IES |= BIT6; // P2.6 Hi/Lo edgeP2IFG &= ~BIT6; // P2.6 IFG clearedP2IE |= BIT6; // P P2.6 interrupt enabled/*P2REN |= BIT7; // Enable P2.6 internal resistanceP2OUT |= BIT7; // Set P2.6 as pull‐Up resistanceP2IES |= BIT7; // P2.6 Hi/Lo edgeP2IFG &= ~BIT7; // P2.6 IFG clearedP2IE |= BIT7; // P P2.6 interrupt enabled*///---------enable LCD------------Init_TS3A5017DR(); // Configure TS3A5017DR IN1 and IN2Init_lcd(); // LCD初始化Backlight_Enable(); // 打开背光LcdGo(1); // 打开液晶模块LCD_Clear(); // 清屏LCDMEM[5] = char_gen[0];LCDMEM[4] = char_gen[0];LCDMEM[3] = char_gen[1];//----------config sine list------------for(j=0;j<180;j++){i+=PI/90;sin_table[j]=(int)((sin(i)+1)*2000);}sin_data_pr=&sin_table[0];DAC12_0CTL0 = DAC12IR + DAC12SREF_0 + DAC12AMP_5 + DAC12ENC +DAC12CALON+DAC12OPS;//---------- enable SMCLK as 8MHz--------------P4DIR |= BIT1; // P4.1 outputP1DIR |= BIT0; // ACLK set out to pinsP1SEL |= BIT0;P3DIR |= BIT4; // SMCLK set out to pinsP3SEL |= BIT4;// Increase Vcore setting to level3 to support fsystem=25MHz// NOTE: Change core voltage one level at a time..SetVcoreUp (0x01);SetVcoreUp (0x02);SetVcoreUp (0x03);UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFOUCSCTL4 |= SELA_2; // Set ACLK = REFO__bis_SR_register(SCG0); // Disable the FLL control loopUCSCTL0 = 0x0000; // Set lowest possible DCOx, MODxUCSCTL1 = DCORSEL_7; // Select DCO range 50MHz operationUCSCTL2 = FLLD_1 + 762; // Set DCO Multiplier for 25MHz// (N + 1) * FLLRef = Fdco// (762 + 1) * 32768 = 25MHz// Set FLL Div = fDCOCLK/2__bic_SR_register(SCG0); // Enable the FLL control loop// Worst‐case settling time for the DCO when the DCO ran ge bits have been // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in5xx// UG for optimization.// 32 x 32 x 25 MHz / 32,768 Hz ~ 780k MCLK cycles for DCO to settle __delay_cycles(782000);// Loop until XT1,XT2 & DCO stabilizes ‐ In this case only DCO has to stabilize do{UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);// Clear XT2,XT1,DCO fault flagsSFRIFG1 &= ~OFIFG; // Clear fault flags}while (SFRIFG1&OFIFG); // Test oscillator fault flag//-----------enable timerA CCR0 us SMCLK--------------TA0CCTL0 = CCIE; // CCR0 interrupt enabledTA0CCR0 = cnt_table[0];TA0CTL = TASSEL_2 + MC_1 + TACLR; //use SMCLk as setting 25MHzfor (;;){__bis_SR_register(CPUOFF + GIE); // Enter LPM0DAC12_0DAT=*sin_data_pr++;if (sin_data_pr >= &sin_table[180]){sin_data_pr = &sin_table[0];}// Positive rampDAC12_0DAT &= 0xFFF; // Modulo 4096}}void SetVcoreUp (unsigned int level){PMMCTL0_H = PMMPW_H; // Open PMM registers for write// Set SVS/SVM high side new levelSVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;// Set SVM low side to new levelSVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;while ((PMMIFG & SVSMLDLYIFG) == 0); // Wait till SVM is settledPMMIFG &= ~(SVMLVLRIFG + SVMLIFG); // Clear already set flagsPMMCTL0_L = PMMCOREV0 * level; // Set VCore to new levelif ((PMMIFG & SVMLIFG))while ((PMMIFG & SVMLVLRIFG) == 0); // Wait till new level reached// Set SVS/SVM low side to new levelSVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;// Lock PMM registers for write accessPMMCTL0_H = 0x00;}//--------timerA interruption---------#pragma vector=TIMER0_A0_VECTOR__interrupt void TIMER0_A0_ISR(void){__bic_SR_register_on_exit(CPUOFF);}//-------bottom interruption----------#pragma vector=PORT2_VECTOR__interrupt void Port_2(void){__bic_SR_register_on_exit(CPUOFF);cnt_flg++;if (cnt_flg >= 10) cnt_flg = 0;LCD_Clear(); // 清屏LCDMEM[5] = char_gen[0];LCDMEM[4] = char_gen[0];if (cnt_flg == 9){LCDMEM[3] = char_gen[0];LCDMEM[2] = char_gen[1];}else LCDMEM[3] = char_gen[cnt_flg + 1];TA0CCR0 = cnt_table[cnt_flg];P2IFG &= ~BIT6;__bis_SR_register(CPUOFF + GIE);}实验现象分析:实验一:LCD显示屏上循环显示0到6,每次显示都为6个相同的数字,现象对应的代码为:实验二:实验板上扬声器放出周期为64us*360=0.023s的正弦波信号。
程序功能:在LCD屏幕第一行第一列显示字符A端口:P1——DB0~DB7P2.0——RSP2.1——RWP2.2——EN****************************************************/#inlude<AT89x51.h>#define LCD_DB P1sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_E=P2^2;#define uchar unsigned char#define uint unsigned intvoid LCD_init(void);void LCD_write_command(uchar command);void LCD_write_data(uchar dat);void LCD_disp_char(uchar x,uchar y,uchar dat);void LCD_check_busy(void);void delay_n40us(uint n);/***************************************************函数名称:LCD_init函数功能:初始化LCD***************************************************/void LCD_init(void){//设置数据总线为8位,2行显示,5*7点阵/每字符——————功能设定LCD_write_command(0x38);//显示功能开,无光标,光标闪烁——————显示控制LCD_write_command(0x0c);//写入数据后光标右移——————模式设置LCD_write_command(0x06);//清除屏幕——————清屏指令LCD_write_command(0x01);delay_n40us(100);//延时一段时间保证完全清屏}/***************************************************函数名称:LCD_write_command函数功能:void LCD_write_command(uchar command){LCD_DB=command;//向P1端口写入指令LCD_RW=0;//设置为向LCD写入指令或数据LCD_RS=0;//设置为输入指令模式LCD_E=1;//允许写入LCD_E=0;//结束写入delay_n40us(1);}/*************************************************** 函数名称:LCD_write_data函数功能:写入字符数据***************************************************/ void LCD_write_data(uchar dat){LCD_DB=dat;//向P1端口写入数据LCD_RW=0;LCD_RS=1;//设置为写入数据模式LCD_E=1;LCD_E=0;delay_n40us(1);}/*************************************************** 函数名称:LCD_disp_char函数功能:显示一个字符***************************************************/ void LCD_disp_char(uchar x,uchar y,uchar dat){uchar address;if(y==1) address=0x80+x;//如果是第一行,则地址为?else address=0xc0+x;//如果是第二行,则地址为?LCD_write_command(address);LCD_write_data(dat);}/*************************************************** 函数名称:LCD_check_busy函数功能:忙检测***************************************************/ void LCD_check_busy(void){ do{LCD_E=0;LCD_RS=0;LCD_RW=1;LCD_DB=0xff;//P1端口设置为高电平LCD_E=1;}while(LCD_DB^7==1);}/********************************************** 函数名称:delay_n40us函数功能:延时**********************************************/ void delay_n40us(uint n){ uint i;uint j;for(i=n,i>0;i++)for(j=0;j<2;j++);}/**************主函数*************************/ void main(){ LCD_init();LCD_dis_char(0,1,"A");while(1);}。
用MSP430实现LCD人机界面系统Using MSP430 to Design LCD Man-Machine Conversation System上海交通大学陈海波陈立功倪纯珍耿明(此文章已发表在电子产品世界杂志的2001年11月B版)摘要本文详细介绍了MSP430F149单片机与控制键以及液晶显示LCD之间的接口技术和显示技术并且给出了典型的应用电路以及相应的源程序关键词MSP430F149LCD接口电路引言随着电子技术的飞速发展越来越多的领域应用到以单片机为核心的便携式数字化仪表和测试仪为了尽可能缩小仪器的体积对选择的芯片和显示系统的要求变得更高原来使用的LED显示由于体积及功耗方面的原因已经不能满足人们的需要而现在越来越多的使用LCD 以达到更佳的人机对话效果LCD有不同的类别通常按照其显示方式分为段式点字符式点阵式等目前字符式LCD被广泛的采用随着芯片技术的不断发展不同芯片与LCD之间的连接和驱动存在着很大的差异本文介绍了一种采用MSP430F149单片机的LCD人机界面系统的设计MSP430F149是美国TI公司最新推出的超低功耗混合信号16位单片机系列中的一种图1是MSP430F149功能框图它采用RISC精简指令集125ns指令周期大部分的指令在一个指令周期内完成而且片内含有硬件乘法器大大节省了运算的时间该芯片采用超低功耗设计1.8V 3.6V的供电电压在2.2V电压32KHz晶振系统中工作电流7mA在2.2V电压1MHz晶振系统中工作电流250mA电池可保持长时间的工作它内含一个八个外部通道的12位高性能A/D转换器和一个自动扫描功能的容量为16个字的可编程缓冲器使得采样速率可达200KHz而且含有片内基准电压温度传感器以及电池低压时的检测电路可以实现数据采集及自检功能片内具有两个定时器带有7个捕获/比较寄存器的16位Timer_B和带有3个捕获/比较寄存器的16位Timer_A该芯片具有60KB的FlashROM2KB RAM采用串行在线编程方式为用户编译程序和控制参数提供灵活的空间而且内部的安全保密熔丝可使程序不被非法考制它可以10万次擦写有超强的抗干扰能力此外MSP430F149具有强大的中断功能48个I/O引脚它的I/O与传统的I/O不同(见图2)每个I/O口分别对应输入输出功能选择中断等多个寄存器使得功能口和通用I/O口复用在对同一个I/O口进行操作前首先要选择其要实现的功能这样大大的增强了端口的功能和灵活性大大提高了对外围设备的开发能力我们就是利用I/O口来开发LCD显示系统该芯片还具有两个通用同步/异步串行通讯接口由于MSP430F149具有以上的特点十分适合开发的要求所以选用其作为系统的主芯片LCD人机界面系统设计人机界面是便携式系统的重要组成部分其要求为控制面板简单指令明确表达丰富确切体积小功耗低目前显示系统多采用的是通用字符式LCD在满足条件的基础上节省了开发时间和成本我们所采用的是164的液晶显示器在以往的设计中单片机和外围的设计大部分均是5V系统而随着电子技术的发展超低功耗的芯片越来越多在此基础上提出了5V系统和3.3V系统共用技术从表1可以看出字符式LCD与MSP439F149相互之间的电平存在着很大的差异这种电平的差异直接影响到LCD对芯片发出指令的响应反之过高的LCD 反馈电压可能超过MSP439F149所能承受的最高电压对芯片造成不可预计的损坏因此我们的电路设计(如图3)采用限流箝位的方法一般LCD的驱动电流最大不会超过13mA所以通过180电阻后下降了的电压可以驱动LCD同时也解决了限流问题而且通过3.6V嵌位二极管保证MSP439F149端口所承受的电压不会超过极限值实现了单片机到LCD的电平转换满足了LCD高低电平的要求电路中利用MSP430F149的P4.4P4.5P4.6作为LCD中E R/W RS的控制线P5口作为LCD数据线由于此系统是数据采集系统中的显示部分它要对不同的中断和按键产生响应以显示相应的内容所以设计了三个按键分别对应的是进入键移动键和退出键电路还采用了上电自动复位的设计结构供开机和复位时使用MSP430F149除了内部有DCO数控晶振可以提供工作频率外还有两个外部时钟接口分别可接低速和高速时钟这样为系统的不同模块提供了不同的稳定工作频率我们在系统设计中分别选用32768手表晶振(可以作为独立外围模块的时钟源或者用于稳定DCO)和4.096M晶振(可以作为系统的主频备用)由于需用3.3V和5V两种电源我们应用ADP1073 DC-DC电荷泵升压稳压电路由两节5号电池(1.6V 3.2 V)供电获得稳定的5V电源再应用TPS7233稳压电路对5V降压获得3.3V 电源该电路结构简单稳定可靠2节5号碱性电池对带有背景光LCD电流为80mA的系统可连续工作8小时以上具体设计电路见图4所示显示系统的程序设计从MSP430F149的内部结构可以看出同一个I/O口对应多个寄存器是典型的复用端口在对LCD读写操作前要进行功能选择即设置P4P5口为输出口(LCD控制口)P1口为输入口(键盘另外需要注意的是系统的主工作频率如果使用DCO作为系统时钟由于MSP430F149芯片内部没有锁频环数字逻辑电路为了得到准确的时钟信号需要通过软件进行软锁频利用32768晶振和Timer_A或Timer_B的捕获比较功能可以实现此功能主频的选择将影响液晶显示的稳定性如果程序中Enable信号的时间过短的话由于LCD模块接受的数据不能保证显示的效果将会不稳定具体程序见程序清单该程序选用DCO作为系统的主频在中等频率0.75MHz采用软件锁频32768晶振作为软锁频的基准晶振结语通过开发以MSP430F149为核心的LCD人机界面系统对3.3V和5V系统间的交互进行了研究给出了简捷的设计此系统是我们开发的便携式振动分析仪的一个部分但由于该芯片的强大功能十分适合中小型仪器的开发此系统也可以作为其他便携式仪器的显示部分加之TI 公司提供的JTAG口在线仿真功能能够大大缩短研制周期这一点对开发研制来说十分重要参考文献1 MSP430系列超低功耗16位单片机原理与应用胡大可北京航空航天大学出版社20002陈粤初窦振中等单片机应用系统设计与实践北京航空航天大学出版社19923 MSP430x1xx Family User s Guide, 20004 MSP430x13x,MSP430x14x Data sheet, 20005 Controlling the DCO of the MSP430x11x, 2000。
MSP430F449的液晶使用1 使用液晶为36×4=144段,为4 MUX液晶。
2LCD电压生成根据449的PDF中说明相当于Rx=0 欧姆,R=100k欧姆。
Rx选择0欧,相当于选择了最高对比度。
3硬件方面,除了COM0-COM3和S0-S31液晶对应MCU引脚相连和上面的图外,必须使用32khz表晶接449的8脚和9脚之间,使得ACLK = LFXT1 = 32768hz。
4液晶的显存如下图5LCD的寄存器LCD控制寄存器功能说明6实例程序如下// MSP430F449 点亮所有段源程序#include "msp430x44x.h"__no_init unsigned char lcd_mem[20] @0x91;//定义显存为一个数组此处使用了绝对地址定位void main(void){unsigned char i;unsigned int j;WDTCTL = WDTPW + WDTHOLD; //关看门狗FLL_CTL0 = XCAP18PF; //设定FLL电容BTCTL = 0x4F; //为LCD设定basic timer1 IE2 &= ~(0x01<<7);LCDCTL = 0xBD; //LCD控制寄存器设定P5SEL = 0xFC; //引脚复用功能选择for(i=0;i<20;i++){lcd_mem[i]=0xFF;}while(1){for(j=0;j<50000;j++);//LCDCTL=(LCDCTL & LCDSON)? 0xB9 :0xBD;//LCDCTL=(LCDCTL & LCDON)? 0xBC :0xBD;//lcd_mem[12] = (lcd_mem[12] & 0x01) ? 0xfe:0xff;}}7关于LCD的刷新频率LCD刷新的频率f LCD由Basic Timer1设定。
MSP430控制段式液晶2009-07-11 21:05:44| 分类:单片机| 标签:|字号大中小订阅//******************************************************************************// MSP-FET430P430 Demo - LCD, Display "0123456" on SBLCDA4 LCD//// Description: Displays "0123456" on SBLCDA4 LCD as used on 430 Day Watch// board.// ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz // //* An external watch crystal between XIN & XOUT is required for ACLK *////// MSP430FG439// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | | SBLCDA4// | | (As used on 430 Day Watch Demo board)// +-|R33 S0 | -----------------// 1m | - |--> | + 7 6 5 4 3 2 1 |// +-|R23 S21 | -----------------// 1m | COM0|-----||||// +-|R13 COM1|------|||// 1m | COM2|-------||// +-|R03 COM3|--------|// | | |// Vss//// L. Westlund// Texas Instruments Inc.// Feb 2005// Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A //******************************************************************************#include <msp430xG43x.h>// LCD segment definitions.#define d 0x80#define c 0x01#define b 0x20#define a 0x10#define h 0x08#define g 0x40#define f 0x02#define e 0x04const char char_gen[] = { // As used in 430 Day Watch Demo boarda+b+c+d+e+f, // Displays "0"b+c, // Displays "1"a+b+d+e+g, // Displays "2"a+b+c+d+g, // Displays "3"b+c+f+g, // Displays "4"a+c+d+f+g, // Displays "5"a+c+d+e+f+g, // Displays "6"a+b+c, // Displays "7"a+b+c+d+e+f+g, // Displays "8"a+b+c+d+f+g // Displays "9"};void main(void){int i;WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerFLL_CTL0 |= XCAP18PF; // Set load capacitance for xtal LCDCTL = LCDON + LCDSG0_3 + LCD4MUX; // 4mux LCD, segs0-23 = outputs BTCTL = BT_fLCD_DIV128; // Set LCD frame freq = ACLK/128 P5SEL = 0xFC; // Set Rxx and COM pins for LCD// For P5.0, P5.1, P4.6, P4.7 setting// SEL bits selects Analog for the FGfor( i = 0; i < 20; i ++){LCDMEM[i] = 0; // Clear LCD}for (i=0; i<20; ++i) // Display "0123456"LCDMEM[i] = char_gen[i];while(1);}。
MSP430与图形液晶显示模块接口应用摘要:本文详述了MSP430F149和图形液晶显示模块LM12864FBC接口性能特点及方法,设计了硬件电路以及接口软件。
关键词:低功耗;MSP430F149;LM12864FBC;硬件电路概述MSP430F149是德州仪器公司最近推出的MSP430系列超低功耗控制器中的一种,电源电压范围为1.8V至3.6V,可以用电池工作,而且使用时间长,适用于电池供电的手持设备使用。
另外,液晶显示器具有功耗低、体积小、重量轻等特点,图形LCD除了显示字符、数字外,还可以显示汉字、图形、曲线等LED无法显示的功能,用途广泛。
因此以MSP430为核心的LCD在智能仪器仪表和低功耗电子产品行业有广泛的发展前途。
本文在简单介绍液晶显示器LM12864FBC的驱动器KS0108B和KS0107B的结构和功能基础上,介绍了MSP430F149的LCD硬件接口和软件编程特点。
图1 MSP430F149与LM12864FBC接口原理图(略)硬件设计KS0108B的接口信号KS0108B和KS0107B是LM12864FBC的共同驱动芯片,其中KS0107B是公共行驱动芯片,KS0108B是通过它产生的时序控制的。
二片KS0108B是列驱动及控制芯片,KS0108B与微处理器的接口信号如下:DB0-DB7:数据总线;CSA、CSB:芯片选择信号A、B,CSA(B)=1,选通列驱动左、右半部分,CSA(B)=0,不选通列驱动左、右半部分;D/I:D/I=1操作数据,D/I=0操作指令代码;R/W:R/W=1读操作,R/W=0写操作;E:输入使能。
LM12864FBC模块的引脚说明MSP430F149与LM12864FBC接口电路本液晶显示模块是128 64的LCD,利用P3.0-P3.4作为LCD的CSA、CSB、D/I、R/W 和E的控制线,P4为LCD的数据线。
由于MSP430的I/O口都是复用端口,因此必须将用到的引脚设为输入/出口。
MSP430控制段式液晶
2009-07-11 21:05:44| 分类:单片机| 标签:|字号大中小订阅
//******************************************************************************
// MSP-FET430P430 Demo - LCD, Display "0123456" on SBLCDA4 LCD
//
// Description: Displays "0123456" on SBLCDA4 LCD as used on 430 Day Watch
// board.
// ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz // //* An external watch crystal between XIN & XOUT is required for ACLK *//
//
// MSP430FG439
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | | SBLCDA4
// | | (As used on 430 Day Watch Demo board)
// +-|R33 S0 | -----------------
// 1m | - |--> | + 7 6 5 4 3 2 1 |
// +-|R23 S21 | -----------------
// 1m | COM0|-----||||
// +-|R13 COM1|------|||
// 1m | COM2|-------||
// +-|R03 COM3|--------|
// | | |
// Vss
//
// L. Westlund
// Texas Instruments Inc.
// Feb 2005
// Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A //******************************************************************************
#include <msp430xG43x.h>
// LCD segment definitions.
#define d 0x80
#define c 0x01
#define b 0x20
#define a 0x10
#define h 0x08
#define g 0x40
#define f 0x02
#define e 0x04
const char char_gen[] = { // As used in 430 Day Watch Demo board
a+b+c+d+e+f, // Displays "0"
b+c, // Displays "1"
a+b+d+e+g, // Displays "2"
a+b+c+d+g, // Displays "3"
b+c+f+g, // Displays "4"
a+c+d+f+g, // Displays "5"
a+c+d+e+f+g, // Displays "6"
a+b+c, // Displays "7"
a+b+c+d+e+f+g, // Displays "8"
a+b+c+d+f+g // Displays "9"
};
void main(void)
{
int i;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
FLL_CTL0 |= XCAP18PF; // Set load capacitance for xtal LCDCTL = LCDON + LCDSG0_3 + LCD4MUX; // 4mux LCD, segs0-23 = outputs BTCTL = BT_fLCD_DIV128; // Set LCD frame freq = ACLK/128 P5SEL = 0xFC; // Set Rxx and COM pins for LCD
// For P5.0, P5.1, P4.6, P4.7 setting
// SEL bits selects Analog for the FG
for( i = 0; i < 20; i ++)
{
LCDMEM[i] = 0; // Clear LCD
}
for (i=0; i<20; ++i) // Display "0123456"
LCDMEM[i] = char_gen[i];
while(1);
}。