【TI 技术资料分享】msp430+12864串口显示

2019-07-30 16:17发布

本帖最后由 胡斯哲 于 2015-3-14 17:48 编辑

窜口可以节省i/o口 时钟不要太快
  1. #include  <msp430x14x.h>
  2. #include <math.h>
  3. //#include "pic.h"

  4. #define  LCD_CS_High   P5OUT|=BIT2   // LCD_RS      P62
  5. #define  LCD_CS_Low    P5OUT&=~BIT2   // LCD_RS

  6. #define  LCD_SID_High   P5OUT|=BIT1   // LCD_RW  DB0_DB7   P64
  7. #define  LCD_SID_Low    P5OUT&=~BIT1   // LCD_RW IR DR

  8. #define  LCD_CLK_High   P5OUT|=BIT0   // LCD_EN P63
  9. #define  LCD_CLK_Low    P5OUT&=~BIT0   // LCD_EN  

  10. #define LCD_PSB_High   P5OUT|=BIT3;  //  
  11. #define LCD_PSB_Low    P5OUT&=~BIT3;  //     P30

  12. //P67 鎮┖
  13. #define uchar unsigned char
  14. #define uint  unsigned int


  15. void delay_ms(unsigned int timer)
  16. {
  17.   unsigned int i;
  18.     for(i=0;i<1000;i--)
  19.        for(;timer>0;timer--)
  20.          ;
  21. }

  22. void Send_Byte(unsigned byte)
  23. {
  24.   uchar i;
  25.   for(i=0;i<8;i++)
  26.   {
  27.      LCD_CLK_Low;
  28.      if(byte&0x80)
  29.      {LCD_SID_High; delay_ms(10);}
  30.      
  31.      else
  32.      { LCD_SID_Low ;delay_ms(10);}
  33.      byte<<=1;
  34.      LCD_CLK_High;               
  35.      delay_ms(10);
  36.      LCD_CLK_Low;
  37.      delay_ms(10);
  38.    }
  39. }

  40. /*鍐欏懡浠ゅ埌娑叉櫠*/
  41. void LCD_WCMD(unsigned char cmd)
  42. {                          
  43.      delay_ms(1);

  44.      Send_Byte(0xf8);            //11111,RW(0),RS(0),0;
  45.      delay_ms(2);
  46.      Send_Byte(0xf0&cmd);      
  47.      delay_ms(2);
  48.      Send_Byte(0xf0&cmd<<4);   
  49.      delay_ms(2);
  50. }
  51. /*鍐欐暟鎹埌娑叉櫠*/
  52. void LCD_WDAT(unsigned char date)
  53. {                          
  54.      delay_ms(1);
  55.    
  56.      Send_Byte(0xfa);            //11111,RW(0),RS(1),0
  57.      delay_ms(2);
  58.      Send_Byte(0xf0&date);     
  59.      delay_ms(2);
  60.      Send_Byte(0xf0&date<<4);   
  61.      delay_ms(2);
  62. }

  63. uchar re_byte(void)
  64. {
  65.     uchar re=0,i;
  66.     P6DIR = 0x00;
  67.     for(i=0;i<8;i++)
  68.      {
  69.        LCD_CLK_Low;
  70.        delay_ms(10);
  71.        if(P6IN&0x10)
  72.       {
  73.         re = re| 0x01;
  74.         delay_ms(2);
  75.         re <<= 1;
  76.       }
  77.         else
  78.         {
  79.                 re = re| 0x00;
  80.                 delay_ms(2);
  81.                 re <<= 1;
  82.         }
  83.        LCD_CLK_High;                //上升沿触发发送
  84.        delay_ms(10);
  85.        LCD_CLK_Low;delay_ms(2);
  86.      }
  87.     return re;
  88. }
  89. unsigned char ReadByte(void)
  90. {
  91.     unsigned char byReturnValue,a ;
  92.     delay_ms(1);
  93.     Send_Byte(0xfe);            //11111,RW(1),RS(1),0
  94.     delay_ms(1);
  95.     byReturnValue=re_byte() ;
  96.     delay_ms(1);
  97.     a=re_byte()>>4;
  98.     byReturnValue = byReturnValue|a;
  99.     return byReturnValue ;
  100. }

  101. /*鏄剧ず鐨勫瓧绗︿覆*/
  102. void Display(unsigned char X,unsigned char Y,unsigned char *string)
  103. {

  104.    if (X==0)
  105.      {X=0x80;}
  106.    else if (X==1)
  107.      {X=0x90;}
  108.    else if (X==2)
  109.      {X=0x88;}
  110.    else if (X==3)
  111.      {X=0x98;}

  112.      LCD_WCMD(X+Y);
  113.    
  114.    while(*string )
  115.     {                         //鏄
  116.       LCD_WDAT(*string++);
  117.     }

  118. }
  119. void Display_number(unsigned char X,unsigned char Y,unsigned char number)
  120. {
  121.     if (X==0)
  122.      {X=0x80;}
  123.    else if (X==1)
  124.      {X=0x90;}
  125.    else if (X==2)
  126.      {X=0x88;}
  127.    else if (X==3)
  128.      {X=0x98;}

  129.      LCD_WCMD(X+Y);
  130.      LCD_WDAT(48+number);
  131. }

  132. void Clock_init()
  133. {
  134.    unsigned char t;
  135.    BCSCTL1 = RSEL0 + RSEL1 + RSEL2;         // XT2on, max RSEL
  136.    BCSCTL1&=~XT2OFF;                        //鎵撳紑XT2鎸崱鍣?
  137.    do
  138.    {
  139.       IFG1 &= ~OFIFG;                       // 娓呴櫎鎸崱鍣ㄥけ鏁堟爣蹇?
  140.       for (t = 255; t > 0; t--);            // 寤舵椂锛岀瓑寰匵T2璧锋尟
  141.    }
  142.    while ((IFG1 & OFIFG) != 0);             // 鍒ゆ柇XT2鏄惁璧锋尟
  143.    
  144.    BCSCTL2 |= SELS+SELM_2;                  // SMCLK = XT2
  145. }

  146. void LCD_init()
  147. {
  148.    LCD_WCMD(0x34);      //鎵嶄綔
  149.    delay_ms(2);
  150.    LCD_WCMD(0x30);      //嶄綔
  151.    delay_ms(2);
  152.    LCD_WCMD(0x0C);      //鏄叧鍏夋爣
  153.    delay_ms(2);
  154.    LCD_WCMD(0x01);      //
  155.    delay_ms(2);
  156.       
  157. }

  158. /*------------------------------------------------
  159.                       娓呭睆
  160. ------------------------------------------------*/
  161. void ClrScreen()
  162. {
  163.    LCD_WCMD(0x01);
  164.    delay_ms(15);
  165. }
  166. /*------------------------------------------------
  167.                  璁剧疆鍒扮粯鍥炬ā寮?
  168. ------------------------------------------------*/
  169. void SetGraphicMode()
  170. {
  171.    LCD_WCMD(0x36);       //閫夋嫨紡
  172.    delay_ms(20);

  173. }
  174. /*------------------------------------------------
  175.                    鏄剧ず鍥剧墖
  176. ------------------------------------------------*/
  177. void LCD_PutGraphic(unsigned char  *img)
  178. {
  179.    int i,j;

  180.    for(i=0;i<32;i++)            
  181.     {
  182.       LCD_WCMD(0x80 + i); //
  183.       LCD_WCMD(0x80);     //
  184.       for(j=0;j<16;j++)
  185.        {
  186.          LCD_WDAT(*img);
  187.          img++;
  188.        }
  189.     }

  190.         for(i=0;i<32;i++)            
  191.     {
  192.             LCD_WCMD(0x80 + i);
  193.             LCD_WCMD(0x88);     
  194.             for(j=0;j<16;j++)
  195.        {
  196.                        LCD_WDAT(*img);
  197.                        img++;
  198.        }
  199.     }  
  200.            
  201. }
  202. /*-------------------------------------------------------------------
  203.                                 澧炲姞鐢荤偣瀛愮▼搴?
  204. -------------------------------------------------------------------*/
  205. void DrawPoint(unsigned char X,unsigned char Y,unsigned char Color)
  206. {
  207.     unsigned char Row,Tier,Tier_bit ;
  208.     unsigned char ReadOldH,ReadOldL ;
  209.     LCD_WCMD(0x34);
  210.     LCD_WCMD(0x36);
  211.     Tier=X>>4 ;
  212.     Tier_bit=X&0x0f ;
  213.     if(Y<32)
  214.     {
  215.         Row=Y ;
  216.     }
  217.     else
  218.     {
  219.         Row=Y-32 ;
  220.         Tier+=8 ;
  221.     }
  222.     LCD_WCMD(Row+0x80);
  223.     LCD_WCMD(Tier+0x80);
  224.     ReadByte();
  225.     ReadOldH=ReadByte();
  226.     ReadOldL=ReadByte();
  227.     LCD_WCMD(Row+0x80);
  228.     LCD_WCMD(Tier+0x80);
  229.     if(Tier_bit<8)
  230.     {
  231.         switch(Color)
  232.         {
  233.             case 0 :
  234.             ReadOldH&=(~(0x01<<(7-Tier_bit)));
  235.             break ;
  236.             case 1 :
  237.             ReadOldH|=(0x01<<(7-Tier_bit));
  238.             break ;
  239.             case 2 :
  240.             ReadOldH^=(0x01<<(7-Tier_bit));
  241.             break ;
  242.             default :
  243.             break ;
  244.         }
  245.         LCD_WDAT(ReadOldH);
  246.         LCD_WDAT(ReadOldL);
  247.     }
  248.     else
  249.     {
  250.         switch(Color)
  251.         {
  252.             case 0 :
  253.             ReadOldL&=(~(0x01<<(15-Tier_bit)));
  254.             break ;
  255.             case 1 :
  256.             ReadOldL|=(0x01<<(15-Tier_bit));
  257.             break ;
  258.             case 2 :
  259.             ReadOldL^=(0x01<<(15-Tier_bit));
  260.             break ;
  261.             default :
  262.             break ;
  263.         }
  264.         LCD_WDAT(ReadOldH);
  265.         LCD_WDAT(ReadOldL);
  266.     }
  267.     LCD_WCMD(0x30);
  268. }

  269. //----------------------------------------------
  270. //                        娓呮暣涓狦DRAM绌洪棿
  271. //-----------------------------------------------
  272. void clrgdram()
  273. {
  274.     unsigned char x,y ;
  275.     for(y=0;y<64;y++)
  276.     for(x=0;x<16;x++)
  277.     {
  278.         LCD_WCMD(0x34);
  279.         LCD_WCMD(y+0x80);
  280.         //琛屽湴鍧€
  281.         LCD_WCMD(x+0x80);
  282.         //鍒楀湴鍧€
  283.         LCD_WCMD(0x30);
  284.         LCD_WDAT(0x00);
  285.         LCD_WDAT(0x00);
  286.     }
  287. }
  288. void  main( void )
  289. {
  290. //char i;
  291. //unsigned char x1,y1,colour=1 ;
  292.   WDTCTL = WDTPW + WDTHOLD;     // Stop watchdog timer to prevent time out reset
  293.   Clock_init();                 //

  294.   P5DIR=BIT0+BIT1+BIT2+BIT3;
  295.   LCD_PSB_Low;               
  296.   LCD_init();
  297. /*-----------------------------------------------------------------------------
  298.                               鏄剧ず瀛楃
  299. -----------------------------------------------------------------------------*/
  300.   Display(0,0,"胡斯哲");
  301.   Display(1,0,"武汉交通职业学院");
  302.   Display(2,1,"你好");
  303.   Display(3,2,"2013-7月-11日");      
  304.   

  305.   delay_ms(5000);
  306.   _BIS_SR(LPM0_bits);

  307. }
复制代码
0条回答

一周热门 更多>