main.cpp

来自「MSP430上实现5110液晶显示程序(性价比很高的彩屏)」· C++ 代码 · 共 494 行

CPP
494
字号
#include <msp430x22x4.h>
#define CPU_F ((double)8000000) 
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define   sce1 P1OUT|=BIT0;  //片选
#define   sce0 P1OUT&=~BIT0;  //片选
#define   res1 P1OUT|=BIT1;  //复位,0复位
#define   res0 P1OUT&=~BIT1;
#define   dc1  P1OUT|=BIT2;  //1写数据,0写指令
#define   dc0  P1OUT&=~BIT2;
#define   sdin1 P1OUT|=BIT3;  //数据
#define   sdin0 P1OUT&=~BIT3;
#define   sclk1 P1OUT|=BIT4;  //时钟
#define   sclk0 P1OUT&=~BIT4;
unsigned char hour=12,min=0,sec=0,counter=0,tiaojiebiaozhi=1;
unsigned char dis_buf[6];
unsigned int a[6];
unsigned char zimu[]={
/*--  文字:  0  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,

/*--  文字:  1  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,

/*--  文字:  2  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00,

/*--  文字:  3  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,

/*--  文字:  4  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00,

/*--  文字:  5  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00,

/*--  文字:  6  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00,

/*--  文字:  7  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,

/*--  文字:  8  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,

/*--  文字:  9  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00,

/*--  文字:  :  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,

/*--  文字:     --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};
unsigned char fanxianzimu[]=
{
  /*--  文字:  0  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x07,0xFB,0xFB,0xFB,0x07,0xFF,0xFE,0xFD,0xFD,0xFD,0xFE,0xFF,

  /*--  文字:  1  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0xFF,0xF7,0x03,0xFF,0xFF,0xFF,0xFF,0xFD,0xFC,0xFD,0xFF,0xFF,

/*--  文字:  2  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0xE7,0x7B,0xBB,0xDB,0xE7,0xFF,0xFC,0xFD,0xFD,0xFD,0xFD,0xFF,

/*--  文字:  3  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0xF7,0xFB,0xDB,0xDB,0x27,0xFF,0xFE,0xFD,0xFD,0xFD,0xFE,0xFF,

/*--  文字:  4  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0xBF,0x4F,0x77,0x03,0x7F,0xFF,0xFF,0xFF,0xFF,0xFC,0xFD,0xFF,

/*--  文字:  5  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0xC3,0xDB,0xDB,0xDB,0x3B,0xFF,0xFE,0xFD,0xFD,0xFD,0xFE,0xFF,

/*--  文字:  6  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x07,0xDB,0xDB,0xD3,0x3F,0xFF,0xFE,0xFD,0xFD,0xFD,0xFE,0xFF,

/*--  文字:  7  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0xF3,0xFB,0x1B,0xE3,0xFB,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF,

/*--  文字:  8  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0x27,0xDB,0xDB,0xDB,0x27,0xFF,0xFE,0xFD,0xFD,0xFD,0xFE,0xFF,

/*--  文字:  9  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=6x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=6x16  --*/
0xC7,0xBB,0xBB,0xBB,0x07,0xFF,0xFF,0xFC,0xFD,0xFD,0xFE,0xFF,

};
unsigned char hanzi[]=
{
/*--  文字:  时  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=12x16  --*/
0xFE,0x22,0x22,0xFE,0x04,0x14,0x64,0x04,0xFF,0x04,0x04,0x00,0x03,0x01,0x01,0x03,
0x00,0x00,0x04,0x04,0x07,0x00,0x00,0x00,

/*--  文字:  间  --*/
/*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
/*--  高度不是8的倍数,现调整为:宽度x高度=12x16  --*/
0xFC,0x01,0x02,0xF8,0x29,0x29,0x29,0xF9,0x01,0xFF,0x00,0x00,0x07,0x00,0x00,0x01,
0x01,0x01,0x01,0x01,0x04,0x07,0x00,0x00,
};

/*--------------------------------------------
LCD_write_byte: 使用SPI接口写数据到LCD
输入参数:dt:写入的数据;
command :写数据/命令选择;
编写日期:20080918 
----------------------------------------------*/
void LCD_write_byte(unsigned char dt, unsigned char command)
{
	unsigned char i; 
	sce0;	
	if(command==1)
        {dc1;	}
        else {dc0;}
	for(i=0;i<8;i++)
	{ 
		if(dt&0x80)
                {sdin1;}
		else
                {sdin0;}
		dt=dt<<1;		
		sclk0; 		
		sclk1; 
	}	
	dc1;	
	sce1;	
	sdin1;
}
/*---------------------------------------
LCD_init: 3310LCD初始化
编写日期:20080918 
-----------------------------------------  */
void LCD_init(void)
{
	res0;  	
  	delay_ms(1);
  	res1;  
	LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令
	LCD_write_byte(0xd0,0);//设定液晶偏置电压
	LCD_write_byte(0x20,0);//使用基本指令
	LCD_write_byte(0x0C,0);//设定显示模式,正常显示
}
/*-------------------------------------------
LCD_set_XY: 设置LCD坐标函数
输入参数:X:0-83  Y:0-5
编写日期:20080918 
---------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
	LCD_write_byte(0x40 | Y, 0);// column
	LCD_write_byte(0x80 | X, 0);// row
} 
/*------------------------------------------
LCD_clear: LCD清屏函数
编写日期:20080918 
--------------------------------------------*/
void LCD_clear(void)
{
	unsigned char t;
	unsigned char k;
	LCD_set_XY(0,0);
	for(t=0;t<6;t++)
	{ 
		for(k=0;k<84;k++)
		{ 
			LCD_write_byte(0x00,1);
				
		} 
	}
}
/*---------------------------------------------
LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类
输入参数:c:显示的字符;
编写日期:20080918 
-----------------------------------------------*/
void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
{
	unsigned char i;  	
	
	LCD_set_XY(row*6, page);// 列,页 
	for(i=0; i<6;i++) 
	{
		LCD_write_byte(zimu[c*12+i],1); 
	}
	
    LCD_set_XY(row*6, page+1);// 列,页 
	for(i=6; i<12;i++) 
	{
		LCD_write_byte(zimu[c*12+i],1);
	}	 	
}

/*LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类
输入参数:c:显示的字符;
编写日期:20080918 
-----------------------------------------------*/
void LCD_write_fanxianshu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
{
	unsigned char i;  	
	
	LCD_set_XY(row*6, page);// 列,页 
	for(i=0; i<6;i++) 
	{
		LCD_write_byte(fanxianzimu[c*12+i],1); 
	}
	
    LCD_set_XY(row*6, page+1);// 列,页 
	for(i=6; i<12;i++) 
	{
		LCD_write_byte(fanxianzimu[c*12+i],1);
	}	 	
}
/*---------------------------------------------
LCD_write_hanzi: 显示12(宽)*16(高)点阵列汉字等半角类
输入参数:c:显示的字符;
编写日期:20080918 
-----------------------------------------------*/
void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
{
	unsigned char i;  	
	
	LCD_set_XY(row*6, page);// 列,页 
	for(i=0; i<12;i++) 
	{
		LCD_write_byte(hanzi[c*24+i],1); 
	}
	
    LCD_set_XY(row*6, page+1);// 列,页 
	for(i=12; i<24;i++) 
	{
		LCD_write_byte(hanzi[c*24+i],1);
	}	
}
void shijianjishuan()
{  
  if(counter==160)
  {
    counter=0;
    sec++; 
  if(sec==60) 
  {
    sec=0;
    min++;
    if(min==60)
    {
      min=0;
      hour++;
      if(hour==24)
        hour=0;
    }
  }
 }
 dis_buf[0] = hour / 10;  // 时十位
 dis_buf[1] = hour % 10;  // 时个位
 dis_buf[2] = min / 10;  // 分十位
 dis_buf[3] = min % 10;  // 分个位
 dis_buf[4] = sec / 10;  // 秒十位
 dis_buf[5] = sec % 10;  // 秒个位
}
void zhengchangxianshi()
{
  LCD_write_shu(6,2,dis_buf[0]);
  LCD_write_shu(7,2,dis_buf[1]);
  LCD_write_shu(9,2,dis_buf[2]);
  LCD_write_shu(10,2,dis_buf[3]);
  LCD_write_shu(12,2,dis_buf[4]);
  LCD_write_shu(13,2,dis_buf[5]);
}

void adjusthourdisplay()
{
  LCD_write_fanxianshu(6,2,dis_buf[0]);
  LCD_write_fanxianshu(7,2,dis_buf[1]);
  LCD_write_shu(9,2,dis_buf[2]);
  LCD_write_shu(10,2,dis_buf[3]);
  LCD_write_shu(12,2,dis_buf[4]);
  LCD_write_shu(13,2,dis_buf[5]);
}

void adjustmindisplay()
{
  LCD_write_shu(6,2,dis_buf[0]);
  LCD_write_shu(7,2,dis_buf[1]);
  LCD_write_fanxianshu(9,2,dis_buf[2]);
  LCD_write_fanxianshu(10,2,dis_buf[3]);
  LCD_write_shu(12,2,dis_buf[4]);
  LCD_write_shu(13,2,dis_buf[5]);
}

void adjustsecdisplay()
{
  LCD_write_shu(6,2,dis_buf[0]);
  LCD_write_shu(7,2,dis_buf[1]);
  LCD_write_shu(9,2,dis_buf[2]);
  LCD_write_shu(10,2,dis_buf[3]);
  LCD_write_fanxianshu(12,2,dis_buf[4]);
  LCD_write_fanxianshu(13,2,dis_buf[5]);
}

void panduanqueren()
{
  if(!(P3IN&BIT4))
        {
          delay_ms(10);
          if(!(P3IN&BIT4))
          {
            while(!(P3IN&BIT4));
            counter=0;
            adjusthourdisplay();
            if(!(P3IN&BIT6))
            {
               delay_ms(10);
                if(!(P3IN&BIT6))
                {
                  while(!(P3IN&BIT6));
                  hour++;
                  if(hour>23)
                    hour=23;
                }
            }
            if(!(P3IN&BIT7))
            {
               delay_ms(10);
                if(!(P3IN&BIT7))
                {
                  while(!(P3IN&BIT7));
                  hour--;
                  if(hour==0)
                    hour=0;
                }
            }
            if(!(P3IN&BIT5))
             {
              delay_ms(10);
              if(!(P3IN&BIT5))
                {
                  while(!(P3IN&BIT5));
                  adjustmindisplay();
                }
             }
              if(!(P3IN&BIT6))
            {
               delay_ms(10);
                if(!(P3IN&BIT6))
                {
                  while(!(P3IN&BIT6));
                  min++;
                  if(min>59)
                    min=59;
                }
            }
            if(!(P3IN&BIT7))
            {
               delay_ms(10);
                if(!(P3IN&BIT7))
                {
                  while(!(P3IN&BIT7));
                  min--;
                  if(min==0)
                    min=0;
                }
            }
            if(!(P3IN&BIT5))
             {
              delay_ms(10);
              if(!(P3IN&BIT5))
                {
                  while(!(P3IN&BIT5));
                  adjustsecdisplay();
                }
             }
             
                    if(!(P3IN&BIT6))
            {
               delay_ms(10);
                if(!(P3IN&BIT6))
                {
                  while(!(P3IN&BIT6));
                  min++;
                  if(sec>59)
                    sec=59;
                }
            }
            if(!(P3IN&BIT7))
            {
               delay_ms(10);
                if(!(P3IN&BIT7))
                {
                  while(!(P3IN&BIT7));
                  sec--;
                  if(sec==0)
                    sec=0;
                }
            }
            if(!(P3IN&BIT5))
             {
              delay_ms(10);
              if(!(P3IN&BIT5))
                {
                  while(!(P3IN&BIT4));
                  zhengchangxianshi();
                }
             }
          }
        }
}
       
void init()
{
        WDTCTL = WDTPW + WDTHOLD;
        DCOCTL=CALDCO_8MHZ;
        BCSCTL1=CALBC1_8MHZ;
        P1DIR=0XFF;
        P3REN|=BIT4+BIT5+BIT6+BIT7;
        P3OUT|=BIT4+BIT5+BIT6+BIT7;
        P3DIR&=~(BIT4+BIT5+BIT6+BIT7);
  	res0;
	delay_us(100);
	res1;	  	
  	LCD_init();  //初始化LCD模块 
	LCD_clear(); //清屏幕
	TACTL=TASSEL1+TACLR;                    //定时器A时钟源为SMCLK,并清TAR
        CCTL0 |=CCIE;                           //CCR0中断使能
        CCR0 =50000;                            //计数值为50000个SMCLK周期
        TACTL |=MC1;                            //启动定时器A为连续计数模式
        _EINT();
        LCD_write_hanzi(0,2,0);//时
        LCD_write_hanzi(2,2,1);//间
        LCD_write_shu(8,2,10);
        LCD_write_shu(11,2,10);
}

void main()
{	
        init();    
        while(1)
       {
        panduanqueren();
        shijianjishuan();
        zhengchangxianshi();
       }
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  counter++;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?