1、整理lcd1602MSP430G2553实现LCD1602的字符显示,而且是半字节的,用的是P2口的高四位。/* LCD1602显示之高四位相连的方法* 描述:4线数据宽度,操作Lcd1602* 在LCD1602屏幕上第一行显示Hello!LCD1602* 第二行显示MSP430G2553* 硬件电路:MSP430g2553* 硬件连接:* MSP430与LCD连接信息* LCD1602,4位接口,即使用D4-D7数据口,D0-D3不接入MCU* PIN1 - 地* PIN2 - VCC(一定要接+5V)* PIN3 -仿真时悬空,实际电路 2K电阻-地 (一定要接好,否则没有任何显示)* P
2、IN4 - RS - P1.6* PIN5 - R/W - GND* PIN6 - EN - P1.7* PIN7 - D0不接* PIN8 - D1不接* PIN9 - D2不接* PIN10 - D3不接* PIN11 - D4 - P2.4* PIN12 - D5 - P2.5* PIN13 - D6 - P2.6* PIN14 - D7 - P2.7* PIN15 - VCC* PIN16 - 地* 调试器:MSP430FET全系列JTAG仿真器* 调试软件: CCS5.1.1 编译*/#include #include #include /* 端口定义 */#define LCD_E
3、N_PORT P1OUT /以下2个要设为同一个口#define LCD_EN_DDR P1DIR#define LCD_RS_PORT P1OUT /以下2个要设为同一个口#define LCD_RS_DDR P1DIR#define LCD_DATA_PORT P2OUT /以下3个要设为同一个口#define LCD_DATA_DDR P2DIR /一定要用高4位#define LCD_RS BIT6#define LCD_EN BIT7#define LCD_DATA BIT7|BIT6|BIT5|BIT4 /4位数据线连接模式/* 预定义函数 */void LCD_init(void
4、);void LCD_init_first(void);void LCD_en_write1(void); /上升沿使能void LCD_en_write2(void); /下降沿使能void LCD_write_command(unsigned char command);void LCD_write_data(unsigned char data);void LCD_set_xy (unsigned char x, unsigned char y);void LCD_write_string(unsigned char X,unsigned char Y, unsigned char *s
5、);void LCD_write_char(unsigned char X,unsigned char Y, unsigned char data);void delay_1ms(void);void delay_nus(unsigned int n);void delay_nms(unsigned int n);unsigned char LCDBuf1=Hello!LCD1602; /第一行要显示的内容unsigned char LCDBuf2=MSP430G2553; /第二行要显示的内容/* 主函数 */void main()WDTCTL = WDTPW + WDTHOLD; / 关闭
6、看门狗LCD_init_first();LCD_init();delay_nms(100);LCD_write_string(0,0,LCDBuf1);delay_nms(10);LCD_write_string(0,1,LCDBuf2);/* LCD液晶操作函数 */void LCD_init_first(void) /LCD1602液晶初始化函数(热启动) delay_nms(500); LCD_DATA_DDR|=LCD_DATA; /数据口方向为输出 LCD_EN_DDR|=LCD_EN; /设置EN方向为输出 LCD_RS_DDR|=LCD_RS; /设置RS方向为输出 delay_
7、nms(50); LCD_write_command(0x30); delay_nms(50); LCD_write_command(0x30); delay_nms(5); LCD_write_command(0x30); delay_nms(500);/* * * LCD1602液晶初始化函数 * */void LCD_init(void) delay_nms(500); LCD_DATA_DDR|=LCD_DATA; /数据口方向为输出 LCD_EN_DDR|=LCD_EN; /设置EN方向为输出 LCD_RS_DDR|=LCD_RS; /设置RS方向为输出 delay_nms(500)
8、; LCD_write_command(0x28); /4位数据接口 delay_nms(50); LCD_write_command(0x28); /4位数据接口 delay_nms(50); LCD_write_command(0x28); /4位数据接口 delay_nms(50); LCD_en_write2(); delay_nms(50); LCD_write_command(0x28); /4位数据接口 delay_nms(500); LCD_write_command(0x01); /清屏 LCD_write_command(0x0c); /显示开,关光标,不闪烁 LCD_wr
9、ite_command(0x06); /设定输入方式,增量不移位 delay_nms(50); /* * * 液晶使能上升沿 * */void LCD_en_write1(void) LCD_EN_PORT&=LCD_EN; delay_nus(10); LCD_EN_PORT|=LCD_EN;/* * * 液晶使能下降沿 * */void LCD_en_write2(void) LCD_EN_PORT|=LCD_EN; delay_nus(10); LCD_EN_PORT&=LCD_EN;/* * * 写指令函数 * */void LCD_write_command(unsigned cha
10、r command) delay_nus(16); P2SEL=0x00; LCD_RS_PORT&=LCD_RS; /RS=0 LCD_en_write1(); LCD_DATA_PORT&=0X0f; /清高四位 LCD_DATA_PORT|=command&0xf0; /写高四位 delay_nus(16); LCD_en_write2(); command=command4; /低四位移到高四位 LCD_en_write1(); LCD_DATA_PORT&=0x0f; /清高四位 LCD_DATA_PORT|=command&0xf0; /写低四位 LCD_en_write2();/
11、* * * 写数据函数 * */void LCD_write_data(unsigned char data) delay_nus(16); P2SEL=0x00; LCD_RS_PORT|=LCD_RS; /RS=1 LCD_en_write1(); /E上升沿 LCD_DATA_PORT&=0X0f; /清高四位 LCD_DATA_PORT|=data&0xf0; /写高四位 delay_nus(16); LCD_en_write2(); data=data4; /低四位移到高四位 LCD_en_write1(); LCD_DATA_PORT&=0X0f; /清高四位 LCD_DATA_P
12、ORT|=data&0xf0; /写低四位 LCD_en_write2();/* * * 写地址函数 * */void LCD_set_xy( unsigned char x, unsigned char y ) unsigned char address; if (y = 0) address = 0x80 + x; else address = 0xc0 + x; LCD_write_command( address);/* * *LCD在任意位置写字符串,列x=015,行y=0,1 * */void LCD_write_string(unsigned char X,unsigned ch
13、ar Y,unsigned char *s) LCD_set_xy( X, Y ); /写地址 while (*s) /写显示字符 LCD_write_data( *s ); s+; /* * * LCD在任意位置写字符,列x=015,行y=0,1 * */void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) LCD_set_xy( X, Y ); /写地址 LCD_write_data( data);/* * * 1us延时函数 * */void delay_1us(void) asm(nop);/*
14、* * N us延时函数 * */void delay_nus(unsigned int n) unsigned int i; for (i=0;in;i+) delay_1us();/* * * 1ms延时函数 * */void delay_1ms(void) unsigned int i; for (i=0;i1140;i+);/* * * N ms延时函数 * */void delay_nms(unsigned int n) unsigned int i=0; for (i=0;i= 23) & (minute = 59) & (second = 59) hour = 0; if(min
15、ute = 59) & (second = 59) minute = 0; hour+; if(second = 59) second = 0; minute+; Initialize_LCD(); LCD_ShowString(0, 0, Temperature:); LCD_ShowString(8, 1, . C); LCD_ShowChar(6, 1, Temp2 + 0); LCD_ShowChar(7, 1, Temp1 + 0); LCD_ShowChar(9, 1, Temp0 + 0); else second1 = second / 10; second0 = second
16、 % 10; minute1 = minute / 10; minute0 = minute % 10; hour1 = hour / 10; hour0 = hour % 10; Initialize_LCD(); LCD_ShowString(0, 0, Time :); LCD_ShowString(4, 1, : :); LCD_ShowChar(2, 1, hour1 + 0); LCD_ShowChar(3, 1, hour0 + 0); LCD_ShowChar(5, 1, minute1 + 0); LCD_ShowChar(6, 1, minute0 + 0); LCD_Sh
17、owChar(8, 1, second1 + 0); LCD_ShowChar(9, 1, second0 + 0); break; MSP430G2553 一个数码管实现按键加1功能 #includeunsigned int i=0,j;unsigned char seg=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;void main(void) WDTCTL = WDTPW + WDTHOLD; / 关闭看门狗 P2DIR |= 0xff; P2SEL&=(0xC0); P1DIR &= BIT3; P1REN |= BIT3; P1
18、IE |= BIT3; / 设置P1.3 可以中断 P1IES = BIT3; / 设置P1.3 为下降沿中断 _EINT(); _BIS_SR(LPM0_bits + GIE); / 进入低功耗睡眠,打开总中断开关unsigned char p1keyj(void) / 判键子程序unsigned char x; x=(P1IN&0X08); / P1.3 接有按键 return(x); / 有按键返回非全 0#pragma vector=PORT1_VECTOR /中断服务程序:_interrupt void p1int(void)if(p1keyj() P2OUT=segi+;for(j=8000;j0;j-) if(i9)i=0;单通道AD转换并通过1602显示的程序/*/#include #include #include /*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1