用msp430g2553控制1602液晶显示时间,并可以通过按键设置时间,我做了正计时和倒计时两种模式
/*********************************************************************
msp430g2553与1602引脚连接情况
* PIN1 --> 地
* PIN2 --> VCC(一定要接+5V)
* PIN3 -->仿真时悬空,实际电路 2K电阻-->地 (电阻可以是500-2k的,改变电阻可以改变字符显示的亮度,电阻接不好会导致什么都不显示)
* PIN4 --> 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 --> 地
*msp430g2553与按键引脚连接情况
*k1-->p1.2
*k2-->p1.3
*k3-->p2.1
*k4-->p1.1
说明:本人用的时矩阵键盘,若用独立按键要接入电阻
*****************************************************************/
代码如下:
#include #include #include #define LCD_EN_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); 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); void LCD_write_char(unsigned char X,unsigned char Y, unsigned char data); void display_HMS(unsigned char add,unsigned char date); void delay_1ms(void); void delay_nus(unsigned int n); void delay_nms(unsigned int n); void SetTime(); void SetMode(); void CalledByTimerA(); unsigned char LCDBuf1[]={"Hello world"};//第一行要显示的内容 unsigned char LCDBuf2[]={"10:30:00"}; //第二行要显示的内容 unsigned char shi1,fen1,miao1,aa,shi2,fen2,miao2; unsigned char miao=0; unsigned char fen=30; unsigned char shi=10; unsigned char aa=0;//计数器 int set_flag=0;//时间设置标志 int time_flag=0;//选择 void main()//主函数 { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 LCD_init_first(); LCD_init(); delay_nms(100); BCSCTL3 |= LFXT1S_2; // Set LFXT1为vol时钟即12kHZ CCTL0|= CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断 CCR0 =182; //设置捕获/比较寄存器,初始值为12000,对于ACLK时钟频率为12khz的频率,相当于1s TA0CTL = TASSEL_1 +TACLR+MC_1; P1DIR|=BIT0;//P1.0为led,显示按键起作用 P1OUT|=BIT0+BIT3;//P1IN低电平跳转 P1REN|=BIT2+BIT3+BIT1;//上拉电阻,缺了好像不能用 P2REN|=BIT1; LCD_write_string(0,0," Mode "); delay_nms(10); LCD_write_string(0,1,"k1(up) k2(down) "); SetMode(); LCD_write_string(0,0," "); delay_nms(10); LCD_write_string(0,1," "); delay_nms(10); LCD_write_string(0,0,LCDBuf1); delay_nms(10); LCD_write_string(0,1,LCDBuf2); _EINT(); //使能中断,这是一个C编译器支持的内部过程。 set_flag=0; while(1) { P1OUT&=~BIT0; SetTime(); P1OUT=BIT0+BIT3; } } /****************************************************** K1-进入设置现在的时间。 K2-设置小时。 K3-设置分钟。 K4-确认完成设置。 ********************************************************/ void SetTime() { if(!(P1IN&BIT2)) { delay_nms(10); // P1OUT&=~BIT0; set_flag=1; TA0CTL&=0xffcf;//停止模式 } else if(!(P1IN&BIT3) && set_flag) { delay_nms(50); shi=(shi+1)%24; display_HMS(0x40,shi); LCD_write_command(0x80+0x41); // P1OUT&=~BIT0; } else if (!(P2IN&BIT1) && set_flag) { delay_nms(50); // P1OUT&=~BIT0; fen=(fen+1)%60; display_HMS(0x43,fen); LCD_write_command(0x80+0x44); } else if (!(P1IN&BIT1)&& set_flag) { delay_nms(10); TA0CTL = TASSEL_1 +TACLR+MC_1; // P1OUT&=~BIT0; set_flag=0; } else { // P1OUT=BIT0+BIT3; } } /************************************************** K1-模式1,时间 K2-模式2,倒计时 K3-确定 ****************************************************/ void SetMode() { while(1) { if(!(P1IN&BIT2)) { time_flag=1; } else if(!(P1IN&BIT3)) { time_flag=2; } if(time_flag!=0 &&!(P2IN&BIT1)) { break; } } LCD_write_command(0x0c); //显示开,关光标,不闪烁 } /**************************************************** 显示时分秒 *****************************************************/ void display_HMS(unsigned char add,unsigned char date) { unsigned char shi,ge; shi=date/10; ge=date%10; LCD_write_command(add+0x80); LCD_write_data(0x30+shi); LCD_write_data(0x30+ge); } /**************************************************** LCD1602液晶初始化函数 *****************************************************/ 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_nms(50); LCD_write_command(0x30); delay_nms(50); LCD_write_command(0x30); delay_nms(5); LCD_write_command(0x30); delay_nms(500); } 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); 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_write_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 char 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=command<<4; //低四位移到高四位 LCD_en_write1(); LCD_DATA_PORT&=0x0f; //清高四位 LCD_DATA_PORT|=command&0xf0; //写低四位 LCD_en_write2(); } /************************************************** 写数据函数 ***************************************************/ 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=data<<4; //低四位移到高四位 LCD_en_write1(); LCD_DATA_PORT&=0X0f; //清高四位 LCD_DATA_PORT|=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=0~15,行y=0,1 ***************************************************/ void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) { LCD_set_xy( X, Y ); //写地址 while (*s) //写显示字符 { LCD_write_data( *s ); s++; } } /*************************************************** LCD在任意位置写字符,列x=0~15,行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"); } /****************************************************
上一篇:MSP430熔丝及加密总结
下一篇:MSP430G2553的时钟设置简析
推荐阅读最新更新时间:2024-11-12 09:23
设计资源 培训 开发板 精华推荐
- 工程人员安全黑匣子
- AM1G-2405DZ ±5V 1 瓦 DC-DC 转换器的典型应用
- 使用 Analog Devices 的 LT1305CS8 的参考设计
- 使用 Semtech 的 SC8863 的参考设计
- AM1/4S-2418SZ 18V 0.25 瓦 DC-DC 转换器的典型应用
- AD637-EVALZ,用于 AD637 RMS 至 DC 转换器的评估板
- AD8534ARUZ-REEL A 单电源、2 路有源分频器的典型应用
- 使用 Diodes Incorporated 的 PT8A 3515C 的参考设计
- DC425B,基于 LTC3440EMS 1 MHz 同步降压-升压的演示板,Vin = 2.5 至 5.5V,Vout = 3.3V @ 500mA
- MMA8652FC 3 轴、12 位、数字加速度计的典型应用