历史上的今天
今天是:2024年10月21日(星期一)
2019年10月21日 | MSP430 Launchpad串行/并行12864显示
2019-10-21 来源:eefocus
#include "msp430g2553.h"
#define uint unsigned int
#define uchar unsigned char
/*****************************************
RS--->>P2.0
RW--->>P2.1
E---->>P2.2
PSB-->>P2.3
PAUSE>>P2.4
RES-->>P2.5
******************************************/
#define DataPort P1OUT //MCU P2<------> LCM
/*
void DelayMs(uint x)
{
uint a,b;
for(a=0;a } */ void DelayUs2x(unsigned char t) { while(--t); } void DelayMs(unsigned char t) { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } void DelayUs(uint x) { uint a,b; for(a=0;a } //检测忙位 void Check_Busy() { P2OUT&=0xFE; //RS=0 P2OUT |=0x02; //RW=1 P2OUT |=0x04; //E=1 DataPort=0xFF; // P1DIR=0x00; //数据端口设为输入状态 while((P2IN&0x80)==0x80);//忙则等待 P1DIR=0xFF; //数据端口还原为输出状态 P2OUT&=0xFB; } /*---------------------写命令------------------------*/ void Write_Cmd(unsigned char Cmd) { Check_Busy(); P2OUT&=0xFE; //RS=0; P2OUT&=0xFD; //RW=0; P2OUT |=0x04; //E=1; DataPort=Cmd; DelayUs(5); P2OUT&=0xFB; //E=0; DelayUs(5); } /*------------------------------------------------ 写数据 ------------------------------------------------*/ void Write_Data(unsigned char Data) { Check_Busy(); P2OUT |=0x01; //RS=1; P2OUT&=0xFD; //RW=0; P2OUT |=0x04; //E=1; DataPort=Data; DelayUs(5); P2OUT&=0xFB; //E=0; DelayUs(5); } void Init_ST7920() { DelayMs(40); //大于40MS的延时程序 P2OUT |=0x08; //PSB=1; 设置为8BIT并口工作模式 DelayMs(1); //延时 P2OUT&=0xDF; //RES=0; 复位 DelayMs(1); //延时 P2OUT |=0x20; //RES=1; 复位置高 DelayMs(10); Write_Cmd(0x30); //选择基本指令集 DelayUs(50); //延时大于100us Write_Cmd(0x30); //选择8bit数据流 DelayUs(20); //延时大于37us Write_Cmd(0x0c); //开显示(无游标、不反白) DelayUs(50); //延时大于100us Write_Cmd(0x01); //清除显示,并且设定地址指针为00H DelayMs(15); //延时大于10ms Write_Cmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动 DelayUs(50); //延时大于100us } /*------------------------------------------------ 显示字符串 x:横坐标值,范围0~8 y:纵坐标值,范围1~4 ------------------------------------------------*/ void LCD_PutString(unsigned char x,unsigned char y,char *s) { switch(y) { case 1: Write_Cmd(0x80+x);break; case 2: Write_Cmd(0x90+x);break; case 3: Write_Cmd(0x88+x);break; case 4: Write_Cmd(0x98+x);break; default:break; } while(*s>0) { Write_Data(*s); s++; DelayUs(100); // } } int main(void) { char* string1="12864LCD Demo"; char* string2="Demo for Msp430"; char* string3="Launch pad G2553"; char* string4="电控》微电》哈哈》"; WDTCTL = WDTPW + WDTHOLD;//关闭看门狗 P1DIR=0xFF;//配置P1为输出,作为数据端口 P2DIR=0xFF;//配置P2为输出,作为控制端口 Init_ST7920(); while(1) { LCD_PutString(0,1,string1); DelayUs(20); LCD_PutString(0,2,string2); DelayUs(20); LCD_PutString(0,3,string3); DelayUs(20); LCD_PutString(0,4,string4); DelayUs(20); } } /******************************** 上边是并行,下边是串行 *******************************/ #include "msp430g2553.h" #define CS1 P1OUT |=0x01 #define CS0 P1OUT &=0x01 #define SID1 P1OUT |=0x02 #define SID0 P1OUT &=~0x02 #define SCLK1 P1OUT |=0x04 #define SCLK0 P1OUT &=~0x04 void DelayUs2x(unsigned char t) { while(--t); } void delay_1ms(unsigned char t) { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } void sendbyte(unsigned char zdata) { unsigned int i; for(i=0; i<8; i++) { if((zdata << i) & 0x80) { SID1; } else { SID0; } SCLK0; SCLK1; } } void write_com(unsigned char cmdcode) { CS1; sendbyte(0xf8); //1 1 1 1 RS RW 0 写操作RW=0 11111000写数据 11111010写指令 sendbyte(cmdcode & 0xf0); sendbyte((cmdcode << 4) & 0xf0); delay_1ms(1); CS0; } void write_data(unsigned char Dispdata) { CS1; sendbyte(0xfa); sendbyte(Dispdata & 0xf0); sendbyte((Dispdata << 4) & 0xf0); delay_1ms(1); CS0; } void Put_String(unsigned int x,unsigned int y,unsigned char* s) { switch(y) { case 1: write_com(0x80+x);break; case 2: write_com(0x90+x);break; case 3: write_com(0x88+x);break; case 4: write_com(0x98+x);break; default:break; } while(*s>0) { write_data(*s); s++; DelayUs2x(50); } } void lcdinit() { delay_1ms(200); write_com(0x30); //功能设定:基本指令集 delay_1ms(20); write_com(0x0c); //显示状态:整体显示,游标关 delay_1ms(20); write_com(0x01); //清空显示 delay_1ms(200); } int main( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 P1DIR=0xFF; P1OUT=0x00; lcdinit(); while(1) { Put_String(1,1,"speed"); } }
史海拾趣
|
几天前帮同学课程设计写的那个数字钟(51单片机简洁版汇编数字钟),由于时间紧,随便搞了两下。那个程序不怎么好,用两个按钮分别调时调分,而且只能增加,不小心按到按钮便调动了时间,不能用于实际产品。恰巧我自己的单片机课程设计题目是“自动 ...… 查看全部问答> |
|
示波器数字示波器一直是工程师设计、调试产品的好帮手。但随着计算机、半导体和通信技术的发展,电路系统的信号时钟速度越来越快,信号上升时间也越来越短,导致因底层模拟信号完整性问题引发的数字错误日益突出。针对这些新的测试挑战,示波器供应 ...… 查看全部问答> |
|
为什么我有的外部中断能唤醒,有的却不能呢?? 还想问一下是不是有一个专门的寄存器能设置只允许某些外部中断可以唤醒系统?? 看了三星的datasheet,貌似是不用设置任何一个EINT都能唤醒系统,但我的系统却不是这样。 谢谢… 查看全部问答> |
|
老师让做个多点温度检测通过RS232协议传给上位机。就剩下最关键18B20的通过读64位ROM中的48位序列号来确定具体的那个18B20了。我想尽快结项啊啊啊啊!! 哪位大侠能出来指点一二,给个参考代码更是感激不尽,毫无头绪中…………………………代码啊 ...… 查看全部问答> |
|
我非常理解您在这里四年的感情,我不如您的资历深,但是我觉得在过去的两年多里我从一个巨菜的菜鸟,到一个对嵌入式有一些了解的程序员,十分的感谢eeworld,我希望这永远是技术的天堂,删除您投诉的贴子,只是想告诉您,如果想投诉请到申诉区,那 ...… 查看全部问答> |
|
一个RS232一个RS485接口,都是用来做什么收发器,电平逻辑转化的,但这些都是纯理论上的作用,我只想知道他们实际中能干什么,不要有太多专业术语,还有这2个有什么区别?… 查看全部问答> |




